1、多功能电子时钟报告单片机设计实验报告多功能电子时钟设计班 级:学 号:姓 名:指导教师: 多功能电子时钟(一)实验目的1、巩固和加深对单片机实验设计的理解,提高综合运用本课程所学知识的能力;2、掌握单片机的P0、P1、P2口的使用方法,及编程实现所需功能; 3、掌握掌握单片机键盘扫描方法;4、通过电路方案的分析、论证和比较,设计计算和选取元器件、电路组装、调试和检测等环节,初步掌握简单实用电路的分析方法和工程设计方法;5、学会keil软件及protuse软件仿真和硬件电路的实验调试和性能指标的测试方法,提高学生动手能力和进行单片机程序设计应用的基本技能;(二)实验任务及要求基本功能:1、 显示
2、时间;2、 调节时间;3、 设置闹钟时间;4、 整点报时(可开可关可随时停止);扩展功能:5、 简易计算器(可算加减法)计算范围是:9999-(-999)内的整数加减运算;6、 秒表(可精确到百分之一秒和十分之一秒,可切换)可存储三个时间并读取显示;7、 倒计时(可设置倒计时时间,减到0后蜂鸣器响);(三)实验总电路图(这个硬件电路图是不完善的哈!)(四)实验原理1、显示电路 采用动态扫描的方式,不断给P0和P1口送数,其中,P0口决定数码管显示的内容,而P1口决定哪个数码管显示。 在程序中,首先定义数码管的编码:unsigned char code Select=0x00,0x07,0x0b
3、,0x0d,0x0e;/全亮,第一个,第二个,第三个,第四个 /code说明把这个表格里面的数据存在程序存储器中unsigned char code LED_CODES= 0x02,0x9e,0x24,0x0c,0x98,/0-4 0x48,0x40,0x1e,0x00,0x08,/5-9 0x10,0xc0,0x62,0x84,0x60,0x70,/A,b,C,d,E,F 0xFe,0x30,0x90,0x7e,0xBe,0xfc/空格(16),P,H,-,|, ; 然后,在程序中,我定义了一下两个函数,通过对上面数组的操作,进行数码管显示:void display(uint x,uint
4、y)/显示函数 uint i,j; i=x;j=y; P1=Selecti; P0=LED_CODESj;void display2(uint a,uint b,uint c,uint d)/显示函数2 uint i,j,m,n; i=a;j=b;m=c;n=d; display(1,i); delay(5); display(2,j); delay(5); display(3,m); delay(5); display(4,n); delay(5);通过延时,利用人眼视觉暂留的作用,用动态扫描,达到静态显示的效果。2、键盘扫描电路从总电路图可以看到,我把键盘阵通过P2口来检测。通过不断的给P
5、2口送值,然后检测P2口的状态,从而判断出,究竟哪个按键被按下,然后去执行之后的程序。键盘检测时,给P2口送的值以及检测到某个按键所对应的值,如下表:送值检测对应按键送值检测对应按键P2=0xf70x70按键1P2=0xfd0x70按键90xb0按键20xb0按键0xd0按键30xd0按键00xe0按键40xe0按键P2=0xfb0x70按键5P2=0xfe0x70按键0xb0按键60xb0按键0xd0按键70xd0按键OK0xe0按键80xe0按键Esc通过不同的按键,实现不同的功能选择。(五)实验操作电子时钟的操作方法,如下图:下面,具体介绍各功能使用方法:1、 计算器功能,如下图:2、
6、时钟功能,如下图:3、 秒表倒计时功能,如下图:(六)时钟误差分析在51定时器做电子钟的误差分析里,有3项:1、机器周期误差,由晶体频率相对变化的误差产生;2、中断响应延迟误差;3、调整精度产生的误差,就是计数初值改变1对应的时间差。定时器是独立于CPU的硬件计数器,对于89C51CPU只管理启动和装初值。一旦定时器启动之后,就一直在计数,在定时器溢出后会从0重新开始计数,不存在等待问题。所以,定时的误差除了晶体自身的误差(主要指晶体的频率漂移误差,而晶体频率偏离标称值的固定的绝对误差是可以修正的)以外,就是来自从定时器溢出中断到装初值这段时间的误差,由于从溢出到响应中断的时间不确定,所以存在
7、不定的误差。而在我的程序中,是每50ms产生一次中断,每次进入中断之后,重新赋初值,即会每50ms赋一次初值。在实际测试时,发现每一分钟就会慢1s,所以一个小时下来基本上就有一分钟的误差了。出现这个现象的原因也是因为一开始我并没有考虑到误差这个问题。考虑到这个问题后,我也试着去想一些办法解决这个精度问题。解决方法有一下几种:1)配上收音头,1小时或1天收一次中央台的哨声用于校正,可保证累积误差最少;2)可以用定时器方式2自动装入初值的方法,从而解决了由于定时器重载后,定时器才重新开始计数,而导致的延迟;3)选择比较好的晶振,减少由于晶振产生的误差。(七)实验感想通过这次实验,我掌握了单片机的P
8、0口、P1口以及P2口的基本功能的使用,学会了在Keil下用c语言编写单片机程序的能力。在硬件设计及软件编程方面,都有了较大的提升。会用程序的编写,来实现自己设计的功能。在硬件电路方面,起先在实验是的实验箱上做实验,后来发现实验箱都很不稳定,容易出现“通讯出错”的问题。于是,后来自己买了一块开发板。之后通过对该开发板上的资源的学习,熟练掌握了开发板的硬件电路原理之后,便开始自己编写程序。利用开发上的资源,实现自己设计的功能。在软件编程方面,一向习惯用c语言编写程序的我,感觉在掌握了硬件电路之后,在软件编程上还是比较简单的。通过几天的奋战,终于把所有功能都实现了,代码也是比较多。由于自己开始时并
9、没有注意各个变量的命名使用,所以,在做后来的代码优化时,发现还是比较乱一点的。代码不易修改。这也是我今后编写程序时需要注意的问题。最后就是电路板的焊接,由于对硬件电路已经比较熟悉了,所以,在电路板的设计上,并没有花多长时间。焊接完毕之后,发现自己的焊接工艺仍需要提高,但是,由于注意到不能乱“飞线”的问题,所以,这个电路板在这个方面还是做到了。附件:程序全部#include#include#define uint unsigned int unsigned char code Select=0x00,0x07,0x0b,0x0d,0x0e;/全亮,第一个,第二个,第三个,第四个 /code说明把
10、这个表格里面的数据存在程序存储器中unsigned char code LED_CODES= 0x02,0x9e,0x24,0x0c,0x98,/0-4 0x48,0x40,0x1e,0x00,0x08,/5-9 0x10,0xc0,0x62,0x84,0x60,0x70,/A,b,C,d,E,F 0xFe,0x30,0x90,0x7e,0xBe,0xfc/空格(16),P,H,-,|, ;uint zhuantai,flag=0,i=0,weixuan1=0,weixuan2=0,flag1=0,flag2=0,anci=1,qianwei1=0,baiwei1=0,shiwei1=0,ge
11、wei1=0,qianwei2=0,baiwei2=0,shiwei2=0,gewei2=0;uint num1=3;uint num2=2;uint num3=1;uint num4=17,jieguo1=0;int jieguo2=0;uint qianwei3=0,baiwei3=0,shiwei3=0,gewei3=0,/*flag1=0,*/flagjisuanqi=0,flagshizhong=0,flagled=0,flagmiaobiao=0,flagmiaobiao2=0,flagzanting=0;uint flagshi=0,flagfen=0,flagmiao=0,fl
12、agzuoyi=0,yiwei=0,flagyiwei=0,flagnaozhong=0;uint j4=0,j3=9,j2=5,j1=1,j0=1,tt,ttm=0,jm4=0,jm3=0,jm2=0,jm1=0,jm0=0;sbit ledkg=P32;sbit BUZ=P36;void delay(uint z)/延时子程序1s uint i,j; for(j=z;j0;j-) for(i=110;i0;i-);void display(uint x,uint y)/显示函数 uint i,j; i=x;j=y; P1=Selecti; P0=LED_CODESj;void displa
13、y2(uint a,uint b,uint c,uint d)/显示函数2 uint i,j,m,n; i=a;j=b;m=c;n=d; display(1,i); delay(5); display(2,j); delay(5); display(3,m); delay(5); display(4,n); delay(5);void display3()/显示函数3 uint i; for(i=10;i0;i-) delay(5); display2(num4,num3,num2,num1); void qingling()/清零函数 num4=0;num3=0;num2=0;num1=0;
14、anci=1; qianwei1=0;baiwei1=0;shiwei1=0;gewei1=0;qianwei2=0;baiwei2=0;shiwei2=0;gewei2=0;qianwei3=0;baiwei3=0;shiwei3=0;gewei3=0; jieguo1=0;jieguo2=0;flagzanting=1;jm0=0;jm1=0;jm2=0;jm3=0;void beijiashu()/被加数存储函数 if(num4=16)num4=0;if(num3=16)num3=0;if(num2=16)num2=0;if(num1=16)num4=14;num3=10;num2=10
15、;num1=0; qianwei1=num4;baiwei1=num3;shiwei1=num2;gewei1=num1; jieguo1=qianwei1*1000+baiwei1*100+shiwei1*10+gewei1;flag1=1; num4=16;num3=16;num2=16;num1=16;/anci=0;void beijianshu()/被减数存储函数 if(num4=16)num4=0;if(num3=16)num3=0;if(num2=16)num2=0;if(num1=16)num4=0;num3=0;num2=0;num1=0; qianwei1=num4;bai
16、wei1=num3;shiwei1=num2;gewei1=num1; jieguo1=qianwei1*1000+baiwei1*100+shiwei1*10+gewei1;flag1=2; num4=16;num3=16;num2=16;num1=16;/anci=0;void jiashu()/加数存储函数 if(num4=16)num4=0;if(num3=16)num3=0;if(num2=16)num2=0;if(num1=16)num4=14;num3=10;num2=10;num1=0; qianwei2=num4;baiwei2=num3;shiwei2=num2;gewei
17、2=num1; jieguo2=jieguo1+qianwei2*1000+baiwei2*100+shiwei2*10+gewei2; if(jieguo29999) num4=14;num3=10;num2=10;num1=0; else if(jieguo2/1000=0)num4=16;else num4=jieguo2/1000; if(jieguo2%1000)/100=0&jieguo2/1000=0)num3=16;else num3=(jieguo2%1000)/100; if(jieguo2%1000%100/10=0&(jieguo2%1000)/100=0&jieguo
18、2/1000=0)num2=16;else num2=jieguo2%1000%100/10; num1=jieguo2%10; void jianshu()/减数存储函数 if(num4=16)num4=0;if(num3=16)num3=0;if(num2=16)num2=0;if(num1=16)num4=14;num3=10;num2=10;num1=0; qianwei2=num4;baiwei2=num3;shiwei2=num2;gewei2=num1; jieguo2=jieguo1-(qianwei2*1000+baiwei2*100+shiwei2*10+gewei2);
19、if(jieguo2-9) num4=16;num3=16;num2=21;num1=abs(jieguo2); else if(jieguo2-99) num4=16;num3=21;num2=abs(jieguo2)/10;num1=abs(jieguo2)%10; else if(jieguo2=-999) num4=21;num3=abs(jieguo2)/100;num2=abs(jieguo2)%100/10;num1=abs(jieguo2)%10; else num4=14;num3=10;num2=10;num1=0; else if(jieguo2/1000=0)num4=
20、16;else num4=jieguo2/1000; if(jieguo2%1000)/100=0&jieguo2/1000=0)num3=16;else num3=(jieguo2%1000)/100; if(jieguo2%1000%100/10=0&(jieguo2%1000)/100=0&jieguo2/1000=0)num2=16;else num2=jieguo2%1000%100/10; num1=jieguo2%10; void anjian(uint cishu,uint chuzhi) uint n;uint m;n=cishu;m=chuzhi; if(n=1)num1=
21、m; else if(n=2) num2=num1;num1=m; else if(n=3) num3=num2;num2=num1;num1=m; else if(n=4) num4=num3;num3=num2;num2=num1;num1=m; else num4=num3;num3=num2;num2=num1;num1=m; void jianpan()/=键盘计算器函数1=/ uint ma; display2(num4,num3,num2,num1); P2=0xf7; zhuantai=P2; zhuantai=zhuantai&0xf0; while(zhuantai!=0x
22、f0) delay(5); zhuantai=P2; zhuantai=zhuantai&0xf0; if(zhuantai!=0xf0) switch(zhuantai) case 0x70 :display3();ma=1;anjian(anci,ma);display2(num4,num3,num2,num1);anci+;break;/按键1 case 0xb0 :display3();ma=2;anjian(anci,ma);display2(num4,num3,num2,num1);anci+;break;/按键2 case 0xd0 :display3();ma=3;anjian
23、(anci,ma);display2(num4,num3,num2,num1);anci+;break;/按键3 case 0xe0 :display3();ma=4;anjian(anci,ma);display2(num4,num3,num2,num1);anci+;break;/按键4 /=/ P2=0xfb; zhuantai=P2; zhuantai=zhuantai&0xf0; while(zhuantai!=0xf0) delay(5); zhuantai=P2; zhuantai=zhuantai&0xf0; if(zhuantai!=0xf0) switch(zhuantai
24、) case 0x70 :display3();ma=5;anjian(anci,ma);display2(num4,num3,num2,num1);anci+;break;/按键5 case 0xb0 :display3();ma=6;anjian(anci,ma);display2(num4,num3,num2,num1);anci+;break;/按键6 case 0xd0 :display3();ma=7;anjian(anci,ma);display2(num4,num3,num2,num1);anci+;break;/按键7 case 0xe0 :display3();ma=8;a
25、njian(anci,ma);display2(num4,num3,num2,num1);anci+;break;/按键8 /=/ P2=0xfd; zhuantai=P2; zhuantai=zhuantai&0xf0; while(zhuantai!=0xf0) delay(5); zhuantai=P2; zhuantai=zhuantai&0xf0; if(zhuantai!=0xf0) switch(zhuantai) case 0x70 :display3();ma=9;anjian(anci,ma);display2(num4,num3,num2,num1);anci+;brea
26、k;/按键9 case 0xb0 :display3();ma=0;anjian(anci,ma);display2(num4,num3,num2,num1);anci+;break;/按键0 case 0xd0 :if(flagshizhong=0)qingling();num4=16;num3=16;num2=16;num1=16;else if(flagshizhong=1)display2(num4,num3,num2,num1);display2(num4,num3,num2,num1);break;/清零 case 0xe0 :display2(num4,num3,num2,num
27、1);break;/无效按键 /=/ P2=0xfe; zhuantai=P2; zhuantai=zhuantai&0xf0; while(zhuantai!=0xf0) delay(5); zhuantai=P2; zhuantai=zhuantai&0xf0; if(zhuantai!=0xf0) switch(zhuantai) case 0x70 :display3();if(flagshizhong=0)beijiashu();display2(num4,num3,num2,num1);else if(flagshizhong=1)display2(num4,num3,num2,num1);break;/加法 case 0xb0 :display3();if(flagshizhong=0)
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2