• / 15

非常好的资料_秒表时钟程序_c语言_51单片机_Proteus仿真_均包括.doc

资源描述:
《非常好的资料_秒表时钟程序_c语言_51单片机_Proteus仿真_均包括.doc》由本站会员分享,支持在线阅读,更多《非常好的资料_秒表时钟程序_c语言_51单片机_Proteus仿真_均包括已确认.doc》相关的内容可在三九文库网上搜索。

电子工程训练实验报告题目:秒表系统的设计和工程实现系班:学号:姓名:大连理工大学电工电子实验中心电子安装实验室一.单片机系统设计方案描述系统设计基本指标:1.实现最大时间长度超过5分钟的正常倒计时2.可以在5分钟范围内自由方面设置秒表的开始时间3.进入最后一分钟时,三声蜂鸣器响提示4.秒表计时到,五声蜂鸣器响,同时小灯亮提示电子工程训练是一个综合性实验。秒表系统设计总体上分为硬件设计和软件设计两个部分,并要充分考虑它们的匹配设计。硬件设计特别是引脚的配置要充分考虑软件实现的需要。

反过来,软件设计也要建立在硬件的基础上,并且充分利用硬件提供的资源。硬件电路大体上可分为最小系统板电路、数码管显示电路和按键电路。最小系统板电路和数码管显示电路在老师指导下很快得以完成。按键电路为充分考虑以后软件设计的灵活性和可扩展形,采用了排线将引脚引出。软件设计上,为方便秒表的操作使用,设置了“修改”、“增加”、“移位”和“开始/暂停”四个按键功能。“修改”键按下,进入修改状态,相应的修改位闪烁,提示按“增加”键修改该位时间参数,操作“移位“按键可以移动修改位。“开始暂停”则用于秒表的开始运行和暂停运行。按键处理通常有查询和中断两种方式处理,查询占用较多的单片机运行资源,而且延迟防抖效果较差。

容易多次触发,而中断方式消抖则操作更为灵敏。同时考虑到AT89S52只有两个外部中断,将使用较多的“增加”和“开始/暂停”两个按键处理分配给两个外部中断。另外两个按键则采用查询方式检测处理。软件设计整体上利用了“有限状态机”的思想,按键控制状态的转换,并在相应的状态下执行相应的操作。一共设置了3个状态:state=0(暂停状态),state=1(开始运行状态),state=2(修改状态),它们的相互转化如下:由于本人之前接触过一些仿真软件Proteus的知识,而本系统设计所需要的单片机、按键、数码管、蜂鸣器等硬件均可在Proteus得到仿真。在程序的编写调试过程中,可以完全脱离硬件,高效率的完成了程序的编写调试。

二.硬件原理图(电路原理图、硬件仿真图)Proteus仿真图三.系统流程图:1.主程序流程图2.修改状态数据操作和数码管显示3.开始状态的数码管显示4暂停状态的数码管显示较为简单,根据保留的时间参数,刷新数码管,保持刚才的时间显示。5中断INT0修改时间的流程图6中断INT1开始与暂停状态的切换,程序较为简单,按键触发时,在state为1(开始状态)和state为0(暂停状态)来回切换。四、程序#include#defineulongunsignedlongchartab[]={0xc0。

0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};chartabdp[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x58,0x00,0x10};#defineLEDP0//P0为数码管的段选#defineWSP1//P1为数码管的位选sbittimeshift=P3^0;//P3^0为"移位"按键sbittimeset=P3^1;//P3^1为"修改"按键sbitsetinc=P3^2;//P3^2为"增加"按键sbittimerun=P3^3。

//P3^3为"计时开始暂停"按键sbitLIGHT=P2^0;sbitSPEAKER=P2^7;unsignedcharsec,min,secge,secshi,minge,minshi,t;//定义秒,分,时,秒的个位,十位,分的个位,十位intstate;//秒表状态指示0计时暂停1正在倒计时2计时时间参数修改intflag;//秒表修改数据指示0分钟十位1分钟个位2秒钟十位3秒钟个位intblink;//voidinit();voiddisplayrun();voiddisplaypause();voiddelay(int)。

voidtimemodify();//voidmain(){init();state=0;flag=0;blink=1;t=0;LIGHT=1;SPEAKER=1;min=5;sec=0;secge=0;//秒的个位和十位secshi=0;minge=5;//分的个位和十位minshi=0;while(1){if(timeset==0)//如果"调时"按键按下{delay(5);//延时去抖if(timeset==0)state=2;}if(state==0){TR0=0。

TR1=0;displaypause();}if(state==1){TR0=1;TR1=0;displayrun();}if(state==2){TR1=1;timemodify();}}}//voidinit(){TMOD=0x11;EA=1;//开总中断ET0=0;ET1=0;//定义定时器0工定时器1作与方式1TH0=0x4d;//定时器0赋初值TL0=oxfc;TH1=15536/256;//定时器1赋初值TL1=15536%256;//中断初始化EX0=1;PX0=0;IT0=1;EX1=1;PX1=1;IT1=1;}//外中断1voidINT1()interrupt2using0{if(timerun==0)//表示按钮有按下{delay(20);//延时if(timerun==0){state=(state+1)%2;LIGHT=1;SPEAKER=1;}}}//外中断0voidINT0()interrupt0using1{if(setinc==0)//表示按钮有按下{delay(20);//延时去抖if(setinc==0){switch(flag)//分支结构。

