多功能万年历_范文大全

多功能万年历

【范文精选】多功能万年历

【范文大全】多功能万年历

【专家解析】多功能万年历

【优秀范文】多功能万年历

范文一:多功能万年历 投稿:段朋朌

/******************************************/

/*工程项目:多功能万年历 */

/*研究地点:河南机电高等专科学校 */

/*系别专业:电子通信工程系 应用电子专业 */

/*研究人员:王文克 */

/*作业时间:2012年10月3日 */

/******************************************/

#include

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit IO=P1^0; /*定义DS1302和LCD控制端口号*/

sbit SCLK=P1^1;

sbit RST=P1^2;

sbit RS=P2^0;

sbit EN=P2^2;

sbit RW=P2^1;

sbit DS1820_DQ=P2^3;

int temperature[2];

uint temp1,temp2,temp3;

uchar *WEEK[]={"MON","TUE","WED","THU","FRI","SAT","SUN"}; /*星期数组*/ uchar LCD_DSY_BUFFER1[]={"2000-00-00 "}; /*日期时间初始化*/

uchar LCD_DSY_BUFFER2[]={"00:00:00 'C"};

uchar DateTime[7];

/***************************************************************************** 函数功能:延时函数DelayMS()

入口参数:ms

出口参数:

*****************************************************************************/ void DelayMS(uint ms)

{

unsigned char i;

while(ms--)

{

for(i = 0;i< 120;i++);

}

}

bit DS1820_Reset()

{ uchar i;

bit flag;

DS1820_DQ= 0;

for(i=240;i>0;i--);

DS1820_DQ = 1;

for(i=40;i>0;i--);

flag=DS1820_DQ;

for(i=200;i>0;i--);

return(flag);

}

void DS1820_WriteData(uchar wData)

{ uchar i,j;

for(i=8;i>0;i--)

{

DS1820_DQ=0;

for(j=2;j>0;j--);

DS1820_DQ=wData&0x01;

for(j=30;j>0;j--);

DS1820_DQ=1;

wData>>=1;

}

}

uchar DS1820_ReadData()

{

uchar i,j,TmepData;

for(i=8;i>0;i--)

{

TmepData>>=1;

DS1820_DQ=0;

for(j=2;j>0;j--);

DS1820_DQ=1;

for(j=4;j>0;j--);

if(DS1820_DQ==1)

{TmepData|=0x80;}

for(j=30;j>0;j--);

DS1820_DQ=1;

}

return(TmepData);

}

/***************************************************************************** 函数功能:往时钟模块DS1302写数据

入口参数:x

出口参数:

*****************************************************************************/ void Write_A_Byte_TO_DS1302(uchar x)

{

uchar i;

for(i=0;i<8;i++)

{

IO=x&0x01;SCLK=1;SCLK=0;x>>=1;

}

}

/***************************************************************************** 函数功能:从时钟模块DS1302读取数据

入口参数:

出口参数:十进制数

*****************************************************************************/ uchar Get_A_Byte_FROM_DS1302()

{

uchar i,b=0x00;

for(i=0;i<8;i++)

{

b|=_crol_((uchar)IO,i);

SCLK=1;

SCLK=0;

}

return b/16*10+b%16;

}

/***************************************************************************** 函数功能:从时钟模块DS1302读取日期时间

入口参数:addr

出口参数:dat

*****************************************************************************/ uchar Read_Data(uchar addr)

{

uchar dat;

RST=0;

SCLK=0;

RST=1;

Write_A_Byte_TO_DS1302(addr);

dat=Get_A_Byte_FROM_DS1302();

SCLK=1;RST=0;

return dat;

}

/***************************************************************************** 函数功能:得到日期时间写入DateTime[7]数组

入口参数:

出口参数:

*****************************************************************************/ void GetTime()

{

uchar i,addr=0x81;

for(i=0;i<7;i++)

{

DateTime[i]=Read_Data(addr);

addr+=2;

}

}

/***************************************************************************** 函数功能:读LCD的状态

入口参数:

出口参数:

*****************************************************************************/ uchar Read_LCD_State()

{

uchar state;

RS=0;

RW=1;

EN=1;

DelayMS(1);

state=P0;

EN=0;

DelayMS(1);

return state;

}

/***************************************************************************** 函数功能:测试LCD忙碌状态

入口参数:

出口参数:result

*****************************************************************************/ void LCD_Busy_Wait()

{

while((Read_LCD_State()&0x08)==0x80);

DelayMS(5);

}

/***************************************************************************** 函数功能:写数据到LCD子程序

入口参数:cmd

出口参数:

*****************************************************************************/ void Write_LCD_Data(uchar dat)

{

LCD_Busy_Wait();

RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;

}

/***************************************************************************** 函数功能:写指令到LCD子程序

入口参数:

出口参数:

*****************************************************************************/ void Write_LCD_Command(uchar cmd)

{

LCD_Busy_Wait();

RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;

}

/***************************************************************************** 函数功能:设定显示位置子程序

入口参数:pos

出口参数:

*****************************************************************************/ void Set_LCD_POS(unsigned char p)

{

Write_LCD_Command(p|0x80);

}

/***************************************************************************** 函数功能:写入显示数据到LCD子程序

入口参数:dat

出口参数:

*****************************************************************************/ void Display_LCD_String(uchar p,uchar *s)

{

uchar i;

Set_LCD_POS(p);

for(i=0;i<16;i++)

{

Write_LCD_Data(s[i]);

DelayMS(1);

}

}

/***************************************************************************** 函数功能:LCD初始化子程序

入口参数:

出口参数:

*****************************************************************************/ void Init_LCD()

{

Write_LCD_Command(0x38);

DelayMS(1);

Write_LCD_Command(0x01);

DelayMS(1);

Write_LCD_Command(0x06);

Write_LCD_Command(0x0c);

DelayMS(1);

}

/***************************************************************************** 函数功能:把日期时间写入 LCD_DSY_BUFFER数组

入口参数:d,a

出口参数:

*****************************************************************************/ void Format_DateTime(uchar d,uchar *a)

{

a[0]=d/10+'0';

a[1]=d%10+'0';

}

void main()

{

uchar temp_data, temp_data_2;

uchar i,flag;

Init_LCD();

while(1)

{

DS1820_Reset();

DS1820_WriteData(0xcc);

DS1820_WriteData(0x44);

DS1820_Reset();

DS1820_WriteData(0xcc);

DS1820_WriteData(0xbe);

for (i=0;i<2;i++)

{

temperature[i]=DS1820_ReadData();

}

DS1820_Reset();

if(temperature[1]&0xfc)

{

flag=1;

temp_data=((temperature[1]<<8)|temperature[0]);

temp_data=((~temp_data)+1);

temp_data*=0.0625;

}

else

{

flag=0;

temp_data=((temperature[1]<<8)|temperature[0])*0.0625;

}

{

LCD_DSY_BUFFER2[10]='-';

}

else

{

LCD_DSY_BUFFER2[10]=' ';

}

temp1=temp_data/100+0x30;

temp2=(temp_data%100)/10+0x30;

temp3=(temp_data%100)%10+0x30;

LCD_DSY_BUFFER2[11]=temp1;

LCD_DSY_BUFFER2[12]=temp2;

LCD_DSY_BUFFER2[13]=temp3;

GetTime();

Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+2); Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+5); Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+8); strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[3]]); Format_DateTime(DateTime[2],LCD_DSY_BUFFER2); Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+3); Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+6); Display_LCD_String(0x00,LCD_DSY_BUFFER1); Display_LCD_String(0x40,LCD_DSY_BUFFER2); }

}

范文二:多功能万年历 投稿:郭顨顩

第四届“挑战杯”广西大学生课外学术科技作品竞赛

