基于单片机的六位智能秒表设计与实现
- 格式:doc
- 大小:547.00 KB
- 文档页数:5
单⽚机课程设计6位数字显⽰计时(DOC)单⽚机课程设计报告书课题: 6 位数显频率计数器院(系):机电⼯程学院专业:机械设计制造及其⾃动化姓名:学号:2014年1⽉14⽇⽬录⼀、前⾔----------------------------------------------------1.1、课程设计任务------------------------------------------------1.2、课程设计任务完成要求------------------------1.3、设计⽬的-----------------------------------------------------⼆、⽅案提出与论证-------------------------------------2.1频率测量原理与⽅法-----------------------------------三、系统硬件设计----------------------------------------3.1电路原理图总图-------------------------------------------------3.1.1电源供电电路--------------------------------------------------3.1.2 单⽚机时钟电路----------------------------------------------3.1.3单⽚机复位电路-----------------------------------------------3.1.4显⽰及驱动电路-----------------------------------------------3 .2 AT89C51单⽚机芯⽚的功能及其参数------------------四、系统软件设计----------------------------------------4.1软件流程图-------------------------------------------------------4.2程序调试及误差分析-------------------------------------------五、制作PCB板及焊接元件调试--------------------六、元器件明细表----------------------------------------七、实验总结-------------------------------⼋、参考⽂献----------------------------------------------题⽬四:6位数显频率计数器⼀前⾔数字频率计是计算机、通讯设备、⾳频视频等科研⽣产领域不可缺少的测量仪器。
电气与自动化工程学院卓越工程师培养计划暑期实训报告题目秒表系统的设计年级11级专业自动化班级卓越班学号*********姓名俞雷地点大学生创新实验室日期2012年8月12日~2012年8月20日目录一、单片机简介............................................................................- 2 -二、设计目标................................................................................- 3 -1、设计目的: (3)2、具体操作: (3)三、硬件设计................................................................................- 4 -原理图:. (4)四、系统的软件设计....................................................................- 5 -1、软件整体设计思路: (5)2、软件流程图: (5)3、程序: (6)(1)数码管秒表显示程序: ...................................................- 6 -(2)1602液晶秒表显示程序:............................................ - 13 -五、系统的调试及设计结果..................................................... - 18 -1602液晶——秒表显示效果图:. (18)LED数码管——秒表显示效果图: (18)六、创新实验室课程设计小结................................................. - 19 -一、单片机简介单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统,数据采集系统、智能化仪器仪表,及通讯设备、日常消费类产品、玩具等。
基于51单片机秒表的程序设计1.设计目的:(1)利用单片机定时器中断和定时器计数方式实现秒、分定时。
(2)通过LED显示程序的调整,熟悉8155与8051,8155与LED的接口技术,熟悉LED动态显示的控制过程。
(3)通过键盘程序的调整,熟悉8155与矩阵式键盘的接口技术,熟悉键盘扫描原理。
(4)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示、键盘扫描和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。
2.设计步骤与要求(1)要求:以8位LED右边2位显示秒,左边6位显示0,实现秒表计时显示。
以4×4矩阵键盘的KE0、KE1、KE2等3键分别实现启动、停止、清零等功能。
(2)方法:用单片机定时器T0中断方式,实现1秒定时;利用单片机定时器1方式3计数,实现60秒计数。
用动态显示方式实现秒表计时显示,用键盘扫描方式取得KE0、KE1、KE2的键值,用键盘处理程序实现秒表的启动、停止、清零等功能。
(3)软件设计:软件整体设计思路是以键盘扫描和键盘处理作为主程序,LED动态显示作为子程序。
二者间的联系是:主程序查询有无按键,无按键时,调用二次LED动态显示子程序(约延时8ms)后再回到按键查询状态,不断循环;有按键时,LED动态显示子程序作为按键防抖延时被连续调用二次(约延时16ms),待按键处理程序执行完后,再回到按键查询状态,同时兼顾了按键扫描取值的准确性和LED动态显示的稳定性。
秒定时采用定时器T0中断方式进行,60秒计数由定时器1采用方式3完成,中断及计数的开启与关闭受控于按键处理程序。
由上述设计思路可设计出软件流程图如图1.1所示。
(5)程序编制:编程时置KE0键为“启动”,置KE1键为“停止”,置KE2键为“清零”,因按键较少,在处理按键值时未采用散转指令“JMP”,而是采用条件转移指令“CJNE”,每条指令后紧跟着一条无条件跳转指令“AJMP”,转至相应的按键处理程序,如不是上述3个按键值则跳回按键查询状态。
单片机课程设计_基于单片机的数字秒表设计在当今科技迅速发展的时代,电子设备的应用无处不在,其中数字秒表作为一种常见的计时工具,具有广泛的应用场景,如体育比赛、科学实验、工业生产等。
本次课程设计旨在基于单片机技术实现一个数字秒表,通过对硬件电路的设计和软件程序的编写,掌握单片机系统的开发流程和方法,提高实践动手能力和解决问题的能力。
一、设计要求1、能够实现秒表的启动、暂停、复位功能。
2、计时精度达到 001 秒。
3、能够通过数码管显示计时结果。
二、系统方案设计1、硬件设计单片机选型:选用常见的 STC89C52 单片机作为核心控制器,其具有性能稳定、价格低廉、易于编程等优点。
显示模块:采用 8 位共阴极数码管作为显示器件,通过动态扫描的方式实现数字的显示。
按键模块:设置三个独立按键,分别用于启动、暂停和复位操作。
时钟模块:使用单片机内部的定时器/计数器产生精确的时钟信号,实现计时功能。
2、软件设计主程序:负责系统的初始化、按键扫描和计时处理等。
中断服务程序:利用定时器中断实现 001 秒的定时,更新计时数据。
三、硬件电路设计1、单片机最小系统包括单片机芯片、晶振电路和复位电路。
晶振频率选择 12MHz,为单片机提供时钟信号。
复位电路采用上电复位和手动复位相结合的方式,确保系统能够可靠复位。
2、显示电路将 8 位数码管的段选引脚通过限流电阻连接到单片机的 P0 口,位选引脚通过三极管连接到单片机的 P2 口。
通过动态扫描的方式,依次点亮每个数码管,实现数字的显示。
3、按键电路三个按键分别连接到单片机的 P10、P11 和 P12 引脚,采用低电平有效。
当按键按下时,相应引脚的电平被拉低,单片机通过检测引脚电平的变化来判断按键的操作。
四、软件程序设计1、主程序流程系统初始化后,进入主循环。
在主循环中,不断扫描按键状态,如果检测到启动按键按下,则启动计时;如果检测到暂停按键按下,则暂停计时;如果检测到复位按键按下,则将计时数据清零。
利用51单片机制作六位的电子数字钟关键字:电子钟,数字钟,51单片机摘要:对于学习单片机而言这个程序是一道门槛,掌握了电子钟程序,基本上51单片机就掌握了80%。
常见的电子钟程序由显示部分,计算部分,时钟调整部分构成,这样程序就有了一定的长度和难度。
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。
10秒位到5后,即59秒,分钟加1,10秒位回0。
依次类推,时钟最大的显示值为23小时59分59秒。
这里只要确定了1秒的定时时间,其他位均以此为基准往上累加。
开始程序定义了秒,十秒,分,十分,小时,十小时,共6位的寄存器,分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。
电路原理图:为了节省硬件资源,电路部分采用6位共阳极动态扫描数码管,数码管的段位并联接在51单片机的p0口,控制位分别由6个2N5401的PNP三极管作驱动接在单片机的p2.1,p2.2,p2.3,p2.4,p2.5,p2.6口。
从标号star开始把这些位全部清除为0,从而保证了开始时显示时间为0时0分0秒。
然后是程序的计算部分:inc a_bit(秒位),这里用到了一个inc指令,意思是加1,程序运行到这里自动加1。
然后把加1后的数据送acc:mov a,a_bit (秒位),这时出现了一个问题,如果不断往上加数字不会加爆?所以有了下面的一句话cjne a,#10,stlop; 如果秒位到10那么转到10秒处理程序。
cjne是比较的意思,比较如果a等于10 就转移到10秒处理程序,实际上也就限定了在这里a的值最大只能为9,同时mov a_bit,#00h,这时a_bit(秒位)被强行清空为0,又开始下一轮的计数。
秒位处理完了到下面10秒的处理程序:inc b_bit,把10秒位b_bit加1,由于程序开始对各位的寄存器已经清0,这时10秒位就变成1 ,然后同样送到累加器ACC:mov a,b_bit 现在开始新一轮的10秒位计数cjne a,#6,stlop 如果10秒到了6那么到分位处理程序。
主电源引脚Vss和Vcc①Vss接地②Vcc正常操作时为+5伏电源外接晶振引脚XTAL1和XTAL2①XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。
当采用外部振荡器时,此引脚接地。
②XTAL2内部振荡电路反相放大器的输出端。
是外接晶体的另一端。
当采用外部振荡器时,此引脚接外部振荡源。
图1.2 8051单片机引脚图控制或与其它电源复用引脚RST/VPD,ALE/PROG,PSEN和EA/Vpp①RST/VPD 当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位在Vcc掉电期间,此引脚可接上备用电源,由VPD向内部提供备用电源,以保持内部RAM中的数据。
接电源及额定段导通电流来确定相应的限流电阻。
图1.4 (a)数码管引脚图(b)共阳极内部结构图(c)共阴极内部结构图本设计采用共阴极数码显示管做显示电路,由于采用的是共阴的数码显示管,所以只要数码管的a、b、c、d、e、f、g、h引脚为高电平,那么其对应的二极管就会发光,使数码显示管显示0~9的编码见表1.1。
表1.1 共阴极数码显示管字型代码字型共阴极代码字型共阴极代码0 3FH 5 6DH1 06H 6 7DH2 5BH 7 07H3 4FH 8 7FH4 66H 9 6FH动态显示电路由显示块、字形码驱动模块、字位驱动模块三部分组成。
如图1.3所示为本系统的5位LED动态显示器接口电路。
图中,5个数码管的8段段选线分别与外接上拉电阻的单片机P0口对应相连,而5个数码管的位控制端则和NPN型三极管的集电极相连接。
单片机的P2.0~P2.4口则分别对应数码显示管的最低位到最高位,P2.0~P2.4口分别和五个NPN型三极管的基极相连,做三极管导通的控制端,而NPN型三极管选用9013型三极管。
根据9013的资料显示:其耐压值为40V,最大功率为0.65W,最大反向放大器所构成的振荡电路,XTAL1和XTAL2分别为振荡电路的输入和输出端,8051单片机的时钟信号通常用两种电路形式得到:内部振荡方式与外部振荡方式。
《6位单片机电子钟》一.硬件电路设计:我们此次设计的电子钟采用2个3位共阳LED数码管作为显示器件,以STC89C52单片机作为控制器,可以显示时分秒。
具体电路设计如下图:二:源程序:#include "at89x52.h"#define uchar unsigned char#define uint unsigned intuchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x42,0x78,0x00,0x10};uchar n;uchar hh,mm,ss;uchar nhh,nmm,nss;uint year;uchar day,mon,week;uchar hhs,hhg,mms,mmg,sss,ssg;uchar days,dayg,mons,mong;uchar nhhs,nhhg,nmms,nmmg,nsss,nssg;uchar set1=1,set2=1;sbit fm=P3^6;sbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年void jishi();void baoshi();void alarm();void set_time();void set_alarm();void set_mdw();void key_change();void key_set();void delay(int m) //延时程序,延时m*0.5ms{uint i;uint j;for (i=0;i<m;i++){for(j=0;j<50;j++);}}void timer0( ) interrupt 1{TMOD=0x01;TH0=0x3c;TL0=0xb1;n++;jishi();}main(){TMOD=0x01;TH0=0x3c;TL0=0xb1;TR0=1;EA=1;ET0=1;hh=23;mm=59;ss=50;nhh=7;nmm=30;nss=0;year=2008;mon=12;day=1;week=1;while(1){hhs=hh/10;//时分秒hhg=hh%10;mms=mm/10;mmg=mm%10;sss=ss/10;ssg=ss%10;nhhs=nhh/10;//闹钟nhhg=nhh%10;nmms=nmm/10;nmmg=nmm%10;nsss=nss/10;nssg=nss%10;days=day/10;//月日dayg=day%10;mons=mon/10;mong=mon%10;key_change(); //k1按键扫描key_set(); //k2按键扫描set_time(); //设置时间set_mdw(); //设置月日星期set_alarm(); //设置闹钟if(set1==1) //正常走时显示{P0=tab[hhs];P2_5=0;delay(1);P2_5=1;//时十位P0=tab1[hhg];P2_4=0;delay(1);P2_4=1;//时个位P0=tab[mms];P2_3=0;delay(1);P2_3=1;//分十位P0=tab1[mmg];P2_2=0;delay(1);P2_2=1;//分个位P0=tab[sss];P2_1=0;delay(1);P2_1=1;//秒十位P0=tab[ssg];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==2) //设置时间{P0=tab[hhs];P2_5=0;delay(1);P2_5=1;//时十位P0=tab1[hhg];P2_4=0;delay(1);P2_4=1;//时个位P0=tab[mms];P2_3=0;delay(1);P2_3=1;//分十位P0=tab1[mmg];P2_2=0;delay(1);P2_2=1;//分个位P0=tab[sss];P2_1=0;delay(1);P2_1=1;//秒十位P0=tab[ssg];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==3) //正常显示月日-星期{P0=tab[mons];P2_5=0;delay(1);P2_5=1;//时十位P0=tab1[mong];P2_4=0;delay(1);P2_4=1;//时个位P0=tab[days];P2_3=0;delay(1);P2_3=1;//分十位P0=tab1[dayg];P2_2=0;delay(1);P2_2=1;//分个位P0=tab[11];P2_1=0;delay(1);P2_1=1;//秒十位P0=tab[week];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==4) //设置月日-星期{P0=tab[mons];P2_5=0;delay(1);P2_5=1;//时十位P0=tab[mong];P2_4=0;delay(1);P2_4=1;//时个位P0=tab[days];P2_3=0;delay(1);P2_3=1;//分十位P0=tab[dayg];P2_2=0;delay(1);P2_2=1;//分个位P0=tab[11];P2_1=0;delay(1);P2_1=1;//秒十位P0=tab[week];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==5) //正常显示定时{P0=tab[nhhs];P2_5=0;delay(1);P2_5=1;//时十位P0=tab[nhhg];P2_4=0;delay(1);P2_4=1;//时个位P0=tab[nmms];P2_3=0;delay(1);P2_3=1;//分十位P0=tab[nmmg];P2_2=0;delay(1);P2_2=1;//分个位P0=tab[nsss];P2_1=0;delay(1);P2_1=1;//秒十位P0=tab[nssg];P2_0=0;delay(1);P2_0=01;//秒个位}if(set1==6) //设置闹钟定时{P0=tab[nhhs];P2_5=0;delay(1);P2_5=1;//时十位P0=tab[nhhg];P2_4=0;delay(1);P2_4=1;//时个位P0=tab[nmms];P2_3=0;delay(1);P2_3=1;//分十位P0=tab[nmmg];P2_2=0;delay(1);P2_2=1;//分个位P0=tab[nsss];P2_1=0;delay(1);P2_1=1;//秒十位P0=tab[nssg];P2_0=0;delay(1);P2_0=01;//秒个位}baoshi(); //整点报时alarm(); //闹钟}}void jishi() //计时函数{if(n==20){n=0;ss++;if(ss==60){ss=0;mm++;if(mm==60){mm=0;hh++;if(hh==24){hh=0;day++;week++;if(week==8){week=0;}if(year%4==0&&year%100!=0||year%400==0) //闰年{if(day==table1[mon]+1){day=0;mon++;if(mon==13){mon=0;year++;}}}else //非闰年{if(day==table2[mon]+1){day=0;mon++;if(mon==13){mon=0;year++;}}}}}}}}uchar incone(uchar n) //加1函数{if(k3==0){delay(20);if(k3==0){n++;while(!k3);}}return(n);}uchar decone(uchar m) //减1函数{if(k4==0){delay(20);if(k4==0){m--;while(!k4);if(m<0){m=0;}}}return(m);}void key_change() //k1按键扫描{if(k1==0){delay(20);if(k1==0){set1++;while(!k1);if(set1==7){set1=1;}}}}void key_set() //k2按键扫描{if(k2==0){delay(20);if(k2==0){set2++;while(!k2);if(set2==4){set2=1;}}}}void baoshi() //整点报时函数{if(mm==00&&ss==00){fm=0;}if(ss==1){fm=1;}}void alarm( ) //闹钟函数{uchar x;if(nhh==0){goto end;}if(hh==nhh&&mm==nmm&&ss==nss) {for(x=0;x<6;x++){fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);fm=1;delay(180);}}end:;}void set_time() //设置时间函数{if(set1==2){if(set2==1){hh=incone(hh);if(hh==24){hh=0;}if(hh==-1){hh=23;}hh=decone(hh);}if(set2==2){mm=incone(mm);if(mm==60){mm=0;}if(mm==-1){mm=59;}mm=decone(mm);}if(set2==3){ss=incone(ss);if(ss==60){ss=0;}if(ss==-1){ss=59;}ss=decone(ss);}}}void set_mdw() //设置月日星期函数{if(set1==4){if(set2==1){mon=incone(mon);if(mon==13){mon=1;}mon=decone(mon);if(mon==0){mon=12;}}if(set2==2){day=incone(day);if(day==32){day=1;}day=decone(day);if(day==0){day=31;}}if(set2==3){week=incone(week);if(week==8){week=1;}week=decone(week);if(week==0){week=7;}}}}void set_alarm() //设置闹钟函数{if(set1==6){if(set2==1){nhh=incone(nhh);if(nhh==24){nhh=0;}if(nhh==-1){nhh=23;}nhh=decone(nhh);}if(set2==2){nmm=incone(nmm);if(nmm==60){nmm=0;}nmm=decone(nmm);if(nmm==-1){nmm=59;}}if(set2==3){nss=incone(nss);if(nss==60){nss=0;}nss=decone(nss);if(nss==-1){nss=59;}}}}合作者:吴肖,陈耀,张鹏程,徐煜。
基于单片机的时钟设计6位LED1. 引言时钟是我们日常生活中必不可少的工具之一。
设计一个基于单片机的6位LED时钟,不仅可以提供时间显示功能,还能够增加一些附加功能,如闹钟、计时器等。
本文将介绍基于单片机的时钟设计方案,并提供详细的电路原理图和源代码。
2. 设计思路基于单片机的时钟设计通常采用时分秒的显示方式,并通过按键进行时间的调整和功能的切换。
考虑到使用方便和成本等因素,我们选择采用6位LED数码管作为显示屏,并使用74HC595芯片进行驱动。
2.1 电路设计电路的主要部分包括单片机、时钟模块、数码管及驱动芯片。
单片机的核心是时钟芯片,用于计时和存储时间数据。
时钟模块提供了精确的时间信号,可以与单片机进行通信。
数码管通过74HC595芯片进行驱动,以实现数字的显示。
2.2 软件设计软件设计是基于单片机的时钟设计中非常重要的一环。
主要包括以下功能:•时间显示:将时、分、秒的数据转换为数码管的显示信息,并实现动态显示效果。
•时间调整:通过按键对时钟进行时间的调整,包括调整小时、分钟、秒钟。
•附加功能:实现闹钟、计时器等附加功能,可以通过按键进行设置和开关。
3. 电路原理图电路的原理图如下:+--------------+| 数码管 |+--------------+|+--------------------------+| 74HC595驱动芯片 |+--------------------------+|+--------------+| 单片机 |+--------------+|+---------------------+| 时钟模块 |+---------------------+4. 源代码以下是基于单片机的时钟设计的部分源代码示例:#include <reg52.h>sbit SCLK=P1^0; // 74HC595芯片时钟输入sbit RCLK=P1^1; // 74HC595芯片锁存输出sbit DIO=P1^2; // 74HC595芯片串行数据输入// 数字码表unsigned char code number[10]={0x3F, // 00x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 80x6F// 9};void delay(unsigned int t){unsigned int i, j;for(i=0; i<t; i++)for(j=0; j<123; j++);}void display(unsigned char *num){unsigned char i;for(i=0; i<8; i++){DIO = num[i];SCLK = 0;SCLK = 1;}RCLK = 0;RCLK = 1;}void main(){unsigned char time[8] = {0, 0, 0, 0, 0, 0, 0, 0};unsigned char i, j;while(1){// 获取当前时间// 进行时间调整// 显示时间display(time);// 延时0.5秒delay(500);}}5. 结语基于单片机的6位LED时钟设计,通过硬件和软件的设计实现了时间的显示和调整功能,并可以扩展其他附加功能。
RAM分配表单元地址用途30H 10毫秒计时31H 0.5秒计时32H 秒计数器33H 分计数器34H 时计数器35H 选位计数器位地址用途00H 键已按下标志01H 秒节拍显示标志(兼被修改位闪动标志)ORG 0000HLJMP STAORG 000BHLJMP T0_SUVSTA: MOV SP,#6FH ;设置堆栈MOV IE,#82H ;允许T0中断MOV TMOD,#02H ;定时器方式2MOB TH0,#06H ;定时时间500usMOV TL0,#06HMOV 30H,#14H ;10ms计时初值MOV 31H,#32H ;0.5s计时初值MOV 32H,#00H ;清秒计数器MOV 33H,#00H ;清分计数器MOV 34H,#00H ;清时计数器MOV 35H,#03H ;置选位计数器为非修改状态SETB TR0 ;启动定时器MAIN: MOV A,P3 ;取键盘ORL A,10001111B ;屏蔽非键盘输入位CJNE A,# 0FFH,LOOP1 ;有键按下转LOOP1SJMP LOOP2 ;无键按下,则跳过LOOP1: JB 00H,LOOP3 ;有键已按下标志,则跳过SETB 00H ;无标志置标志后查键JB P3.4,LOOP4 ;不是选位键转加1键LJMP KEY0 ;是选位键按下转该键程序LOOP4: JB P3.5,LOOP5 ;不是选位键转减1键SJMP KEY1 ;是加1键按下转该键程序LOOP5: JB P3.6,LOOP2SJMP KEY2 ;是减1键按下转该键程序LOOP2: CLR 00H ;无键按下清键已按下标志LOOP3: MOV DPTR,# TABLE ;置7段码表格首址MOV A,34H ;取时的高位显示SWAP AANL A,#0FHMOVC A,@A+ DPTRMOV C,01H ;秒节拍显示处理MOV ACC.7,CMOV P1,AMOV A,35H ;如修改时单位,作闪动处理CJNE A,# 02H,LOOP12 ;选位计数器未选中时单位跳过JNB 01H,LOOP12 ;无闪动标志跳过ORL P1,#7FH ;清显示LOOP12: CLR P2.0 ;显示时十位LCALL DELY ;延时5msORL P2,#0FFH ;关显示MOV A,34H ;取时的低位显示ANL A,# 0FHMOVC A,@A+DPTRMOV C,01HMOV ACC.7,CMOV P1,AMOV A,35HCJNE A,#02H,LOOP13JNB 01H,LOOP13ORL P1,#7FHLOOP13: CLR P2.1 ; 显示时个位LCALL DELYORL P2,#0FFH ;关显示MOV A,33H ;取分的高位显示SWAp AANL A,#0FHMOVC A,@A+DPTR ;取分高位段码MOV C,01H ;加闪信号MOV ACC.7,CMOV P1,AMOV A,35H ;判断分位上否被选位CJNE A,#01H,LOOP14 ;分位未被选转JNB 01H,LOOP14 ;无闪动标志转ORL P1,#7FH ;有闪动标志关显示LOOP14: CLR P2.2 ;显示分十位LCALL DELYORL P2,#0FFH ;关显示MOV A,33H ;取分个位显示ANL A,#0FHMOVC A,@A+DPTRMOV C,01H ;加闪信号MOV ACC.7,CMOV P1,A ;送分个位段码MOV A,35HCJNE A,#01H,LOOP15 ;分位未被选转JNB 01H,LOOP15 ;无闪动标志转ORL P1,#7FH ;有闪动标志关显示LOOP15: CLR P2.3 ;显示分个位LCALL DELYORL P2,#0FFHMOV A,32H ;取秒十位显示SWAP AANL A,# 0FHMOVC A,@A+DPTRMOV C,01H ;加闪信号MOV ACC.7,CMOV P1,A ;送秒十位段码MOV A,35HCJNE A,#00H,LOOP16 ;秒位未被选转JNB 01H,LOOP16 ;无闪动标志转ORL P1,#7FH ;有闪动标志关显示LOOP16: CLR P2.4 ;显示秒十位LCALL DELYORL P2,#0FFH ;关显示位码MOV A,32H ;取秒个位显示ANL A,# 0FHMOVC A,@A+DPTRMOV C,01H ;加闪信号MOV ACC.7,CMOV P1,A ;送秒个位段码MOV A,35HCJNE A,#00H,LOOP17 ;秒位未被选转JNB 01H,LOOP17 ;无闪动标志转ORL P1,#7FH ;有闪动标志关显示LOOP17: CLR P2.5 ;显示秒个位LCALL DELYORL P2,#0FFH ;关显示位码LJMP MAINKEY0 : INC 35H ;选位键程序MOV A,35HCJNE A,#04H,LOOP6 ;将选位计数器值限制在0~3之内MOV 35H,#00HLOOP6: LJMP LOOP3 ;返回显示程序KEY1: MOV A,35H ;加1键程序ADD A,#32H ;得到被修改单元地址MOV R0,ACJNE A,#32H,FXG1;不是修改秒转分修改MOV 32H,#00H ;秒单元清零SUBB A,#30H ;当前秒数大于30秒吗?JNC FXG ;大于30秒清零转分加1LJMP LOOP3 ;小于30秒清零转显示FXG:INC R0 ;指向分单元FXG1:MOV A,@R0ADD A,#01H ;将该单元加1DA AMOV @R0,AMOV R1,35HCJNE R1,#00H,LOOP7CJNE A,#60H,LOOP8 ;是修改分,满六十则清零MOV @R0,#00HSJMP LOOP8LOOP7: CJNE R1,#01H,LOOP18 ;非修改状态不作处理CJNE A,#24H,LOOP8 ;是修改时,满24则清零MOV @R0,#00HLOOP8:MOV 32H,#00H ;只要有修改就将秒清零LOOP18:LJMP LOOP3NOPKEY2: MOV A,35H ;减1键程序ADD A,#32H ;得到被修改单元地址MOV R0,ACJNE A,#32H,FXG2;不是修改秒转分修改MOV 32H,#00H ;秒单元清零SUBB A,#30H ;当前秒数大于30秒吗?JNC FXG ;大于30秒清零转分加1LJMP LOOP3 ;小于30秒清零转显示FXG2:MOV A,@R0ADD A,#99H ;将该单元减1DA AMOV @R0,ACJNE A,#99H,LOOP9 ;结果不为负,则不作处理MOV R1,35HCJNE A,#00H,LOOP10MOV @R0,#59H ;结果为负,是修改分则置成59分SJMP LOOP9LOOP10:SJNE R1,#01H,LOOP19 ;非修改状态不作处理MOV @R0,#23H ;结果为负,是修改时则置成23时LOOP9:LJMP LOOP3 ;只要有修改就将秒清零T0_SUV: PUSH ACC ;T0中断服务程序(500us)PUSH PWSDJNZ 30H,LOOP11 ;10ms计时MOV 30H,#14HDJNZ 31H,LOOP11 ;0.5s计时MOV 31H,#32HCPL 01H ;秒节拍显示取反JNB 01H,LOOP11 ;未到1秒跳过MOV A,32H ;秒加1ADD A,#01HDA AMOV 32H,ACJNE A,#60H,LOOP11MOV 32H,#00HMOV A,33H ;分加1ADD A,#01HDA AMOV 33H,ACJNE A,#60H,LOOP11MOV 33H,#00HMOV A,34H ;时加1ADD A,#01HDA AMOV 34H,ACJNE A,#24H,LOOP11MOV 34H,#00HLOOP11:POP PSWPOP ACCRETIDELY: MOV R2,#05H ;延时5msLOOP16:MOV R3,#0F9HLOOP17:DJNZ R3,LOOP13DJNZ R2,LOOP12RETTABLE:DB 0C0H,0F9H,0A4H,0B0H,99H ;7段码字形表DB 92H,82H,0F8H,80H,90HEND。
基于单片机的六位智能秒表设计与实现
作者:贾电如田俊芳贾利敏
来源:《数字技术与应用》2017年第02期
摘要:本设计以AT89C51单片机为核心元件,并配以微功耗LED显示屏和应用石英晶振作为单片机的外接频率,应用74LS245 寄存器来驱动数码管,组合成的六位智能秒表系统。
并通用proteus7.7和keil uvision4仿真调试的实现。
单片机应用开发中采用proteus仿真不仅提高了教学和开发质量,而且对于培养学生的自主能力、创新能力、分析和解决问题的能力都起到了潜移默化的作用。
关键词:单片机;六位秒表;定时中断;LED动态显示
中图分类号:TP274 文献标识码:A 文章编号:1007-9416(2017)02-0035-02
单片机课程是一门理论实践性都很强的专业基础课程,但理论学习必须紧密地与实践结合起来。
当今时代是一个新技术层出不穷的时代,特别是单片机已广泛应用到国家的经济建设和日常生活中,成为现代化测控技术必只不过所必不可少的重要工具,单片机体积小、功能强、成本低等优点,是智能控制与自动化控制[1]。
在单片机应用开发中通过软件proteus技术仿真出实验结果,进一步开发产品,提高电子产品制作的效率,还节约了成本。
下面以具体智能秒表设计。
1 硬件设计
基于AT89C51单片机所设计的一种六位智能秒表系统,硬件电路部分给出了单片机的最小系统,输入输出端口按键和数码管的显示[2]。
时间的显示是通过LED数码管动态显示技术,应用单片机I/O扩展口,设计4个按键,分别控制小时,分钟,秒值,可以通过按键来设置时间,还有一个按键是清0键,保证复位操作,加电秒表会自动开始计时。
下面简答介绍所用到的器件[3,4]。
硬件设计框图如图1所示。
2 软件设计
在本系统中,软件的设计方面主要有两个方面,一个是主程序,另一个是中断子程序。
主程序任务是实时监测有没有键按下,如果有键按下,则应判断是哪个键按下的,如果是小时键按下,则小时值加1;如果是分钟键按下,则分钟值加1;如果是秒键按下,则秒值加1;如果是rst键按下,则表示复位,各个时间值清0。
并且通过led数码管动态显示出来。
另一个定时中断服务子程序主要负责自动秒值的计算,如果没有外部打扰时,六位智能秒表一直工作在计时状态。
如图2是判断按键部分的流程图及中断部分程序代码。
INT_T:
MOV TL0,#0B0H
MOV TH0,#3CH
INC TCNT
MOV A,TCNT
CJNE A,#20,RETEND INC SECOND
MOV TCNT,#0
MOV A,SECOND
CJNE A,#60,RETEND INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETEND INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#24,RETEND MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
RETEND: RETI
3 系统仿真
通过proteus搭建硬件电路和利用keil uvision4编译软件对单片机进行编程,调试,产生HEX可执行文件,加载到AT89C51单片机中,可以实现六位智能秒表的显示,如图3所示,并且可以通过按键来设置时钟的时,分,秒,以达到了自动秒表和数字时钟的完美组合。
4 结语
通过上述的仿真设计,可以清晰看到实验结果,实现容易,所需器件造价低,操作简单。
单片机应用开发中采用proteus仿真不仅提高了教学和开发质量,改善了教学手段,丰富了教学内容,提高了课堂教学效率,而且对于培养学生的自主能力、创新能力、分析和解决问题的能力都起到了潜移默化的作用。
当然,也要注意仿真教学的辅助作用和实际工程能力的重要性,两者必须相辅相成,相互结合。
参考文献
[1]雷跃荣,詹旭,杜玲燕,等.基于单片机的只能秒表设计[J].《四川理工学院学报:自然科学报》,2010年第5期.
[2]司尚卓,杨恢东,等.基于单片机的超长时间定时控制器研制[J].微计算机信息,2010,2-2:113-115.
[3]樊清海,刘培培,耿娟平.基于单片机的数字时钟C语言设计[J].《北华航天工业学院学报》,2010年第6期.
[4]杨远成,赵创社,雷金利.基于FPGA的数字秒表的设计[J].《装备制造技术》,2009年第9期.。