好文档 - 专业文书写作范文服务资料分享网站

以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

天下 分享 时间: 加入收藏 我要投稿 点赞

标准

的工作量也是非常大的。写实验报告时,每个模块的流程图都是自己画的,用WORD文档画图真的很麻烦,而且不是很美观。因为时间比较仓促,流程图写的条理性不够,不过相信以后多多练习,就可以做得更好。

5、在这次实验中我遇到了很多故障,不过通过各种渠道(比如网络,请教同学,老师等等)解决了一些故障,虽然没有全部解决,但能在短短一周内通过此次作业,实现电子钟的功能,还是有点成就感的。在解决这些问题的过程中发现网络确实是一个很好的学习平台,利用前人的经验可以提高自己的解决实际问题的能力。通过这一个多礼拜的学习实践,使我对所学的知识进行了系统的复习和巩固,在以前学习中不够清晰的概念得到了更好的理解。相信通过不断的学习,能使自己扬长补短。

六、程序清单

1、主程序

#include #include\ //包含头文件,直接引用显示文件

#include\#include \

#define uchar unsigned char #define uint unsigned int

#define TIMER0_COUNT 0xEE11 sbit mode=P3^0; //设定修改位数 sbit plus=P3^3; //加键 sbit dec=P3^6; //减键

uchar count,s1num,timer0_tick,count=0; typedef struct{

char hour; char minute; char second; }time;

typedef struct{

uint year; uchar month; char day; }date;

time now={10,20,0}; //显示时间初始值 date today={2009,1,8}; char code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31}; //设定月份数组,用以判定12个月的最大值 char code weekday[7][4]={\\ //

文案

设定行星期显示数

uchar monthday(uchar year,uchar month) {

if(month==2 && year%4==0) //用以判定是否为润年,其2月有29天 return(29); else

return(dayofmonth[month-1]); //非闰年时的该月份天数 }

void display_week() //由年月日计算星期 ,用以显示星期数 {

char days;

days=(today.day+1+2*today.month+3*(today.month+1)/5+today.year+today.year/4-today.year/100+today.year/400)%7;

display_string(&weekday[days][0]); }

static void timer0_initialize(void) //timer0 initialize {

EA=0; //设置不接受所有中断 timer0_tick=0;

TR0=0; //关闭Timer0 TMOD=0X01; //设置Timer0为模式2,16位工作模式

TL0=(TIMER0_COUNT & 0X00FF); //设置Timer0低八位数值

标准

TH0=(TIMER0_COUNT >> 8); //设置Timer0高八位数值

PT1=1; //设置Timer0的优先级为最高 ET0=1; //设置接受Timer0的中断 TR0=1; //启动Timer0 EA=1; //设置系统接受中断 }

void write_time(uchar add,uchar number) //写时间 {

gotoxy(2,add); display_data(number); }

void write_riqi(uchar add,uchar number) //写日期 {

gotoxy(1,add); display_data(number); }

void keyscan() //按键扫描程序 { uchar mode_num; //设定mode_num,来判断是哪一位要修改,当mode_num为零时,为非修改模式 if(mode==0) //“修改位”的选择 { delay(5); //延时 if(mode==0) //当外部按键mode没按下一次时,都使mode_num自加,即mode_num表示为按键mode按下的次数 { mode_num++; while(!mode); TR0=0;

write_com(0x0f); } if(mode_num==1) gotoxy(1,4); 当//当mode_num为1时,为年份改变位,光标移到(1,4)

if(mode_num==2) gotoxy(1,7); //当mode_num为2时,为月份改变位,光标移到(1,7) if(mode_num==3)

文案

gotoxy(1,10); //当mode_num为3时,为日

期改变位,光标移到(1,10) if(mode_num==4)

gotoxy(2,2); //当mode_num为4时,为小时改变位,光标移到(2,2) if(mode_num==5)

gotoxy(2,5); //当mode_num为5时,为分钟改变位,光标移到(2,5) if(mode_num==6) gotoxy(2,8); //当mode_num为6时,为秒数改变位,光标移到(2,8) if(mode_num==7) //当mode_num为7时,退出修改模式 { mode_num=0; //非修改模式时,将mode_num置零,有助于判断是否为修改模式 write_com(0x0c); TR0=1; } } if(mode_num!=0) //为修改模式时,加减键的处理子程序 { if(plus==0) //当加键为零,即外部触发一次时,进行以下处理 { delay(5); //延时 if(plus==0) //延时再次判断加键,防止抖动 { while(!plus);

if(mode_num==1) //当为年份改变时,年份自加一,并且显示修改后的日期 { today.year++;

write_riqi(1,today.year/100); //因为年份主要是最后两位在改变,所以除以100来计算年份值,除以100求得的商值为十位

write_riqi(3,today.year0);//余数为个位 gotoxy(1,12);

标准

display_week(); //因为改变日期都会改变周数,所以要重新显示

gotoxy(1,4); }

if(mode_num==2) //以下处理同上 { today.month++;

if(today.month==13) today.month=1; //特别注意,月份不能超过12,当为13时,要将月份置1 write_riqi(6,today.month);

gotoxy(1,12); display_week();

gotoxy(1,7); }

if(mode_num==3) //以下处理同上 { today.day++;