作品申报书

作品名称: 多功能电子万年历

学校全称: 广西交通职业技术学院

申报者姓名

(集体名称): 黄荣雀

类别:

□自然科学类学术论文 □哲学社会科学类社会调查报告和学术论文 □科技发明制作A类 ■科技发明制作B类

A1.申报者情况(个人项目)

B3.申报作品情况(科技发明制作类)

说明:1.必须由申报者本人填写;

2.本表中的学校组织协调机构意见视为对申报者所填内容的确认,并承担相应连带责任;

3.本表必须附有研究报告,并提供图表、曲线、实验数据.原理结构、外观图(照片),也可附鉴定证书和应用证书;

4.作品分类请按发明点或创新点类别填报,分类错误或分类不清视为无效作品。

范文三:万年历(c语言,多功能) 投稿:史醢醣

#include "time.h" /*包含的头文件*/ #include "stdio.h" #include "math.h" #include "windows.h" #include "conio.h"

#define KEYNUMUp 0x48 /*宏定义*/ #define KEYNUMDown 0x50 #define KEYNUMLeft 0x4b #define KEYNUMRight 0x4d

int eachyeartotal(int year,int month,int day); int counterdays(int year,int month,int day); int nowtime(int year,int month,int day); int week(int year,int month,int day); int maxDay(int year,int month); int isleap(int year);

void whatweek(int year,int month,int day); void display(int year ,int month); void display2(int year,int month);

void display3(int year,int month,int day) ; void setDay1(int year,int month,int day); void setDay2(int year,int month,int day); void setDay3(int year,int month,int day); void jieri(int month,int day); void display1(int day); void getmenu();