根据flag的值来判断哪一位加1{case0:{min=(min+10)%60;break;}case1:{min=(min+1)%10+min/10*10;break;}case2:{sec=(sec+10)%60;break;}case3:{sec=(sec+1)%10+sec/10*10;break;}default:break;}}}}//延时子函数voiddelay(intx){inti,j;for(i=x;i>0l;i)for(j=255;j>0;j);}//显示子函数voiddisplayrun(){if(TF0==1)//如果定时器溢出{TF0=0;//清中断标志位t++;if(t==20){t=0;if(min==0&&sec==0){min=60;}if(sec==0){sec=59;min;}elsesec;if(min==0&&sec>56){SPEAKER=0;delay(20);SPEAKER=1;}if(min==0&&sec==0){LIGHT=0;SPEAKER=0;delay(20);SPEAKER=1;delay(240);SPEAKER=0;delay(20);SPEAKER=1;delay(240);SPEAKER=0;delay(20);SPEAKER=1;delay(240);SPEAKER=0;delay(20);SPEAKER=1;delay(240);SPEAKER=0;delay(20);SPEAKER=1;state=4;min=5;//回归初始化sec=0;secge=0;//秒的个位和十位secshi=0;minge=5;//分的个位和十位minshi=0;}}}secge=sec%10;//秒的个位和十位secshi=sec/10;minge=min%10;//分的个位和十位minshi=min/10;WS=0xfe;//循环扫描LED=tab[secge];delay(1);WS=0xfd;LED=tab[secshi];delay(1);WS=0xfb;LED=tabdp[minge];delay(1);WS=0xf7;LED=tab[minshi];delay(1);}voiddisplaypause(){WS=0xfe;//循环扫描LED=tab[secge];delay(1);WS=0xfd;LED=tab[secshi];delay(1);WS=0xfb;LED=tabdp[minge];delay(1);WS=0xf7;LED=tab[minshi];delay(1);}voidtimemodify(){//修改位的闪烁状态if(TF1==1){TF1=0;blink=(blink+1)%2;}//修改具体哪个数码管指示if(timeshift==0){delay(60);if(timeshift==0)flag=(flag+1)%4;}//修改状态下的数码管显示switch(flag)//分支结构。

根据flag的值来决定扫描状态{case0:{secge=sec%10;//秒的个位和十位secshi=sec/10;minge=min%10;//分的个位和十位minshi=min/10;WS=0xfe;//循环扫描LED=tab[secge];delay(1);WS=0xfd;LED=tab[secshi];delay(1);WS=0xfb;LED=tabdp[minge];delay(1);if(blink==1){WS=0xf7;LED=tab[minshi];delay(1);}break。

}case1:{secge=sec%10;//秒的个位和十位secshi=sec/10;minge=min%10;//分的个位和十位minshi=min/10;WS=0xfe;//循环扫描LED=tab[secge];delay(1);WS=0xfd;LED=tab[secshi];delay(1);if(blink==1){WS=0xfb;LED=tabdp[minge];delay(1);}WS=0xf7;LED=tab[minshi];delay(1);break;}case2:{secge=sec%10。

//秒的个位和十位secshi=sec/10;minge=min%10;//分的个位和十位minshi=min/10;WS=0xfe;//循环扫描LED=tab[secge];delay(1);if(blink==1){WS=0xfd;LED=tab[secshi];delay(1);}WS=0xfb;LED=tabdp[minge];delay(1);WS=0xf7;LED=tab[minshi];delay(1);break;}case3:{secge=sec%10;//秒的个位和十位secshi=sec/10。

minge=min%10;//分的个位和十位minshi=min/10;if(blink==1){WS=0xfe;//循环扫描LED=tab[secge];delay(1);}WS=0xfd;LED=tab[secshi];delay(1);WS=0xfb;LED=tabdp[minge];delay(1);WS=0xf7;LED=tab[minshi];delay(1);break;}default:break;}}五.问题及解决方案1.刚开始焊接电路时,直接使用焊锡引导作为导线。

焊接效果很差。解决方法:后来请教同学得知可以使用铁丝引导焊锡焊接连线,得到了很好的效果。2数码管显示电路相对较为复杂,布线较多,很容易发生虚焊、忘焊的情况,检查电路问题时遇到了瓶颈,感觉问题错综复杂,难以入手。解决方法:后来在老师的帮助下,上电挨个测试每个数码管的每个发光二极管工作情况,很快定位出了硬件电路问题,提高了工作效率。3.按键电路刚开始焊接后测试,声音较小。解决方法:后来增加了旁路电容,效果改善很多。4.刚开始利用Proteus调试编写程序,按键使用中断方式,并没有正确触发处理。后来在硬件上直接在线调试程序,立刻得到了正确的结果。在网上查询了很多资料,可能是Proteus并不支持中断仿真。

六.体会电子工程训练是一门综合性较强的实验,在软件编程和硬件设计上都受到了很好的锻炼。技术上的问题在上一栏中已经详细地叙述过了,这里我们想说一下技术之外的心理上的感受:“实践出真知”,“实践是检验真理的唯一标准”,这些话都说明了实践在追求真理的过程中的重要性。在训练的过程中,我们发现以前学的很多知识在动手操作的过程中都立体丰富了许多,同时也补充了很多我们所不知道的细节,比如按键的消抖处理和电路中地线和电源线应该分离布设效果较好。通常我们在学习之后不会在实践中很好的把它们运用到一起,说白了就是用得不够自如,说到底还是学得不够灵活。但通过训练我们意识到了这一点,而且我们也认识了很多芯片。

展开阅读全文
 温馨提示:
下载提示
关于本文
本文标题:非常好的资料_秒表时钟程序_c语言_51单片机_Proteus仿真_均包括.doc
链接地址:https://www.999doc.com/662375.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 联系我们

copyright © 2016-2021  999doc三九文库网 版权所有

经营许可证编号:苏ICP备2020069977号  网站客服QQ:772773258  联系电话:0518-83073133