if(today.day>monthday(today.year,today.month)) //特别要判断每个月份的最大值,不能超过此数,超过后要将天数置一

today.day=1; write_riqi(9,today.day);

gotoxy(1,12); display_week();

gotoxy(1,10); } if(mode_num==4) //以下处理同上 { now.hour++; if(now.hour==24) now.hour=0; //小时不能超过24 write_time(1,now.hour);

gotoxy(2,2);

文案

}

if(mode_num==5) //以下处理同上 { now.minute++; if(now.minute==60) now.minute=0; write_time(4,now.minute); gotoxy(2,5); } if(mode_num==6) //以下处理同上 { now.second++; if(now.second==60) now.second=0;

write_time(7,now.second);

gotoxy(2,8); } } }

if(dec==0) //减键的处理和加键处理处理相反 { delay(5); if(dec==0) { while(!dec);

if(mode_num==1) { today.year--; write_riqi(1,today.year/100); write_riqi(3,today.year0);

gotoxy(1,12); display_week();

gotoxy(1,4); }

if(mode_num==2) { today.month--;

标准

if(today.month==0) today.month=12; //要注意月份的最小值为1,当减为零时,要讲月份置为12 write_riqi(6,today.month);

gotoxy(1,12); display_week();

gotoxy(1,7); }

if(mode_num==3) { today.day--;

if(today.day==0) //当天数减为0时,要重新赋值,为上一个月的最大值

today.day=monthday(today.year,today.month); write_riqi(9,today.day);

gotoxy(1,12); display_week();

gotoxy(1,10); } if(mode_num==4) { now.hour--; if(now.hour<0) now.hour=23; //当小时数小于0时,要重新赋值,置为23 write_time(1,now.hour);

gotoxy(2,2); } if(mode_num==5) { now.minute--; if(now.minute<0) now.minute=59; //注意点同上 write_time(4,now.minute);

gotoxy(2,5); }

文案

if(mode_num==6)

{ now.second--; if(now.second<0) now.second=59; //注意点同上 write_time(7,now.second);

gotoxy(2,8); } } } } }

void display_temp() //显示温度子程序 {

uint wendu; //设置wendu变量来存放从18b20读取的温度

uchar A1,A2; //A1用来存放温度值的十位,A2存放个位

tmpchange(); //启动温度转换 wendu=tmp(); //读取温度值 A1=wendu/10; //求A1值 A2=wendu; //求A2值 gotoxy(2,10); display_data(A1); //显示A1值

display_string(\//用小数点分开个位和小数

write_date(int_to_char[A2]); //向lcd写数据,并且注意要转换A2数据类型 }

void timer0(void) interrupt 1 {

TR0=0;

TL0=(TIMER0_COUNT & 0X00FF);//设置Timer0低八位数值

TH0=(TIMER0_COUNT >> 8);//设置Timer0高八位数值 TR0=1; count++;

if(count==30) display_temp(); //延时,当count=30时,显示温度,并延时

标准

if(count==200) //当count自加到200时,开始判断此时时、分、秒的值,并进行转换 { count=0; now.second++; if(now.second==60) //当秒达到60时,向分进位,且秒数置零 { now.second=0; now.minute++; if(now.minute==60) //当分达到60时,向时进位,且分数置零 { now.minute=0; now.hour++; if(now.hour==24) //当时达到24时,向天进位,且时数置零 { now.hour=0; today.day++;

if(today.day>monthday(today.year,today.month)) 、//判断天数,当超过本月最大天数时,向月份进位,且天数置一

{ today.day=1;

today.month++;

if(today.month==13) //判断月份,当月份超过12时,向年份进位,月份置一 { today.month=1;

today.year++;

} write_riqi(6,today.month); 。//在位置6处,向lcd写月份

}

文案

write_riqi(9,today.day); //在位置9处,向lcd写天数

gotoxy(1,12);

display_week(); } write_time(1,now.hour); //在位置1处,向lcd写时数 } write_time(4,now.minute); //在位置4处,向lcd写分数 } write_time(7,now.second); //在位置7处,向lcd写秒数 } }

void main() {

SYSTEMTIME CurrentTime; init_lcd(); //初始化lcd

timer0_initialize(); //初始化内部定时器 Initial_DS1302(); //初始化DS1302 DateToStr(&CurrentTime); //从DS1302读取日期 TimeToStr(&CurrentTime); //从DS1302读取时间 gotoxy(1,1);

display_string(CurrentTime.DateString); //显示日期

display_week(); //显示周几 gotoxy(2,1);

display_string(CurrentTime.TimeString); //显示时间

gotoxy(2,10);

display_string(\ //显示温度

while(1) keyscan();

以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

标准的工作量也是非常大的。写实验报告时,每个模块的流程图都是自己画的,用WORD文档画图真的很麻烦,而且不是很美观。因为时间比较仓促,流程图写的条理性不够,不过相信以后多多练习,就可以做得更好。5、在这次实验中我遇到了很多故障,不过通过各种渠道(比如网络,请教同学,老师等等)解决了一些故障,虽然没有全部解决,但能在短短一周内通过此次作业,实现电子钟的功能,还是
推荐度:
点击下载文档文档为doc格式
0zats6hax4565jb3urou8mpoj7oc3w00zm1
领取福利

微信扫码领取福利

微信扫码分享