void main() {

int year,month,day,select; while(1) {

getmenu();

printf(" 请输入相应数字:"); scanf("%d",&select); system("cls"); switch(select) {

case 1: 查询*/

printf(" 日期查询:输入天数(如5):");

/*函数声明*/ /*主函数*/ /*菜单选择 */ /*当选择为1时显示日期

scanf("%d",&day);

if(day>0&&day<10000) /*日期选择从0-10000 */ { display1(day);

printf(" 提示 按任意键:返回菜单\n\n"); setDay2( year,month, day); } else

system("cls");

printf(" 输入无效,重新输入!\n"); break;

case 2: /*当选择为2显示月历*/ printf(" 月历查询:输入年月(如2011,6):"); scanf("%d,%d",&year,&month);

if(year>0&&year<10000&&month>=1&&month<=12) {

display2(year,month);

printf(" 提示 按←:上个月 按→:下个月 按其他键:返回菜单\n\n");

setDay2( year,month, day); } else

system("cls");

printf(" 输入无效,重新输入!\n"); break;

case 3: /*当选择为3时显示日历*/ printf(" 日期显示:输入年月日(比如2011,6,23):"); scanf("%d,%d,%d",&year,&month,&day);

if(year>0&&year<10000&&month>=1&&month<=12&&day>=1&&day<=maxDay(year,month)) {

display3(year,month,day);

printf(" 提示 按↑:前一天 按↓:后一天 按其他键:返回菜单\n\n");

setDay3( year,month, day); } else

system("cls");

printf(" 输入无效,重新输入!\n"); break; case 4:

printf("\n\n\n\n\n\n\n\n\n\n"); printf("

*******************************************\n\n"); printf(" * 感谢使用本万年历工具 *\n\n");

printf(" * 制作人:赵凯 *\n\n"); printf("

*******************************************\n\n"); printf("\n\n\n\n\n\n\n\n"); exit(0);

default: /*当输入其他数字时,输入无效,重新输入*/ system("cls");

printf(" 输入无效,重新输入!\n"); } } }

int isleap(int year) /*判断是否为闰年*/ {

if(year%4==0&&year%100!=0||year%400==0) return 1; else return 0; }

int maxDay(int year,int month) /*每月的天数*/ {

int a[]={31,28,31,30,31,30,31,31,30,31,30,31}; /*每个月中的天数*/ if(isleap( year))

a[1]=29; /*闰年2月份有29天*/ return a[month-1]; }

int eachyeartotal(int year,int month,int day) /*判断某天是一年中的第几天*/ {

int i,sum=0;

for(i=1;i

return sum; }

int week(int year,int month,int day) /*对天数进行判断确定是星期几*/ {

int number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400 +eachyeartotal(year,month,day); number=number%7 ; return number; }

void display(int year ,int month) /*输出年月*/ {

int max,number,i,j=1;

max=maxDay(year,month); number=week(year,month,1);

printf(" %4s %4s %4s %4s %4s %4s %4s\n","Sun","Mon","Tue","Wed", "Thu","Fri","sat");

for(i=0;i

printf(" "); /*1号前的星期补空格*/ while(j<=max) {

printf("%6d",j); if (i%7==6)

printf("\n"); /* 每7格换一行*/ i++; j++; }

printf("\n\n"); }

void display1(int day) /*输出年历*/ { struct tm when; time_t now, result;

char *a;

time( &now );

when = *localtime( &now ); printf("\n");

printf( "现在时间是 %s\n", asctime( &when ) );

printf( "查询距离时间是: " );

when.tm_mday = when.tm_mday + day;

if( (result = mktime( &when )) != (time_t)-1 ) { a=asctime( &when ); printf( " %d天后时间是 %s\n", day, a); } else

perror( "mktime failed" ); }

void display2(int year,int month) {

printf("\n%d 年 %d 月\n ",year,month); display(year,month); }

void display3(int year,int month,int day) {

whatweek( year,month,day); jieri(month,day);

counterdays(year,month, day); }

int counterdays(int year,int month,int day) {

int year1, days0,days1,month1,days, day1; time_t timep; struct tm *p; time(&timep);

p=gmtime(&timep);

year1=(1900+p->tm_year) ; month1=(1+p->tm_mon) ;

day1=(p->tm_mday); day1分别为年、月、日*/

/*输出月历*/ /*输出日历*/ /*判断今天距特定日期的天数*/ /*获取系统时间year1、month1、

days0=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day);

days1=(year1-1)*365+(year1-1)/4-(year1-1)/100+(year1-1)/400+eachyeartotal(year1,month1,day1);

days=days0-days1; /*计算出两个日期之间的时间差*/ printf("\n 今天距%d年%d月%d日还有%d天\n\n",year,month,day,days); return days; }

void whatweek(int year,int month,int day) /*判断是星期几*/ {

int number;

number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day);

number=number%7 ; switch( number) {

case 0:

printf( "\n %d年%d月%d日是星期日",year,month,day);break; case 1:

printf( "\n %d年%d月%d日是星期一",year,month,day);break; case 2:

printf( "\n %d年%d月%d日是星期二",year,month,day);break; case 3:

printf( "\n %d年%d月%d日是星期三",year,month,day);break; case 4:

printf( "\n %d年%d月%d日是星期四",year,month,day);break; case 5:

printf( "\n %d年%d月%d日是星期五",year,month,day);break; case 6:

printf( "\n %d年%d月%d日是星期六",year,month,day);break; default:

system("cls");

printf(" 出现错误!\n" ); } }

void jieri(int month,int day) /*判断是否公历节日*/ {

if(month==1) switch(day) {

case 1:

printf(",这天是元旦"); }

if(month==2) switch(day) {

case 14:

printf(",这天是情人节"); }

if(month==3) switch(day) {

case 8:

printf(",这天是妇女节"); break; case 12:

printf(",这天是植树节"); }

if(month==4) switch(day) {

case 1:

printf(",这天是愚人节"); }

if(month==5) switch(day) {

case 1:

printf(",这天是劳动节"); break; case 4:

printf(",这天是青年节"); }

if(month==6) switch(day) {

case 1:

printf(",这天是儿童节"); }

if(month==7) switch(day)

{

case 1:

printf(",这天是建党节"); }

if(month==8) switch(day) {

case 1:

printf(",这天是建军节"); break; case 23: printf(",今天是我的生日"); }

if(month==9) switch(day) {

case 10:

printf(",这天是教师节"); }

if(month==10) switch(day) {

case 1:

printf(",这天是国庆节"); } if(month==12) switch(day) { case 24: printf(",今天是平安夜"); break; case 25: printf(",今天是圣诞节"); } }

void setDay1(int day) /*通过键盘返回主菜单*/ { char k; getch(); k=getch();

system("cls"); }

void setDay2(int year,int month,int day) /*通过键盘"←""→"控制月历的变换*/ {

char k; getch(); k=getch(); switch(k) {

case KEYNUMLeft: if(month<2) {

month+=12; year--; }

if(year<1) { system("cls");

printf(" 警告!超出范围!\n"); break; }

month--;

display2(year , month); setDay2(year,month,day); break;

case KEYNUMRight:/*"→"月份变小*/ if(month>11) {

month-=12; year++; }

if(year<9999); month++;

display2(year , month); setDay2(year,month,day); break; default:

system("cls"); ;

/*"←"月份变小*/

} }

void setDay3(int year,int month,int day) /*通过键盘"↑""↓"控制日期的变换*/ {

char k; getch(); k=getch(); switch(k) {

case KEYNUMUp : /*"↑"日期变小*/ if(day<2) {

month--;

day=maxDay(year,month); }

if(month<1) {

month+=12; year--; }

if(year<1) {

system("cls");

printf(" 警告!超出范围!\n"); break; }

day--;

display3(year , month,day); setDay3(year,month,day); break;

case KEYNUMDown: /*"↓"日期变大*/ day++;

if(day>maxDay(year,month)) {

day=1; month++; }

if(month>12)

{

month-=12;

year++;

}

if(year<10000);

display3(year , month,day);

setDay3(year,month,day);

break;

default:

system("cls");

;

}

}

void getmenu() /* 显示菜单选择*/

{ struct tm when;

time_t now, result;

int days;

time( &now );

when = *localtime( &now );

printf(" ***************主菜单

***************\n\n");

printf(" * 欢迎进入万年历系统 *\n\n");

printf(" * 现在时间是 *\n\n");

printf(" %s \n",asctime( &when ) );

printf(" * 1、日期查询 *\n\n");

printf(" * 2、月历查询 *\n\n");

printf(" * 3、日历查询 *\n\n");

printf(" * 4、退出系统 *\n\n");

printf("

************************************\n\n");

}

范文四:多功能电子万年历的设计与实现 投稿:吕禪禫

摘要:多功能电子万年历在公共场所和日常生活中使用非常普遍,同时也是单片机课程教学的典型工作任务。其主要由硬件系统和软件系统组成,硬件系统主要包括单片机最小系统,时间采集模块,温度采集模块,指令输入模块,信息显示模块5个模块组成。软件系统使用C51编程语言进行程序设计,编写DS1302时间采集函数,DS18B20温度采集函数,按键扫描函数,信息显示函数以及最后集成的主函数。单片机通过程序控制实现从DS1302中提取年、月、日、星期、时、分、秒等信息,从DS18B20采集温度值的数字量,再把这些信息通过数码管输出显示。

  关键词:多功能万年历 单片机 时钟芯片 温度传感器 数码管显示

  中图分类号:TP368.12 文献标识码:A 文章编号:1007-9416(2013)12-0159-01

  随着经济社会的不断进步,多功能电子万年历已经成为人们工作生活中不可缺少电子产品之一,它为人们提供当前的日期、时间、温度、湿度等信息,广泛使用在学校、医院、火车站、港口等公共场所。但通过我们对市场上的电子万年历深入分析发现它们都存在一些不足之处,例如:时间计时不准,每月的天数需手动调整,不能显示温度、湿度信息,可扩展性不强等,这些都为用户的使用产生了不便。为此,本文设计了一种时间计时准确,显示信息全备,性价比高的多功能电子万年历。

  1 计时方案分析

  在设计之初首先要考虑的问题就是采用何种方式进行时间计时,这其中要考虑时间计时是否精准,元器件价格是否便宜,硬件设计是否简单,驱动程序编写是否容易。

  在现阶段的市场中,有一些专用的时钟芯片,它们可以精确地计时时间,并且可以按照进制依次向日期信息进位,而且此类芯片的接口协议逐步趋于标准,操作起来有固定的模板可以借鉴,DS1302就是一款性价比高,时间计时精准,芯片体积小功耗低,日期自动带有调整补偿功能,可以持续计时的时钟芯片。DS1302采用串行接口与单片机进行数据传输,其控制引脚有三根,分别是SCLK、I/O、RST,通过这三根引脚的时序配合逐位进行数据的读与写,可以将时间与日期信息传输给单片机,继而通过数码管显示。

  2 多功能电子万年历系统概述

  本设计所介绍的多功能电子万年历数字化率高,操作简单,其主要特点是:核心控制芯片采用市场占有率高的51单片机;时间信息由美国DALLAS公司生产的DS1302芯片生成,其芯片体积小,功耗低,接口协议通用,采用备用电源可以持续计时;温度信息同样由美国DALLAS公司生产的DS18B20芯片生成,其由3个引脚组成,硬件设计简单,直接生成数字量;人机接口由三个按键来实现,分别为功能键、加键、减键,用这三个按键对时间、日期调整。电源问题,可以采用开关电源供电,直接给芯片及外围设备提供5V直流电,也可以采用生活中比较常见的USB口供电。

  3 硬件电路设计

  时间采集电路:DS1302时钟芯片的封装是DIP8,配套电路还要有电源、地、外接32.768KHz晶振电路,如果要持续计时就要外接电池。其内部主要包括时间和日历7个信息寄存器,传输数据信息主要通过SCLK、I/O、RST三个引脚时序配合读写信息,而AT89S51没有专用的接口,所以只能通过三个IO口与这三个引脚相连,通过编程模拟时序变化。

  按键及温度采集电路:按键采用微动开关,与单片机IO口连接时接1KΩ—10KΩ上拉电阻,另一端接地,这样当按键按下时输入为0,不按下时输入为1;DS18B20为三引脚封装,其中两边引脚分别接电源和地,中间引脚同样通过一个1KΩ—10KΩ上拉电阻接到单片机上的某一个IO口。

  显示电路:由于显示的信息较多,且每个信息都相互独立,要使用多个两位一体或四位一体数码管,并根据使用场合选择不同尺寸大小的数码管。

  4 软件程序设计

  由于使用了时钟芯片DS1302、温度传感器DS18B20,单片机内部程序要控制IO口电平变化依据传输协议从DS1302各个寄存器读取时间和日期数据,从DS18B20中读出温度数据,再将它们放入显示缓冲单元中。显示程序模块只需从显示缓冲单元中取出数来并显示。在开机初始化程序中,要对DS1302和DS18B20进行初始化设置,同时还要启动计时开始。采集来的各项数据都要进行数制的转换与整理才能放入显示缓冲单元中。系统程序流程图如图1所示。

  5 结语

  本设计硬件电路原理简单,所用的元器件大部分都为数字芯片,如果都采用贴片元器件可以将电路板制作的非常小,大大节约了制作成本。软件编程方面,可以将对各种外围设备的驱动编写成函数模块,既可以是程序思路更加清晰,也便于后期的功能扩展。此万年历可以普遍应用于学校、医院、车站等公共场所,根据使用场合的不同可以选择不同颜色、大小的数码管,并能增加湿度采集或语音播报等功能,具有广泛的社会应用领域。

  参考文献

  [1]刘春燕,晁勤,袁铁江,魏丽丽.多功能数字万年历的设计[J].自动化应用,2013,1.

  [2]莫玉华.基于实时钟芯片的万年历设计[J].电子世界,2013,14.

  [3]王静霞.单片机应用技术(C语言版)[M].北京:电子工业出版社,2011.

范文五:基于ATC89C54的多功能电子万年历设计 投稿:吕坊坋

基于ATC89C54的多功能电子万年历设计

Designof

multi-functionelectroniccalendarbased

on

ATC89C54

高云霞’,何鉴1,高东梅2

GAOYun.xia。,HEJian‘。GA0Dong—mei2

(1.长安大学电控学院,西安710064;2.奈曼旗东明学区中心校。通辽028322)

摘要:多功能电子万年历的设计是以AT089054单片机为核心,结合DSl302时钟芯片和DSl8820温

度传感器构成单片机控制电路,实现时间、星期、公历和农历的日期、温度、二十四节气、生肖、公历节日、闹铃等功能,全部信息可通过12864点阵式液晶直观显示。整机电路使用+5V稳压电源,有掉电保护功能,可长时间稳定工作。

关键词:单片机;时间;LCD;多功能中国分类号:TP273

文献标识码:A

文章编号:1009—0134(2012)09(上)-0082—03

Doi:10.3969/J.Issn.1009-ol34.2012.9(上).27

1系统设计方案

2系统硬件组成

本设计以ATC89C54单片机为核心,构成单主控芯片使用STC公司的单片机STC89C54。复位电路采用上电复位电路,时钟电路采用内部振荡方式。

时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DSl302。包括实时时钟/日历和31字节的静态RAM。时钟的运行可以采用24h或带AM(上午)/PM(下午)的12h格式。DSl302可在很小电流的后备(2.5-5.5V电源,在2.5V时耗电小于300nA)下继续计时,其软硬件设计简单,应用于长时间连续显示的系统中很合适。

室内温度采集采用美国DALLAS半导体公司时钟电路L—+

-4液晶显示

最新推出的改进型智能温度传感器DSl8820这种STC89温度传感器有别传统的温度传感器。它白带A/DC54

键盘接口电路卜—+

转换,直接输出数字量。

主控模块

键盘输入系统由P1.4一P1.7口和4个微动开温度采集L—+

关组成,开关的另一端连接地线。当无键按下时

—_一扬声器

P1.4一P1.7口输入为高电平,有键按下时P1口所对应I/O口会被拉低,P1.4一P1.7中有低电平输入。图1系统整体框图

分别对应时间、日期调整,退出、播放音乐和闹铃开关键的功能。

・7

如图1所示系统由主控模块、时钟模块、温由于设计的信息显示量较大,故选用MSl2864R汉字图形点阵液晶作为显示模块,内置8192个中文汉字(16X16点阵)、128个字符(8X16

收稿日期:2012-01-12

作者简介:高云霞(1975一),女,陕西人,讲师,主要从事微机应用技术的教学与研究工作。

【82】

第34卷第9期2012—9(上)

万方数据

片机控制电路,结合DSl302时钟芯片和DSl8820温度传感器,显示阳历的年、月、日、星期、时、分、秒、二十四节气和阴历的年、月、日,还有温度。同时完成对它们的自动调整和掉电保护,全部信息用液晶显示出来。输入接口由四个按键来实现,用这四个按键可以对日期和时间进行调整,播放音乐的控制,并可以对闹铃的开关和闹铃的时间进行设置。闹铃和播放音乐功能通过扬声器来实现。软件控制程序实现所有的功能。整机电路使用+5V稳压电源。

度模块、键盘接口模块、显示模块和闹铃模块共6个模块组成。

点阵)及64X256点阵显示RAM(GDRAM)。可使设计更加具有人性化的操作和美观的页面效果。

闹铃模块由一扬声器和1个PNPS8550三极管组成,三级管连接在单片机的P3.7口上。主要硬件明细如表1所示:

表1主要硬件明细

序号

123456789101l12131415

l初始化键盘、各数据届嘶、DSl302、液晶显示器

显示欢迎信息

Dsl302开始振荡f

封装

AXIAL0.4

元件名

电阻电阻

规格

10K4.7K1302

数量

从DSl302中读出年、周、月、日、

1lll122lll41lll

时、分、秒,从18820读出温度

同上

DIP8XTALlXTALlRB.2/.4RB.2/.4SIP31805DIP40

根据阳历算出阴历、节气和与其对应的阳历节日

时钟芯片

晶振晶振无极性C

11.592MHZ

32.768KHZ

30pf10ufDSl8820

5VSTC89C54

有极性C温度传感器

电源单片机按键自锁开关扬声器钮扣电池

LCD

◇N

送LCD显示

液晶屏显示标识符

SWl2SWl2

1805

3V12864

SW3

SIP20

一N

清屏上

LCD显示闹铃时间到

图?l

MSl2864来显示,时间、日期的修改通过按键来控制的。所以要对按键、时钟芯片、液晶显示器进行初始化。而其他模块的初始化在各模块函数中初始化。

在系统初始化部分结束后进入主体循环部分。

~+.

‘.

一■

5:,

誊;

搂{

?:.

:ii?-磊j。:.%.■{‘。

‘。’

。j一

它分又分为外循环部分和内循环部分。在外循乔?一

是对当时时间、日期,闹铃和播放音乐的设置,如果没有设置完成就一直处于外循环。当设置完在内循环中可实时采集温度、时间、,日期和其对应的二十四节气的数据,并将日期转换成农历月、日和其对应的生肖年。具体流程如图2所示。

。111。

’…

图3系统的硬件电路图

天1矧胃’p~霎萎差会詈妻黧’唾毛纂嚣】|等碧篆耋霁黧4实物调试

利用Proteus的ISIS实现该系统的硬件电路图如图4所示。Proteus的ARES设计该系统的

第34卷第9期2012-9(上)!'831

万方数据

奠枷●叼■呦z帅-岫J四M_■●-01_oM嘧∞咖●Ⅶ

蕾岳oa

-《

…一d

r’★冈殖■广———习-一-一蛹●哑卑4囿。-rE

图4

Keil编译图

图5插上单片机芯片的电路板正面

PCB;Proteus和Keil联合仿真调试。

本程序是完全编译通过,且没有1个警告,最后生成hex文件。如图4所示。

实物的应用主要在于电路板上5个按键的控制和LCD显示器的显示。图5显示了实物的焊接情况和器件的大概布局。

MSl2864字符型液晶主界面显示功能如图6所示。LCD液晶显示器的第一行显示公历的年月日和生肖;第二行显示农历和星期;第三行显示

[841

第34卷第9期2012一g(上)

万方数据

图6主界面

时间(时分秒)和温度;显示节日和时辰信息交替

间隔1秒显示。

系统能自动对室内的温度进行实时检测,温度的显示范围是在一55℃一996C,其精度为0.1℃。

5结论

本设计功能设计齐全。可显示时间、公历和农历的日期、星期、温度、生肖、二十四节气、公历节日和播放音乐及闹铃等功能,配以LCD显示模块作为输出单元,具有读取方便、显示直观、功能多样、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,设计的后继发展应该针对不同需要,扩展数据内容、增加表现方式。

参考文献:

【1】刘坤.51单片机C语言应用开发技术大全【M】.北京:人民

邮电出版社,2008.【2】虞钢,周孟然,周旋,等.基于C8051F单片机的智能声光

通讯器设计【J】.煤矿机械,2010,31(11):221—223.

【3】倪涛.基于单片机的矿井瓦斯检测报警系统【J】.煤矿机

械.2010,31(12):201—204.

【4】BATshi,WANGYan—feng,HUANGmin,ect.Trendof

LCDTouchSensorTechnology[J].液晶与显示.2010,

25(4):572—575.

[51Yang.Y.,Yi.J.,Woo,Y.Y.,andKim.B.:‘Optimum

designforlinearityandefficiencyofmicrowaveDohertyamplifierusing

new

loadmatchingtechnique’,Microw.J.,

2001。44,(12):20-36.

基于ATC89C54的多功能电子万年历设计

作者:作者单位:刊名:英文刊名:年,卷(期):

高云霞, 何鉴, 高东梅, GAO Yun-xia, HE Jian, GAO Dong-mei

高云霞,何鉴,GAO Yun-xia,HE Jian(长安大学电控学院,西安,710064), 高东梅,GAO Dong-mei(奈曼旗东明学区中心校,通辽,028322)制造业自动化

Manufacturing Automation2012,34(17)

1.刘坤 51单片机C语言应用开发技术大全 2008

2.虞钢;周孟然;周旋 基于C8051F单片机的智能声光通讯器设计[期刊论文]-煤矿机械 2010(11)3.倪涛 基于单片机的矿井瓦斯检测报警系统[期刊论文]-煤矿机械 2010(12)

4.BATshi;WANG Yan-feng;HUANGmin;ect Trend of LCD Touch Sensor Technology[期刊论文]-液晶与显示 2010(04)5.Yang.Y;Yi.J;Woo,Y.Y;Kim.B Optimum design for linearityand efficiency of microwave Doherty amplifier usinga new loadmatching technique 2001(12)

引用本文格式:高云霞.何鉴.高东梅.GAO Yun-xia.HE Jian.GAO Dong-mei 基于ATC89C54的多功能电子万年历设计[期刊论文]-制造业自动化 2012(17)

范文六:多功能液晶万年历的设计制作 投稿:胡摲摳

瓣懦U作天地

粼H/1N矿s

13N

F’R占=J酝话……一]川黼隧

多功能液品万年历的没计制作

二、硬件电路设计

1.单片机外围电路设计

时钟芯片和实时温度采集芯片均采用总线方式与单片机进行通信。单片机外围电路设有扬声器、四个按键(分别用于实现时间设置及调整、闹钟设置及调整、按键加和按键减功能),另外液晶模块采用并行通信模式,其数据线与单片机P0口并行连接,其他控制线也均以总线方式接至单片机相应I/O口。

123456

随着生活水平的提高、科技水平的迅猛发展,电子万年历正逐步走进千家万户,为人们生活带来了极大的便利。

本设计核心控制器选用大存储容量单片机STC89C58RD+。并采用12864液晶显示屏。可同屏显示年、月、日、星期、温度、公历和农历的重大节日、一天中不同时段的提醒等内容。并具备整点报时、开机画面显示、闹钟设置等功能。本制作的一大特色是成功的完成了人机交互界面的设计。其将具有极好的市场应用前景。

一、系统总体设计

本设计以STC89C58RD+单片机为核心,结合时钟芯片DSl302,温度采集芯片DSl8820等外围器件。实现了万年历等一系列功能,并通过液晶屏和按键控制完成人机交互的功能。其系统总体设计框图,如图1所示。

]LED

SCLK

I/ORST

INC

UjSTC89C

P00P01P02P03P04F'05P06P07P20P21P22P23P241=25P26P27

R1234

.010.011.012.013P14P15716.017

5;。D卜

383736353433

D1D2

D3

2345678

123456789’1)k+8

D4D5D6

DEGSET

o‘u’

VCC。

INTlINTOT1TO

21

9=‘

BEEP——L

NCPSBERWRS

22DATA23/RST2425262728

雨VCC。一鲁}旦31

r丁G吖D

0p6V

fi

图1系统总体设计框图

+捌f汗M嘻

1l’

30p

30皓II

聊P

X1X2

嘛R5

RESETRXD

TXD

1011

i而ALE庐WRPSEN

—贸广

各位电子爱好者进一步提高,参考网站http://www.jdm.homepage.dk可能提高烧录速度。

图12写成功

14

2010

1军t13运行程序逼量置

VOL.03

万方数据

醮穗嚣ll

l厂——————…~渤膀煮燃

3.液晶显示模块电路设计

12864液晶显示屏以ST7920为主控芯片,配中文字库,点阵数:128×64,具有串行通信和并行通信两种模式.支持图画显示。液晶与单片机连接电路如图4所示。连接关系见表1所示。液晶的对比度由图4中的R6调节.将R6调节到适当位置.内容才能显示出来。

表1液晶与单片机连接关系表单片机

液晶

2.时钟芯片电路设计

DSl302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。DSl302与单片机之间能简单地采用同步串行的方式进行通信。仅需用到三个I/O接13线1复位、2

RS‘卜_

l/D一数据线、3

SCLK——串行时钟。实

时时钟具有能计算2100年之前的秒、分、时、日、星期、月、年的能力,还有闰年调整的能力。

时钟RAM的读,写数据以一个字节或多达31个字节的字符组方式通信。本设计中所提供的闹钟功能,就是将定时信息存储在该芯片的静态RAM中.闹钟设定时间到时,DSl302会自动触发单片机,并调用相应的铃声子程序。DSl302工作时功耗很低。保持数据和时钟信息时功率小于1mW。其时钟

描述8位数据

线

P00-P07DO—D7

P27RS存取

DDRAM,

存储器

P26P25P24

RW

EPSB

读/写

使能

并、串方式选择

P23P22

NC

r一……~。…一…………一~~—。1

芯片电路,如图3所示。

VCC

U4

/RST

复位

128+64LCD

;图4液晶显示模块电路

I.。

..~…...…一…』

4.万年历系统电路图

16v

GND

:.…一…,………一…一一一….…一.一…一

液晶万年历系统电路原理图如图5所示。

voc嚆瓯》。』

拿18.B20,vcc

一,.c

旺制‰

SET

奎二。…

LSl

2346789

——LED

SCLKI/ORSTlNCDECSETESC

R12345678

P10P"P12P13P14P15P16P17lNTlINTOT1下O

P00P01P02P03p04P05P06P07P20P21P22P23P24P25P26P27

39卣r

383736353433322122232425262728

D1D2D3D4D5D6D7BEEDATAIRSTNCPSBE

23456789

VCC

IR

;g蓦12lfo铲C

4D‘DATA

n叫警蚓Vcc。',

Dsl302

非snvccGN}』[兰糍峰31

喵。陇c彘≥咪欧c"平警

10r,’

C.C.1№扭

J6

123456789Ok’8

JI—l伊

一I

’0

鼬P

X1X2RESET

RW

RS

}+掣jiyf2

18。

,SCLK

聊。?亍:茹jj。

GND

蚕}爿X磊7。Rl/oST峰[5旧RST上I+C,t一6i{6

GND

J1

宣慧

邀嫌PSEN

ALE庐

STC89C52

VCC

RXD

T×D

10

j1

唑眇J7T

12345678910”12'314151617181920

1001,d16V

归黔W0.垂,I

II”口nE

r■—●_13。

D1

D2D3

ZS

D7

lN4007

2∑D9

lN4007

C6470#25V一_

103C7

&妇

—旦皇-

万方数据

【】嚣

C8

一103

c9一103

C10

D5

立曼

D7PSBNC

220p16V

5弧。1’

.红色L∞

丞曼工

VEE

Z王D82S销‰,

IN4007

j…….…一……一一…~周曼系统电路原理髓G…ND~~~一、……,…128’簟Lc曼.:

电号嗣作

蝴I.剜D12。;NDl

15

鬃?‰U作天地

龇MN矿s

ON芦而菇运■———————————————————]I

void

lI

ll鞠

PCB设计板图如图6所示

SeLtime(unsigned

char

sel);

//时间调整函数

voidvoid

alarm_check(void);//闹钟函数Beepyinyuel(void);//整点报时音乐

ReadTemperature(void);

unsignedint

//温度读取

四、功能简介

图6系统PCB图

(1)液晶同屏显示年、月、日、星期、时、分、秒,正常走时状态下.外围电路设有一LED秒指示

三、软件设计

本设计中,软件是重点部分。系统主程序流程图如图7所示。

灯,每秒闪烁一次。

(2)开机画面显示3秒,显示相关制作信息3秒.清屏后进入正常走时状态。

(3)整点报时功能,早8点到晚10点,多首歌曲在整点时刻循环播放,每首歌曲的长度均控制在一分钟以内。

(4)公历和农历所有的节日提醒,均在屏幕最下面一行显示。如果当天是某个节日,则显示相关节日信息,若当天无任何节日。则可显示当天的各个时段信息,如:凌晨、早晨、上午、中午、下午、晚上、夜里、深夜等。

(5)实时温度显示,精确到小数点后一位。(6l时间调整:在正常走时状态下,按SET键进入时问调整界面。可以依次调节年、月、日、星期、时、分等信息,按CLK键退出当前的调整状态,恢复正常走时。

(7)闹钟调整:在正常走时状态下,按CLK键。

图7主程序流程图

进入闹钟设置界面,可以依次调节闹钟小时、闹钟分、闹钟开启和闹钟关闭。当想要设置闹钟时,设置好

根据功能需要。构建的主要上层函数包括:

bit

小时、分之后,再按此键至闹钟开启,按SET键即可退出闹钟设定界面,闹钟设置完成。若不想使用闹钟.就按CLK键至闹钟关闭状态时,再按SET键退出界面,则闹钟被关闭。

get..moon..day(unsigned

table_addr);

charmonth——

P,unsignedint

,/阴历使用函数声明

void

Conve

rsion(bit

c,unsigned

char

(8)外部电路设有扬声器开关,用户可根据需要自行开关扬声器。

(9)电路板界面设计人性化,便于人机交互。

year,unsignedcharmonth,unsignedcharday);

//阳阴历转换

void

img—disp(unsigned

char

code’img);在正常走时界面或任一调整界面状态时。均会在相应按键对应位置显示相关的操作提示信息。使用户使用方便,易学易用。

//图画显示函数

void

days(void);,/节日函数

16

2010VOL.03

万方数据

多功能液晶万年历的设计制作

作者:作者单位:刊名:英文刊名:年,卷(期):被引用次数:

寇诗隆, 刘鑫

电子制作

PRACTICAL ELECTRONICS2010,03(3)1次

引证文献(1条)

1.王峰.祁鸿芳.魏建升 基于无线射频技术的环氧乙烷浓度监测系统设计[期刊论文]-自动化与仪器仪表 2010(5)

本文链接:http://d.g.wanfangdata.com.cn/Periodical_dzzz201003003.aspx

范文七:多功能数字万年历课程设计 投稿:袁鏍鏎

多功能数字万年历课程设计

专 业:自动化 班 级:10306202 学生姓名:廖先任 学 号: 指导教师:胡文龙

院 系:机械与电子工程学院

时 间: 2013-11-27

摘要

电子万年历是采用独立芯片控制内部数据运行,以LED夜光数码显示日期、时间、星期、节气倒计,以及温度等日常信息,糅合了多项先进电子技术及现代经典工艺打造的现代数码计时产品。

电子万年历在人们的日常生活中使用越来越广泛,针对以往时钟芯片断电后需重新设置日期时间以及误差大等缺点,本系统采用DS12CR887实时时钟芯片内部带有晶体振荡器与可充电锂电池实现了在没有外部电源供电的环境下,芯片内部电池的充足容量可为振荡器和寄存器供电长达5 a之久.每月误差为1 min.定时闹钟为每秒1次至每日1次.并可通过键盘调节时分秒以及日期与设定闹钟.

目录

一、设计任务.......................................3 二、设计要求.......................................3 1、基本要求.....................................3 三、使用软件简介...................................3 1、protues介绍..................................3 2、 keil介绍....................................4 四、设计过程.......................................5 1、设计流程图...................................5 2、程序总流程图.................................6 五、系统的硬件结构.................................7 六、系统的软件设计流程图...........................8 七、protues设计电路图及仿真........................8 八、主要模块程序代码...............................9 九、心得体会......................................11 参考文献.........................................12

一、设计任务

设计一个具有多种功能的电子万年历。

二、设计要求

1、基本要求

(1)能显示阳历年、月、日、星期、小时、分、秒

(2)显示模块采用LCD液晶显示,要求能用按键调整时间。 (3)能显示阴历月、日,在显示阴历时间时能标明是否为闰年。 (4)具有定时报警功能,能够进行整点和半点语音报时。

三、使用软件简介

本次课程设计要使用2款软件协作完成,即protues完成基本电路构造和keil完成单片机程序设计。 1、protues介绍

Protues在两次课程设计中都有用到,可见学校对其应用的总是程度。Protues软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件,几乎是目前最好的仿真单片机及外围器件的工具。虽然目前国内的推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等。

在编译方面,它支持IAR、Keil和MPLAB等多种编译,这次课程设计就是Protues和Keil的协同使用来完成。软件仿真方面,支持当前的主流单片机,如51系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80

系列、HC11系列、68000系列等。 可以提供软件调试功能 ,丰富的外围接口器件及其仿真( RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件)。这样很接近实际。此外还具有强大的原理图绘制功能。

2、 keil介绍

这次单片机课程设计中除必要的硬件外,同样离不开软件的支持,所使用的汇编语言或C语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。掌握这一软件的使用对于使用51系列单片机的设计者来说是十分必要的,如果使用C语言编程,那么Keil几乎就是唯一的选择。即使不使用C语言而仅用汇编语言编程,Keil方便易用的集成环境、强大的软件仿真调试工具也会事半功倍。

四、设计过程

1、设计流程图

设计流程图

2、程序总流程图

根据上述文字表达,可以得出程序总流程图如下:

程序总流程图

根据课程设计的要求和设计流程,结合设计出的电路图,可以设计相应的C语言程序。

五、系统的硬件结构

如下图所示

.

显示模块采用nokia5110液晶,其控制与驱动芯片为PCD8544,PCD8544是一块低功耗的CMOS LCD控制驱动器,设计为驱动48行84列的图形显示.所有必需的显示功能集成在一块芯片上,包括LCD电压及偏置电压发生器,只需很少外部元件且功耗小.本系统用其实现了温度、日期、时间与汉字的动态显示[1].温度模块采用DALLAS公司的ds18b20数字温度传感器,测温范围为-55~+125e.ds18b20是世界上第一片支持/一总线0接口的数字温度传感器.其独特的单线接口使其与单片机的数据通信仅需一个管脚进行通信.数字化传感器使其不需要任何外部AD转换电路即可直接与单片机进行通信。.

4*4矩阵键盘模块采用查询法,利用单片机的PO口对键盘进行行循环扫描,最多可扩展16个按键[2].

实时时钟模块采用DALLAS的DS12CR887实时时钟芯片.该器件提供RTC/日历、定时闹钟、3个可屏蔽的中断和一个通用中断输出、可编程方波以及114字节电池备份的静态RAM.少于31 d的月份,月末日期可自动调整,其中包括闰年补偿.该器件还可以工作于24 h或带AM/PM指示的12 h格式.一个精密的温度补偿电路用来监视VCC的状态.如果检测到主电源故障,该器件可以自动切换到备用电源供电.VBACKUP引脚用于支持可充电电池或超级电容,内部包括一个始终有效的涓流充电器。

六、系统的软件设计流程图

总体流程图如图所示

.

七、 protues设计电路图及仿真

基本电路完成,将编程生成的hex文件导入到仿真单片机中:

图2.6 导入hex文件

按下仿真键,即可开始仿真:

八、主要模块程序代码

PCD8544液晶模块代码

void LCD_write_byte(unsigned char dat, unsigned char command) //向LCD写一个字节 {

unsigned char i; ce=0;

if (command==0) dc=0; else dc=1;

for(i=0;i<8;i++) //循环写入8位 {

if(dat&0x80) din=1;

else

din=0;

clk=0;

dat=dat<<1;

clk=1;

}

ce=1;

}

void LCD_write_char(unsigned char c) //向LCD写一个字符

{

unsigned char i;

c=c-0x20;

for (i=0; i<6; i++)

LCD_write_byte(font6x8[c][i],1);

}

void LCD_set_XY(unsigned char X, unsigned char Y)

{

LCD_write_byte(0x40|Y, 0); //设置起始行

LCD_write_byte(0x80|X, 0); //设置起始列

}

void LCD_clear(void) //LCD清屏

{

unsigned int i;

LCD_write_byte(0x0c, 0);

LCD_write_byte(0x80, 0);

for (i=0; i<504; i++)

LCD_write_byte(0, 1);

}

主函数代码void main ()

{

dswrite(0x0a,0x20); //开启晶振

LCD_init(); //初始化液晶

while(1) //循环扫描

{

tmpchange(); //温度显示

keyscan(); //键盘扫描

, //调用温度显示模块

}

}

//设置LCD起始地址

九、心得体会

通过本次对多功能数字万年历的设计,巩固了我对数字电路的知识,增加了我对单片机和数字电路结合设计的理解,同时也提高了我对Protues和Keil编程软件的联机应用。

本次课程设计是一个使用Protues设计工具、协同使用Keil编程软件制作多功能数字万年历的题目。在设计过程中,由于单片机的理论知识学习是去年开始的,过去了一年应用的比较少,所以导致对单片机的存储结构和指令计数方式有所生疏。不过经过这周的课程设计,我又重新复习了下单片机的知识,对单片机的汇编语言提高了很多。不过这次设计不仅需要汇编语言,而且还应用到C语言。对于C语言,我还是比较熟悉的。因为拿到了计算机二级C。虽然学习C语言是大二时候开始的,不过有了以前的底子,现在看程序还是比较轻松的。

在整个课程过程中,我深刻地感受并理解到单片机汇编语言和C语言的简便性和丰富性。不管是从实现功能的角度看还是从数据类型、架构上,都可以看出C语言是一个十分优秀的程序开发语言。

经过这几天的学习,很大的提高了我对硬件和软件的结合认识。比如Protues绘制好电路图和Keil编程软件进行仿真的过程提高了我对电子设计的整体思路。让我了解怎么从不同的角度去分析同一个问题,让我们有更多更广的思路去处理解题时遇到的难点和要点。从解决问题的过程中也可以熟悉和了解C语言和Protues程序的不同用法和功能,而各种原有的模板使得我可以用高效,简洁的思路、观点来解题。经过反复的设计、验证、修改,最后终于得到了实验的成果。当时,看着Protues仿真出的万年历跳动的秒钟,我心里特开心,所有的辛苦都是值得的。

在最后,我要感谢我的指导老师,因为在课程设计的过程中,出现很多问题时都是在老师的帮助下解决的。通过这次课程设计,不仅加强了我对数字电路设计的能力,而且使我对Protues和Keil编程软件的联机有了更深刻的认识,最重要的是,增加了我对电子设计的热爱。不过,经过这次课程设计我也看到了自身的一些不足,比如对数电知识理解的不过彻底,对单片机汇编的运用的不是很熟悉等等。在今后的学习和工作中我会吸取这些教训,注重提高自身能力,并且更加用功的学习数字电子和汇编语言及C语言。

参考文献:

[1] 求是科技.单片机典型模块设计实例导航[M].北京:人民邮电出版社,2005.

[2] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,2001.

范文八:多功能电子万年历的设计与实现 投稿:蔡岵岶

多功能电子万年历的设计与实现

刘瑞涛

(石家庄职业技术学院电气与电子工程系 河北石家庄 050081)

摘要:多功能电子万年历在公共场所和日常生活中使用非常普遍,同时也是单片机课程教学的典型工作任务。其主要由硬件系统和软件系统组成,硬件系统主要包括单片机最小系统,时间采集模块,温度采集模块,指令输入模块,信息显示模块5个模块组成。软件系统使用C51编程语言进行程序设计,编写DS1302时间采集函数,DS18B20温度采集函数,按键扫描函数,信息显示函数以及最后集成的主函数。单片机通过程序控制实现从DS1302中提取年、月、日、星期、时、分、秒等信息,从DS18B20采集温度值的数字量,再把这些信息通过数码管输出显示。

关键词:多功能万年历 单片机 时钟芯片 温度传感器 数码管显示中图分类号:TP368.12文献标识码:A文章编号:1007-9416(2013)12-0159-01

随着经济社会的不断进步,多功能电子万年历已经成为人们工作生活中不可缺少电子产品之一,它为人们提供当前的日期、时间、温度、湿度等信息,广泛使用在学校、医院、火车站、港口等公共场所。但通过我们对市场上的电子万年历深入分析发现它们都存在一些不足之处,例如:时间计时不准,每月的天数需手动调整,不能显示温度、湿度信息,可扩展性不强等,这些都为用户的使用产生了不便。为此,本文设计了一种时间计时准确,显示信息全备,性价比高的多功能电子万年历。

1 计时方案分析

在设计之初首先要考虑的问题就是采用何种方式进行时间计时,这其中要考虑时间计时是否精准,元器件价格是否便宜,硬件设计是否简单,驱动程序编写是否容易。

在现阶段的市场中,有一些专用的时钟芯片,它们可以精确地计时时间,并且可以按照进制依次向日期信息进位,而且此类芯片的接口协议逐步趋于标准,操作起来有固定的模板可以借鉴,DS1302就是一款性价比高,时间计时精准,芯片体积小功耗低,日期自动带有调整补偿功能,可以持续计时的时钟芯片。DS1302采用串行接口与单片机进行数据传输,其控制引脚有三根,分别是SCLK、I/O、RST,通过这三根引脚的时序配合逐位进行数据的读与写,可以将时间与日期信息传输给单片机,继而通过数码管显示。

的封装是DIP8,配套电路还要有电源、地、外接32.768KHz晶振电路,如果要持续计时就要外接电池。其内部主要包括时间和日历7个信息寄存器,传输数据信息主要通过SCLK、I/O、RST三个引脚时序配合读写信息,而AT89S51没有专用的接口,所以只能通过三个IO口与这三个引脚相连,通过编程模拟时序变化。

按键及温度采集电路:按键采用微动开关,与单片机IO口连接时接1KΩ—10KΩ上拉电阻,另一端接地,这样当按键按下时输入为0,不按下时输入为1;DS18B20为三引脚封装,其中两边引脚分别接电源和地,中间引脚同样通过一个1KΩ—10KΩ上拉电阻接到单片机上的某一个IO口。

显示电路:由于显示的信息较多,且每个信息都相互独立,要使用多个两位一体或四位一体数码管,并根据使用场合选择不同尺寸大小的数码管。

4 软件程序设计

由于使用了时钟芯片DS1302、温度传感器DS18B20,单片机内部程序要控制IO口电平变化依据传输协议从DS1302各个寄存器读取时间和日期数据,从DS18B20中读出温度数据,再将它们放入显示缓冲单元中。显示程序模块只需从显示缓冲单元中取出数来并显示。在开机初始化程序中,要对DS1302和DS18B20进行初始化设置,同时还要启动计时开始。采集来的各项数据都要进行数制的转换与整理才能放入显示缓冲单元中。系统程序流程图如图1所示。

2 多功能电子万年历系统概述

本设计所介绍的多功能电子万年

历数字化率高,操作简单,其主要特点是:核心控制芯片采用市场占有率高的51单片机;时间信息由美国DALLAS公司生产的DS1302芯片生成,其芯片体积小,功耗低,接口协议通用,采用备用电源可以持续计时;温度信息同样由美国DALLAS公司生产的DS18B20芯片生成,其由3个引脚组成,硬件设计简单,直接生成数字量;人机接口由三个按键来实现,分别为功能键、加键、减键,用这三个按键对时间、日期调整。电源问题,可以采用开关电源供电,直接给芯片及外围设备提供5V直流电,也可以采用生活中比较常见的USB口供电。

5 结语

本设计硬件电路原理简单,所用的元器件大部分都为数字芯片,如果都采用贴片元器件可以将电路板制作的非常小,大大节约了制作成本。软件编程方面,可以将对各种外围设备的驱动编写成函数模块,既可以是程序思路更加清晰,也便于后期的功能扩展。此万年历可以普遍应用于学校、医院、车站等公共场所,根据使用场合的不同可以选择不同颜色、大小的数码管,并能增加湿度采集或语音播报等功能,具有广泛的社会应用领域。参考文献

[1]刘春燕,晁勤,袁铁江,魏丽丽.多功能数字万年历的设计[J].自动化应用,2013,1.

[2]莫玉华.基于实时钟芯片的万年历设计[J].电子世界,2013,14.[3]王静霞.单片机应用技术(C语言版)[M].北京:电子工业出版社,2011.

3 硬件电路设计

1 系统程序流程图

时间采集电路:DS1302时钟芯片

159

多功能电子万年历的设计与实现

作者:作者单位:刊名:英文刊名:年,卷(期):

刘瑞涛

石家庄职业技术学院电气与电子工程系 河北石家庄 050081数字技术与应用

Digital Technology and Application2013(12)

参考文献(3条)

1.刘春燕;晁勤;袁铁江;魏丽丽 多功能数字万年历的设计[期刊论文]-自动化应用 2013(1)2.莫玉华 基于实时钟芯片的万年历设计 20133.王静霞 单片机应用技术(C语言版) 2011

引用本文格式:刘瑞涛 多功能电子万年历的设计与实现[期刊论文]-数字技术与应用 2013(12)

范文九:万年历的来历 投稿:姜蘲蘳

相传在很久以前,有个叫“万年”的青年,以打柴为生。他十分聪颖,看到当时节令很乱,决心把节令定准,可是又不知从何着手。 一天,他上山砍柴,休息时又想起节令的事来,他苦思苦想着,两眼望着那树影直发呆。忽然,他从那移动的树影中受到启发。回到家里,他设计了一个专门测日影计天时长短的“日

晷仪”。

• 可是,当天气出现云阴雾雨时,怎么办呢?后来在山上打柴时,他到泉边喝水,看见那崖上的泉水很有节奏地往下滴,引起他的兴趣。他望着那滴哒滴哒的泉水出神。回家后,他就动手做了五层漏壶。用漏水的方法来记时。就这样,他通过测日影、用漏水记时的方法,慢慢地发现,每隔三百六十多天,天时的长短就会重复一次。最短的一天在冬至。 由于节令的失常,影响到农业的生产,老百姓叫苦不迭。天子祖乙也很忧虑,他召集百官寻找节令失常的原因。

•节令官阿衡说是人们得罪了神造成的。要想节令正常,就得祭拜天神,请求宽恕。天子信以为真,带领百官去天坛祭祀天神,并诏渝全国,设台祭天。 万年认为,祭祀是徒劳的。他带着自制的日

而使节令失常的道理。并根据自己多年测定的结果,说明了冬至点,讲清日月运行的周期。天子听后,感到万年说得有道理,于是就把万年留下,并在天坛前筑起日晷台、漏壶亭,又派十二个童子给万年服侍听用。 “春为岁首,就叫春节吧。” 天子说,“你到这里已三年多了,呕心沥血,制出太阳历,劳苦功高。今天反而遭暗算,负了重伤,现就随我到宫中疗养好了,跟我共度春节。” 万年答道:“承蒙天子厚爱,只是太阳历还是草历,尚不准确,还要把岁末尾时润进去,否则,久而久之,又会造成节令失常。为了不负众望,我必须留在这里,继续把太阳历定准。” 寒来暑往,春去冬来。万年经过长期观察,精心推算,终于把太阳历定准了。当他把太阳历献给天子时,天子见他满头白发,深为感动,就把太阳历命名为“万年历”,封万年为日月寿星。今天,人们把春节称为“年”,过年挂上寿星图,据传说就是为了纪

念功高德重的万年。

范文十:打印万年历 投稿:覃粗粘

附1:对学生课程设计两周的纪律及提交内容的要求

1) 上机时禁止玩游戏,发现三次,实习成绩为不及格;

2) 根据课题自行准备参考书籍及C语言的有关工具书或上网查找资料,学习掌握debug方法。

3) 上机前作好充分的准备,包括事先写好主要算法的程序代码以保证充分利用上机的时间调试程序。

