单片机的4位数码管秒表
- 格式:docx
- 大小:98.51 KB
- 文档页数:4
单片机4位数码管电子时钟经过几天的努力,第一个51 单片机电子时钟终于出炉了,通过4 位数码管来显示时间,系统晶振11.0592MHZ,仿真图中用二极管代替时钟冒号闪烁,非门代替三极管,让仿真速度与真实速度达到一致,本设计用了6 个按钮来对时间及闹钟时间的调节、关闭,p3.2 接时间分加1 按钮,p3.3 接时间时加1 按钮,p3.4 接闹钟时间与当前时间切换按钮,按住不放显示闹钟的时间,闹钟初始化为00:00,放开按钮则显示当前时间,p3.5 接闹钟加1 按钮,p3.6 接闹钟时加1 按钮,p3.7 接关闭闹钟按钮有没有人会问1hei 本程序已经通过软件仿真和硬件制作.程序源代码:org 0000h ajmp main ;调至主程序org 000bh ;T0 中断入口地址ljmp inti0 org 001bh ;T1 中断入口地址ljmp inti1 org 0030hmain:mov tmod,#11h ;设T0、T1 为模式1 mov ie,#8ah ;开T0、T1 中断允许mov th0,#4ch ;赋T0 50ms初值mov tl0,#00h mov th1,#4ch ;赋T1 50ms 初值mov tl1,#00h mov sp,#60h ;设置堆栈指针mov r0,#20 ; T0 50ms 计数20 次mov 31h,#00 ;时间秒初始化mov32h,#00 ;时间分初始化mov 33h,#00 ;时间时初始化mov 38h,#00 ;闹钟分初始化mov 39h,#00 ;闹钟时初始化setb tr0 ;启动T0 setb tr1 ;启动T1loop:lcall display ;调用时间显示子程序lcall key ;调用时间调节按键子程序lcall keynz ;调用闹钟按键子程序ajmp loopinti0:push psw ;保护现场push acc clr ea ;关中断movth0,#4ch ;重赋50ms 初值mov tl0,#00h djnz r0,out ;对50ms 计数判断mov r0,#20 ;重赋50ms 计数值inc 31h ;秒加1 cpl p2.2 ;P2.2 取反输出mov a,31h cjne a,#60,out ;判秒是否加到60,没有加到中断返回mov 31h,#00 ;秒加到60,对秒清零inc 32h ;分加1 mov a,32h cjne a,#60,out ;判分是否加到60,没有加到就中断返回mov32h,#00 ;分加到60,对分清零inc 33h ;时加1 mov a,33h cjne a,#24,out ;判时是。
4位秒表的设计与制作一、任务要求该任务要求设计并制作一个4位秒表,秒表有启动、停止和清零功能,显示时间为0到9999秒。
该任务是综合应用数码管动态显示、单片机定时计数器和中断系统设计一个具有启动、停止、清零和校时功能的,能显示0到9999秒的4位秒表。
二、设计方案提示4位秒表的设计与1位秒表设计基本相似,所不同的是4位秒表要显示4位数据,而且要有校时功能,所以它只是综合了键盘、定时器、中断系统和动态显示的应用。
多位数显示器是用数码管显示4位十进制数,如果采用数码管静态显示方法,4个数码管要占用4个I/O端口,将占用单片机的所有I/O口而无法实现其他功能,因此不能用静态显示方法实现多位数据的显示。
如何用单片机控制数码管实现多位数据的现实,而又不占用太多的I/O口呢?这就要用到--------数码管的动态显示。
4位秒表设计与1位秒表的设计在原理上是一样的,不同的是:4位秒表要显示4位数,利用前面的数码管显示方法需要4个并行I/0口,而启动停止和清零要占用2个I/O线,89C52单片机只有4个并行I/O口,因此这种显示方法不能满足4位秒表的功能。
那么,如何实现4位秒表的设计呢?这就是该任务的关键------数码管动态显示技术三、系统硬件设计参考:4位秒表电路原理图如图3-21所示,有启动停止、清零和校时电路;数码管的位选端分别接P2口的P2.0~P2.3,段选端接P0口,74LS245是驱动电路。
图3-21 4位秒表电路原理图硬件电路设计图3-17 4位数据显示器的硬件原理图图3-17是4位数据显示器的硬件原理图,数码管是共阳连接,P2口输出显示段码,74LS245驱动数码管显示,CE是片选端,低电平有效;4位数码管的公共端分别由P3.0、P3.1、P3.2、P3.3控制。
四、系统软件设计参考程序//功能:4位数码管动态显示“1234”//函数名:delay50ms//函数功能:采用定时器1、工作方式1实现50ms延时,晶振频率12MHz//形式参数:无//返回值:无void delay50ms(){ TH1=0x3c; // 置定时器初值TL1=0xb0;TR1=1; // 启动定时器1while(!TF1); // 查询计数是否溢出,即定时到,TF1=1TF1=0; // 50ms定时时间到,将定时器溢出标志位TF1清零}void main() //主函数{unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92}; //设置数字0~5字型码unsigned char i,w;TMOD=0x10; //设置定时器1工作方式1while(1) {w=0x01; //位选码初值为01Hfor(i=0;i<4;i++){P2=~w; //位选码取反后送位控制口P2口w<<=1; //位选码左移一位,选中下一位LEDP1=led[i]; //显示字型码送P1口delay50ms(); //延时50ms}}}4位秒表流程图如图3-22所示:包括主函数流程、定时器中断函数和显示函数流程图。
课程名称:微机原理课程设计题目:基于51单片机的秒表设计随着社会的发展,单片机已经渗透到我们生活中的各个领域,广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等。
本设计就是由单片机STC89C52RC芯片和四位一体LED数码管为核心,辅以必要的电路,构成了一个单片机电子秒表。
秒表是一种常用的测试仪器,它可以用在百米赛跑等需要精确计时的地方,为人们的生活提供了很大的方便。
该单片机电子秒表布置合理,全部器件分布在7*9cm洞洞板上,看起来小巧精简。
采用的是单片机内部定时/计数器计时,走时非常精确而且不易出错。
0.56英寸的四位数码管发出红光,可以直观地显示时间。
一个控制按键就可以控制秒表的计数与停止,按一下控制键,秒表工作状态就由计时变为计时变为停止或停止变为计时,按一下清零键就可以清零,操作非常简单。
由于是四位数码管,它的计时周期为100秒,显示满刻度为99:99秒,从左往右数共四位,前两位显示整数部分,后两位显示小数部分,中间两个个秒闪灯(秒闪灯一直亮)。
关键词:秒表,51单片机,C语言一、设计任务与要求 (18)1.1 设计任务 (18)1.2 设计要求 (18)二、方案总体设计 (19)2.1 方案一 (19)2.2 方案二 (19)2.3 系统采用方案 (19)三、硬件设计 (21)3.1 单片机最小系统 (21)3.2 数码管显示模块 (21)3.3 系统电源 (22)3.4 整体电路 (22)四、软件设计 (24)4.1 keil软件介绍 (24)4.2 系统程序流程 (24)五、仿真与实现 (27)5.1 proteus软件介绍 (27)5.2 仿真过程 (27)5.3 实物制作与调试 (29)5.4 使用说明 (30)六、总结 (32)6.1设计总结 (32)6.2经验总结 (20)七、参考文献 (21)一、设计任务与要求1.1 设计任务1).对更多小器件的了解2).巩固51单片机和C语言的知识,熟悉单片机和C语言的实际操作运用3).掌握仿真软件的运用和原理图的绘制4).加深焊接的技巧,提高焊接的能力5).熟悉调试方法和技巧,提高解决实际问题的能力6).熟悉设计报告的编写过程1.2 设计要求1).清零键进行清零2).一个独立按键进行停止与运行的操作3).秒闪灯一直亮二、方案总体设计设计一个基于51单片机的秒表。
单片机控制4位时钟数码管的方法如下:
连接硬件:将4位数码管的共阳(或共阴)引脚连接到单片机的I/O口,连接数码管的段选引脚到单片机的另外4个I/O口。
同时,连接一个晶振和相关的电容电阻到单片机的时钟输入引脚和地。
设置引脚:在代码中定义每个数码管引脚对应的I/O口为输出模式,用于控制数码管的显示。
编写代码:使用单片机的定时器功能,通过编程计算出每个数码管显示的数字对应的段选编码,并在定时器中断服务程序中更新数码管的显示。
调试程序:将程序下载到单片机中,通过观察数码管的显示效果,调整程序中的参数或代码,以达到预期的显示效果。
需要注意的是,具体的实现方式可能因单片机的型号和数码管的类型而有所不同,需要根据实际情况进行相应的调整。
;p0端口接数码显示p0.0-a.....p0.7-h;p1.0-p1.3接位选p1.0-第4个数码管.....p1.3-第1个;p2.0-p2.3接列...p2.4-p2.6接行qq equ 26hqq1 equ 28hx equ 30Hy equ 32Hz0 equ 34H ;数码显示最高位z1 equ 36H ; 数码显示次高位key equ P2 ;键盘控制key1 equ p3.2 ;时分调整控制键org 0000hajmp mainorg 000bhljmp td0org 0100hmain:mov tmod,#01h ;初始化mov tl0,0b0hmov th0,3chsetb easetb et0mov r0,#00mov r1,#00mov r2,#00mov r3,#00mov r4,#00mov r5,#00mov r6,#00mov r7,#00mov x,#00mov y,#00mov z0,#00mov z1,#00mov dptr,#tabsetb tr0;---------------------------------------main1:call a1 ;判断是否有键按下,,jz main2 ;无键按下,跳main2,call b1 ;有键按下,扫描按键确定哪一个被按下,call c0 ;把对应按键设置键码,main2:jnb key1,guangljmp main4guang:call delayjnb key1,guang1ljmp main4guang1:inc r7jnb key1,$main4:call xianshicjne r0,#20,main1 ;一秒定时mov r0,#00cpl p3.0inc r5cjne r5,#60,main1 ;秒mov r5,#00inc r1cjne r1,#10,main1 ;分个位mov r1,#00inc r2cjne r2,#6,main1 ;分十位mov r2,#00inc r3cjne r6,#1,main3cjne r3,#2,main1 ;时十位mov r3,#00mov r4,#00ljmp main1main3:cjne r3,#10,main1 ;时个位mov r3,#00inc r4inc r6ljmp main1 ;主程序循环;----------------------------------------------------- a1:mov key,#0fH ;判断键按下mov a ,keyanl a ,#0fhcjne a,#0fh,a2 ;有键按下跳转mov a,#0 ;无键按下跳转a2:retb1:mov b,#7fh ;判断哪一个键b2:mov a,brr amov b,amov p2,amov a,p2 ;依次判断哪一行anl a,#0fhcjne a,#0fh,B3ajmp b2b3:mov a,key ;把P1的值移出retc0:mov b,key ;处理行数据从下往上为X1,X2,X3.mov a,keyanl a,#0f0hc1:cjne a,#0e0h,c2mov x,#1c2:cjne a,#0d0h,c3mov x,#2c3:cjne a,#0b0h,d0mov x,#3d0:mov a,B ;处理列数据从右往左为Y1,Y2,Y3,Y4 anl a,#0fhd1:cjne a,#0eh,d2mov y,#1d2:cjne a,#0dh,d3mov y,#2d3:cjne a,#0bh,d4mov y,#3d4:cjne a,#7h ,e1mov y,#4e1:dec x ;键码设置mov a,xmov b,#4mul abadd a,yclr cycjne a,#10,e2e2:jc e3mov b,#10div abmov z0,amov z1,bajmp e4e3:mov z0,acjne r7,#0,dier ;当r7=0时调分针个位mov r1,z0dier:cjne r7,#1,dier1 ;当r7=1时调分针十位mov r2,z0dier1:cjne r7,#2,dier2 ;当r7=2时调时针个位mov r3,z0dier2:cjne r7,#3,dier3 ;当r7=3时调时针十位mov r4,z0dier3:cjne r7,#4,e4mov r7,#00e4:ret; --------------------------------------------------------------------- xianshi:clr p1.3 ;第一个数码管显示mov a,r4movc a,@a+dptrmov p0,acall delaysetb p1.3mov dptr,#tab1 ;第二个数码管显示clr p1.2mov a,r3movc a,@a+dptrmov p0,acall delaysetb p1.2mov dptr,#tab ;第三个数码管显示clr p1.1mov a,r2movc a,@a+dptrmov p0,acall delaysetb p1.1clr p1.0 ;第四个数码管显示mov a,r1movc a,@a+dptrmov p0,acall delaysetb p1.0ret; -------------------------------------------------------- delay: ;延时程序mov qq,#10mov qq1,#10del:djnz qq,deldjnz qq1,delret;定时中断td0:inc r0mov tl0,0b0hmov th0,3chretitab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h tab1: db 40h,79h,24h,30h,19h,12h,02h,78h,00h,10h end。
单片机秒表实验报告
实验目的:
使用单片机设计并实现一个秒表,能够精确计时。
实验原理:
单片机秒表的设计采用外部中断的方式进行计时。
当按下计时开始按钮时,单片机开始计时,并将计时结果显示在数码管上。
当按下计时停止按钮时,单片机停止计时,并将计时结果保存下来。
实验材料:
1. 单片机开发板
2. 4位数码管
3. 开始按钮
4. 停止按钮
5. 连接线
实验步骤:
1. 将4位数码管连接到单片机的相应引脚上。
2. 将开始按钮连接到单片机的外部中断引脚上。
3. 将停止按钮连接到单片机的外部中断引脚上。
4. 编写程序,设置外部中断的中断服务函数。
5. 在中断服务函数中实现计时功能,将计时结果显示在数码管上。
6. 在主函数中初始化单片机,开始计时。
7. 测试实验是否正常工作。
实验结果:
经过测试,单片机秒表实验正常工作。
当按下开始按钮时,数码管开始计时,实时显示计时结果。
当按下停止按钮时,数码管停止计时,并将计时结果保存下来。
实验总结:
通过本实验,我掌握了使用单片机设计秒表的方法和步骤,加深了对单片机的理解和应用。
同时,我还学会了使用外部中断进行计时,并将计时结果显示在数码管上。
这对于我今后的学习和实践有着重要的指导意义。
原理图:源程序:/*************************************************************标题:定时器中断精确到00.01的秒表效果:能清零重新开始,暂停,继续计时,能精确到0.01秒作者:皖绩小挺说明:使用12M晶振,四位数码管,3个按键****************************************************************/ #include<reg52.h>#define uint unsigned int#define uchar unsigned charuint temp,tt,qian,bai,shi,ge;sbit smg_q=P1^0;sbit smg_b=P1^1;sbit smg_s=P1^2;sbit smg_g=P1^3;sbit key1 = P3^7;sbit key2 = P3^6;sbit key3 = P3^5;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点void keyscan();void display(uint shi,uint ge);void delay(uint z);void init();/************************************************************** 主函数******************************************************************/void main(){init();//初始化子程序while(1){if(tt==1){tt=0;temp++;if(temp==10000){temp=0;}qian=temp/1000;bai=temp%1000/100;shi=temp%100/10;ge=temp%10;}keyscan();display(shi,ge);}}/********************************************************************* 延时***********************************************************************/ void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*********************************************************************按键控制***********************************************************************/ void keyscan(){if(key1==0) //清零并重新开始计时{temp=0;TR0=1;}if(key2==0) //暂停计时{TR0=0;}if(key3==0) //继续计时{TR0=1;}}/********************************************************************* 显示***********************************************************************/ void display(uint shi,uint ge){smg_q=0;P0=table[qian];delay(1);smg_q=1;P0=0xff;smg_b=0;P0=table1[bai];delay(1);smg_b=1;P0=0xff;smg_s=0;P0=table[shi];delay(1);smg_s=1;P0=0xff;smg_g=0;P0=table[ge];delay(1);smg_g=1;P0=0xff;}/********************************************************************* 初始化***********************************************************************/ void init(){smg_q=1;smg_b=1;smg_s=1;smg_g=1;temp=0;TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;}/********************************************************************* 中断***********************************************************************/ void t0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;tt++;}。
目录1 数字秒表方案设计与论证 (2)2 数字秒表总体设计 (2)3 电子秒表的工作原理 (4)3.1脉冲源电路 (4)3.2分频器电路 (4)3.3时间计数单元 (5)3.4码驱动及显示单元 (8)3.5元件列表 (9)4 调试 (10)5 电路测试及测试结果 (10)6 心得体会 (12)7 参考文献 (13)1 数字秒表方案设计与论证电子秒表的工作原理就是不断输出连续脉冲给加法计数器,而加法计数器通过译码器来显示它所记忆的脉冲周期个数。
1时钟发生器:利用石英震荡555定时器构成的多谐振荡器做时钟源,产生脉冲;2记数器:对时钟信号进行记数并进位,毫秒和秒之间10进制,秒和分之间60进制; 本设计采用二—五—十进制加法计数器74LS90构成电子秒表的计数单元,3译码器:对脉冲记数进行译码输出到显示单元中;4显示器:采用4片LED显示器把各位的数值显示出来,是秒表最终的输出,有分、秒、和毫秒位;74LS48是BCD码到七段码的显示译码器5控制器:控制电路是对秒表的工作状态(记时开始/暂停)进行控制的单元。
属低电平直接触发的触发器,有直接置位、复位的功能。
2数字秒表总体设计图 1 工作流程图:图图2 原理电路图3电子秒表的工作原理3.1脉冲源电路用555 实现多谐振荡,需要外接电阻R1,R2和电容C。
电路图如下:(a)(b)图3 构成多谐振荡器电路图4 555引脚图3.2分频器电路通常,数字钟的晶体振荡器输出频率较高,为了得到0.1Hz的秒信号输入,需要对振荡器的输出信号进行分频。
须设计一个五进制计数器,对频率为50HZ 的时钟脉冲进行五分频,在输出端QD 取得周期为0.1S 的矩形脉冲,作为时间计数单元的时钟输入。
用集成异步计数器74LS90 实现,电路图如下:(a) (b)图5 74ls90引脚图及构成五进制计数器3.3时间计数单元记数器74160、74ls192、74ls90等都能实现十进制记数,本设计采用二—五—十进制加法计数器74LS90构成电子秒表的计数单元,如图三所示,555定时器构成的多谐振荡器作为计数器1的时钟输入。
单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。
功能要求:a)计时并显示(LED)。
由于实验板上只有4位数码管,可设计成显示“时分”和显示“分秒”并可切换。
b)时间调整功能。
利用4个独立按钮,实现时钟调整功能。
这4个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移位(SHITF)。
c)定闹功能。
利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动作作为闹铃。
d)秒表功能。
最小时间单位0.01秒。
二、硬件原理分析1.电源部分电源部份采用两种输入接口(如上图)。
a)外电源供电,采用2.1电源座,可接入电源DC5V,经单向保护D1接入开关S1。
b)USB供电,USB供电口输入电源也经D1单向保护,送到开关S1。
注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。
S1为板子工作电源开关,按下后接通电源,提供VCC给板子各功能电路。
电路采用两个滤波电容,给板子一个更加稳定的工作电源。
LED为电源的指示灯,通电后LED灯亮。
2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。
有源也可以当无源使用,而无源则不能当有源使用,当然用有源蜂鸣器作音乐发声会失真厉害。
如上图:单片机P15输出高低电平经R21连接三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。
低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止,蜂鸣器失电关闭蜂鸣。
电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。
数码管的阴级由P0口经过电阻限流连接。
例如,要十位的数码管工作,P12输出0,使三极管Q12导通,8脚得电,当P0口相应位有输出0时,点亮相应的LED灯组合各种字符数字。
原理图:
源程序:
/*************************************************************
标题:定时器中断精确到00.01的秒表
效果:能清零重新开始,暂停,继续计时,能精确到0.01秒
作者:皖绩小挺
说明:使用12M晶振,四位数码管,3个按键
****************************************************************/ #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint temp,tt,qian,bai,shi,ge;
sbit smg_q=P1^0;
sbit smg_b=P1^1;
sbit smg_s=P1^2;
sbit smg_g=P1^3;
sbit key1 = P3^7;
sbit key2 = P3^6;
sbit key3 = P3^5;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
uchar code table1[]={0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10}; //带小数点
void keyscan();
void display(uint shi,uint ge);
void delay(uint z);
void init();
/************************************************************** 主函数
******************************************************************/
void main()
{
init();//初始化子程序
while(1)
{
if(tt==1)
{
tt=0;
temp++;
if(temp==10000)
{
temp=0;
}
qian=temp/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
}
keyscan();
display(shi,ge);
}
}
/********************************************************************* 延时
***********************************************************************/ void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*********************************************************************
按键控制
***********************************************************************/ void keyscan()
{
if(key1==0) //清零并重新开始计时
{
temp=0;
TR0=1;
}
if(key2==0) //暂停计时
{
TR0=0;
}
if(key3==0) //继续计时
{
TR0=1;
}
}
/********************************************************************* 显示
***********************************************************************/ void display(uint shi,uint ge)
{
smg_q=0;
P0=table[qian];
delay(1);
smg_q=1;
P0=0xff;
smg_b=0;
P0=table1[bai];
delay(1);
smg_b=1;
P0=0xff;
smg_s=0;
P0=table[shi];
delay(1);
smg_s=1;
P0=0xff;
smg_g=0;
P0=table[ge];
delay(1);
smg_g=1;
P0=0xff;
}
/********************************************************************* 初始化
***********************************************************************/ void init()
{
smg_q=1;
smg_b=1;
smg_s=1;
smg_g=1;
temp=0;
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
/********************************************************************* 中断
***********************************************************************/ void t0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt++;
}。