4) 程序设计组织方式:一个组选定一名同学为组长,负责一个组的协调。同组通过讨论,合理分工完成一个课题。

5) 课题选择:

a) 指导教师的课题随机分配。课题中规定的基本功能要求必须完成,扩展要求可以参考课题提示,也可以自己根据实际应用进行设计。

b) 自选课题:如果有自己感兴趣的课题并且同组成员没有异议,经指导教师审核后可以自选,但必须在程序设计开始的第一或第二天提出,否则完成指导教师分配的课题。

6) 答辩:程序设计最后两天为答辩时间。相同课题的两组一起答辩,答辩时各组以ppt方式介绍自己完成的项目,组长负责讲解程序的模块分工、运行和完成系统的主要特点,各成员分别讲解自己完成部分的特点及思想。根据程序运行情况、功能实现、算法设计、分工合作、答辩情况等结合平时表现、程序设计报告给出成绩。等级为:优秀、良好、中等、及格、不及格。原则上一组成员成绩相同。如果两组的程序雷同,两组同时为不及格。

7) 作业提交要求:

a) 以电子邮件形式提交,命名规则:,内容包括:源代码、

源代码运行所需要的原始数据如文件、源代码编译后的可执行程序(.exe)、程

序设计报告、答辩用ppt

b) 上述材料中要体现各人完成情况,可在合适部分加上姓名学号

c) 程序设计报告的首页指导单位处,填上:计算机学院软件教学中心。姓名处写

上:所有成员的姓名学号,组长写在第一个。

d) 程序设计报告最后要给出参考文献,参考文献标准的写法请参见南邮学报

附2:上机时间请查看A机房橱窗中的上机安排表。

附3:参考资料,包括:程序设计报告参考样本,C函数速查,时间函数的用法示例等。下载地址:ftp://10.21.0.2中“程序设计B090611参考资料.rar”文档,在本地解压后查阅

字典词典网络安全申论范文网络安全申论范文【范文精选】网络安全申论范文【专家解析】以青春为主题的演讲稿以青春为主题的演讲稿【范文精选】以青春为主题的演讲稿【专家解析】父亲的手阅读父亲的手阅读【范文精选】父亲的手阅读【专家解析】