六位数码管显示时分秒
6位7段LED数码管显示实验
![6位7段LED数码管显示实验](https://img.taocdn.com/s3/m/1cc971f69e314332396893bc.png)
6位7段LED数码管显示实验【实验要求】1)初始化时,使6位LED均显示8,显示时间为1s。
2)从第一个LED开始,从0显示到9,0.5s刷新一次。
直到最后一个LED。
【实验目的】1)熟悉并进一步掌握定时器中断的使用和时基信号的使用。
2)进一步巩固I/O口的使用方法。
3)了解6位7段LED数码管的使用。
【实验设备】1)装有u’nsp IDE仿真环境的PC机一台。
2)μ’nSP?十六位单片机实验箱一个。
【实验原理】通过对I/O口的控制,初始化时点亮所有的数码管,即6位LED数码管均显示8。
1s 后,从第一位数码管开始从0显示到9,刷新时间为0.5s。
直到最后一个数码管。
1s的时间使用定时器A (FIQ);0.5s的时间使用2HZ的时基信号(IRQ5)。
【硬件连接图】A0—A6 接A---G A8—A13 接CS1—CS6 B0—B7 接KEY【实验步骤】⑴按硬件电路原理图进行连接。
⑵画程序流程图。
⑶编写程序。
⑷调试程序。
⑸结合硬件调试,实现最终功能。
【主程序流程图】广告灯设计(利用取表方式)桂林电子工业学院孙安青1.实验任务利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。
2.电路原理图3.系统板上硬件连线把“单片机系统”区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L 1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。
4.程序设计内容在用表格进行程序设计的时候,要用以下的指令来完成(1).利用MOV DPTR,#DATA16的指令来使数据指针寄存器指到表的开头。
(2).利用MOVC A,@A+DPTR的指令,根据累加器的值再加上DPTR的值,就可以使程序计数器PC指到表格内所要取出的数据。
因此,只要把控制码建成一个表,而利用MOVC工,@A+DPTR做取码的操作,就可方便地处理一些复杂的控制动作,取表过程如下图所示:5.6.汇编源程序ORG 0START: MOV DPTR,#TABLE LOOP: CLR AMOVC A,@A+DPTRCJNE A,#01H,LOOP1JMP STARTLOOP1: MOV P1,AMOV R3,#20LCALL DELAYINC DPTRJMP LOOPDELAY: MOV R4,#20D1: MOV R5,#248DJNZ R5,$DJNZ R4,D1DJNZ R3,DELAYRETTABLE: DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FHDB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 07FH,0BFH,0DFH,0EFHDB 0F7H,0FBH,0FDH,0FEH DB 07FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 00H, 0FFH,00H, 0FFH DB 01HEND。
6位LED显示单片机控制电子钟.doc
![6位LED显示单片机控制电子钟.doc](https://img.taocdn.com/s3/m/faa80295ad51f01dc381f11e.png)
6位LED显示单片机控制电子钟/计数器这是我们设计的单片机电子钟/计时器学习板,它采用6位LED数码管显示时、分、秒,以24小时计时方式。
可以通过按键实现时分调整、秒表/时钟功能转换、省电(关闭显示)等功能。
我们能提供的完整的汇编语言源程序清单及电路原理设计图有助于学习者进行分析和进行实验验证6位LED显示单片机控制电子钟/计数器成品板成品每套84元51单片机做的电子钟在很多地方都有介绍,对于单片机学习者来说这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。
常见的电子钟程序由显示部分、计算部分、时钟调整部分构成,本产品硬件上完全支持倒计时器,客户只要自己修改程序就能实现倒计时功能。
为了实现LED显示器的数字显示,可以采用静态显示法和动态显示法。
由于静态显示法需要数据锁存器等硬件,接口复杂一些。
考虑时钟显示只有六位,且系统没有其它复杂的处理任务,所以决定采用动态扫描法实现LED的显示。
单片机采用易购的AT89S51系列,这样单片机可具有足够的空余硬件资源实现其它的扩充功能,硬件系统的总体构成如下图所示:该板采用AT89S51单片机,最小化应用设计,采用共阳七段LED显示器,P0口输出段码数据,P2.0~P2.5做列扫描输出,P1.0,P1.1,P1.2,接三个按键开关,用以调时及功能设置。
为了提高共阳数码管的驱动电压,用9012做电源驱动输出。
采用12M晶振,有利于提高秒计时的精度。
本设计中,计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。
其主程序执行流程图见下左图:数码管显示的数据存放在内存单元70H~75H中。
其中70H~71H存放秒数据,72H~73H存放分数据,74H~75H存放时数据,每一地址单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出70H~~75H某一地址中的数据,然后查得对应的显示用段码,并从P0口输出,P2口将对应的数码管选中供电,就能显示该地址单元的数据值。
六位数字钟工作原理
![六位数字钟工作原理](https://img.taocdn.com/s3/m/42b8269b05a1b0717fd5360cba1aa81144318feb.png)
六位数字钟工作原理
嘿呀!今天咱们来聊聊这神奇的六位数字钟的工作原理呢!
首先呀,咱们得知道这六位数字钟到底是啥玩意儿?哎呀呀,它其实就是能精准显示小时、分钟和秒的一个小宝贝呀!
那它到底是咋工作的呢?哇哦!这可得好好说道说道。
1. 电源供应这可是基础中的基础呢!没有电,它啥也干不了呀!通常会用电池或者外接电源来给它提供能量,就像人要吃饭才有劲干活一样!
2. 时钟芯片哎呀呀,这可是核心中的核心呀!时钟芯片就像数字钟的大脑,掌控着时间的计算和走时的精准度。
它通过内部的晶体振荡器产生稳定的频率信号,然后根据这个信号来计算时间。
3. 显示模块嘿!有了时间,得让人能看到才行呀!这显示模块就负责把计算好的时间给咱们展示出来。
六位数字,清晰明了,小时、分钟、秒,一目了然!
4. 控制电路哇!这个也很重要呢!它就像个指挥官,协调着各个部分的工作。
比如说,控制显示的亮度、切换不同的显示模式等等。
5. 校准功能哎呀呀,时间久了,难免会有误差呀!这时候校准功能就派上用场啦!通过外部的按键或者其他方式,可以对数字钟进行校准,让它始终保持准确。
6. 存储功能嘿!有些数字钟还具备存储功能呢,可以记住一些设置和数据,比如闹钟的时间、定时开关的设置等等。
总的来说,六位数字钟的工作原理就是这些部分相互配合,共同
努力,为咱们准确地显示时间呀!哇,是不是很神奇呢?哎呀呀,有了它,咱们的生活可方便多啦!怎么样,这下你是不是对六位数字钟的工作原理清楚多啦?。
DS1302+AT89S51单片机时钟C程序(六位共阳数码管显示)
![DS1302+AT89S51单片机时钟C程序(六位共阳数码管显示)](https://img.taocdn.com/s3/m/a161d52cf68a6529647d27284b73f242336c3193.png)
DS1302+AT89S51单片机时钟C程序(六位共阳数码管显示)DS1302+A T89S51单片机时钟C程序(六位共阳数码管显示)//DS1302时钟芯片程序#include#define uchar unsigned char#define uint unsigned intsbit CLK=P2^3; //定义口sbit IO=P2^4;sbit RST=P2^5;sbit ACC7=ACC^7;sbit ACC0=ACC^0;uchara[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}, //定义数码管显示码b[8]={0x00,0x00,0x12,0x23,0x11,0x07,0x08,0xbe},//写入时钟数据,最后be突发访问c[7],s,s1,ml1,mh1,ml2,mh2,ml3,mh3; //c存放读.出时钟数据void delay(uint z) // 延时{uint i;uchar j;for(i=z;i>0;i--)for(j=200;j>0;j++);}// 显示子程序void display(uchar mh1,uchar ml1,uchar mh2,uchar ml2,uchar mh3,uchar ml3){uchar x,k,r;for(k=0;k<80;k++){for(r=0;r<8;r++){x=P2&0XF8; P2=x+r ;if(r==2||r==5) { P0=0XBF; delay(3); }//------秒------- if(r==0) {P0=a[ml1] ;delay(3) ;}if(r==1){P0=a[mh1] ; delay(3) ;}//------fen--------- if(r==3) {P0=a[ml2] ; delay(3) ;}if(r==4){P0=a[mh2] ; delay(3) ;}//-----shi---------if(r==6){P0=a[ml3] ;delay(3) ;}if(r==7){P0=a[mh3] ;delay(3) ;}delay(3);}}}//********DS1302读写程序************ void w(uchar u) //写入1位字节{uchar i;ACC = u;for(i=8; i>0; i--){IO = ACC0;CLK = 1;CLK = 0;ACC = ACC >> 1;}}uchar r(void) //读出1位字节{uchar i;for(i=8; i>0; i--){ACC = ACC >>1;ACC7 = IO;CLK = 1;CLK = 0;}return(ACC);}void W1302(uchar ucAddr, uchar ucDa){RST = 0;CLK = 0;RST = 1;w(ucAddr); // 地址,命令w(ucDa); //写1Byte数据CLK = 1;RST = 0;}void wclock(uchar *p) //写入时钟多字节数据{uchar i;// W1302(0x80,0x00); //停止时钟W1302(0x8e,0x00); // 允许写RST=0;CLK=0;RST=1;w(0xbe); //写多字节命令for(i=8;i>0;i--){w(*p); //按数组指针逐个写入,写入数据在主函数调用时指向b数组p++;}W1302(0x00,0x50); //启动定时器CLK=1;RST=0;}void rclock(uchar *p) //读出时钟多字节数据{uchar i;RST=0;CLK=0;RST=1;w(0xbf);for(i=7;i>0;i--){*p=r();p++;}CLK=1;RST=0;}void main(void){uchar mh,ml,fh,fl,sh,sl,z,v,q,e,y,t,k; wclock(b);while(1){rclock(c);mh=(c[0]&0xf0)>>4;ml=c[0]&0x0f;fh=(c[1]&0xf0)>>4;fl=c[1]&0x0f;sh=(c[2]&0xf0)>>4;sl=c[2]&0x0f;display(mh,ml,fh,fl,sh,sl);if(mh==3&&ml==0) { for(k=0;k<3;k++) {z=(c[3]&0xf0)>>4; v=c[3]&0x0f;q=(c[4]&0xf0)>>4; e=c[4]&0x0f;y=(c[6]&0xf0)>>4; t=c[6]&0x0f; display(z,v,q,e,y,t); } }}}。
数字时钟显示电路图
![数字时钟显示电路图](https://img.taocdn.com/s3/m/c2bdbfe0e009581b6ad9eb00.png)
数字时钟显示电路图发布: | 作者: | 来源: liuxianping | 查看:3663次 | 用户关注:数字时钟以时、分、秒显示时刻,共用六个数码管,本例采用共阳极数码管,用三极管控制电源的通断。
工作原理:6个数码管的字型段输入端(a、b、c、d、e、f,g)全部并接到译码器相应的输出端。
电源控制开关管分别接到3~6译码器的六个输出端。
时钟六个计数器输出端均采用四位,分别为xl【、xt£、 m x⋯X2n x2z、x2h x2‘,⋯,x 、x x 、x 相应的每一位都接到4个6选1的选择器上,选择器输出共4位接到数字时钟以时、分、秒显示时刻,共用六个数码管,本例采用共阳极数码管,用三极管控制电源的通断。
工作原理:6个数码管的字型段输入端(a、b、c、d、e、f,g)全部并接到译码器相应的输出端。
电源控制开关管分别接到3~6译码器的六个输出端。
时钟六个计数器输出端均采用四位,分别为xl【、xt£、 m x⋯ X2n x2z、x2h x2‘,⋯,x 、x x 、x 相应的每一位都接到4个6选1的选择器上,选择器输出共4位接到译码器的输入端(y 、y 、y 、Y )上。
数码管及与之对应要显示的计数器,由Q]、、的编码(BCD码)进行循环选择例如,当Q 、、均为⋯0 时,则3~6译码器的输出端1为高电平,第一个数码管加上电源,与此同时,六选一选择器对应的输出分别为Y y— y Xs—x X —x 。
这时译码器的输出a,b,⋯⋯,g虽然接到所有数码管上,但由于只有第一个数码管加上电源,故只有该管点亮,显示第一个计数器的状态(x 、x 。
、xX )。
同理,当Q 、Q Q 为001”时,第二个数码管点亮,显示第二个计数器的状态。
依此类推,到第六个数码管断电后,接着第一个又开始点亮。
如此循环显示,循环周期为6ms,给人的感觉,就相当所有数码管都一直在同时加电,实际上每次只有一个,消耗的功率只有静态显示的六分之一。
单片机学习项目 (6)数码管动态显示
![单片机学习项目 (6)数码管动态显示](https://img.taocdn.com/s3/m/7112cafd9e3143323968936a.png)
单片机学习项目项目6-数码管动态显示一:仿真电路在图4-2-8所示电路,6只共阳数码的段选端并联在一起分别连接P0口的相应端口,P2通过74HC04反相器驱动数码管的阳极,6只共阳数码可以显示时、分、秒信息。
二:程序设计定时器初始化和中断的设定仍利用项目5中的设置,6位数码管动态显示常显示时间的小时、分钟和秒信息。
在程序中药通过秒计数得到分钟和小时信息,参考程序如下:/*预处理*/#include<reg51.h>unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char j,k,sec = 30,min = 30,hour = 12; //声明时间变量,设定初始时间unsigned char cp1,cp2,cp3,flash;/*Timer0中断服务函数*/void timer0_isr(void) interrupt 1{TH0 = (65536 - 2000) / 256; //重装初值TL0 = (65536 - 2000) % 256; //重装初值cp1++; //中断1次,变量加1if(i >= 250) //半秒到了{cp1 = 0;cp2++;flash = ~flash; //闪烁变量}if(cp2 >= 2) //1秒到了{cp2 = 0;sec++;}if(sec >= 60){min++;sec = 0;}if(min >= 60){hour++;min = 0;}if(hour >= 24) hour = 0;P0 = 0xff; //Proteus仿真需要消隐switch(cp3){case 0: P0 = seven_seg[sec % 10]; P2 = ~0x01;break; //数码管段选//数码管位选 case 1: P0 = seven_seg[sec / 10]; P2 = ~0x02;break;case 2: P0 = seven_seg[min % 10] & (0x7f | flash); P2 = ~0x04;break;//小数点闪烁 case 3: P0 = seven_seg[min / 10]; P2 = ~0x08;break;case 4: P0 = seven_seg[hour % 10] & (0x7f | flash);P2 = ~0x10;break; //小数点闪烁 case 5: P0 = seven_seg[hour / 10]; P2 = ~0x20;break;}cp3++;if(cp3>= 6)cp3 = 0;}/*********************Timer0初始化函数***********************/void timer0_init(void){TMOD = 0x01; //T0工作方式1TH0 = (65536 - 2000) / 256; //对机器脉冲计数2000个计满溢出引发中断TL0 = (65536 - 2000) % 256;EA = 1; //开总中断ET0 = 1; //开T0中断TR0 = 1; //启动定时器T0}/**************************主函数****************************/void main(void){timer0_init();while(1); //等待中断}。
电子设计自动化(EDA)_数字时钟程序模块(LED数码管显示)_实验报告
![电子设计自动化(EDA)_数字时钟程序模块(LED数码管显示)_实验报告](https://img.taocdn.com/s3/m/6e555c3826d3240c844769eae009581b6bd9bd2f.png)
电子设计自动化(EDA)—数字时钟LED数码管显示二、实验内容和实验目的1. 6个数码管动态扫描显示驱动2. 按键模式选择(时\分\秒)与闹钟(时\分)调整控制,3. 用硬件描述语言(或混合原理图)设计时、分、秒计数器模块、闹钟模块、按键控制状态机模块、动态扫描显示驱动模块、顶层模块。
要求使用实验箱左下角的6个动态数码管(DS6 A~DS1A)显示时、分、秒;要求模式按键和调整按键信号都取自经过防抖处理后的按键跳线插孔。
实验目的: 1)学会看硬件原理图, 2)掌握FPGA硬件开发的基本技能3)培养EDA综合分析、综合设计的能力三、实验步骤、实现方法(或设计思想)及实验结果主要设备: 1)PC机, 2)硬件实验箱, 3)Quartus II软件开发平台。
1.打开Quartus II , 连接实验箱上的相关硬件资源, 如下图1所示。
2.建立新文件, 选择文本类型或原理图类型。
3. 编写程序。
4.编译5. 仿真, 加载程序到芯片, 观察硬件输出结果(数码管显示)6.结果正确则完成。
若结果不正确, 则修改程序, 再编译, 直到正确。
模24计数器模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY count24 ISPORT(clk,en:IN STD_LOGIC;cout:OUT STD_LOGIC;hh,hl:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END count24;ARCHITECTURE arc OF count24 ISSIGNAL a,b:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk,en)BEGINhh<=a;hl<=b;IF(clk'EVENT AND clk='1') THENIF(en='1') THENIF(a="0010" AND b="0011") THENa<="0000";b<="0000";ELSE IF(b="1001") THENa<=a+'1';b<="0000";ELSE b<=b+'1';END IF;END IF;IF(a="0010" AND b="0010") THENcout<='1';ELSE cout<='0';END IF;END IF;END IF;END PROCESS;END arc;模60计数器模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY count60 ISPORT(clk,en:IN STD_LOGIC;cout:OUT STD_LOGIC;hh,hl:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END count60;ARCHITECTURE arc OF count60 ISSIGNAL a,b:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL sout:STD_LOGIC;BEGINPROCESS(clk)BEGINhh<=a; hl<=b;IF(clk'EVENT AND clk='1') THENIF(en='1') THENIF(a="0101" AND b="1001") THENa<="0000";b<="0000";ELSE IF(b="1001") THENa<=a+'1';b<="0000";ELSE b<=b+'1';END IF;END IF;END IF;END IF;END PROCESS;sout<='1' WHEN a="0101" AND b="1001" ELSE '0';cout<=sout AND en;END arc;4-7显示译码模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY segment4to7 ISPORT(s:IN STD_LOGIC_VECTOR(3 DOWNTO 0);a,b,c,d,e,f,g:OUT STD_LOGIC);END segment4to7;ARCHITECTURE arc OF segment4to7 IS SIGNAL y:STD_LOGIC_VECTOR(6 DOWNTO 0); BEGINa<= y(6);b<= y(5);c<= y(4);d<= y(3);e<= y(2); f<= y(1);g<= y(0);PROCESS(s)BEGINCASE s ISWHEN "0000"=>y<="1111110"; WHEN "0001"=>y<="0110000"; WHEN "0010"=>y<="1101101"; WHEN "0011"=>y<="1111001"; WHEN "0100"=>y<="0110011"; WHEN "0101"=>y<="1011011"; WHEN "0110"=>y<="1011111"; WHEN "0111"=>y<="1110000"; WHEN "1000"=>y<="1111111"; WHEN "1001"=>y<="1111011"; WHEN OTHERS=>y<="0000000"; END CASE;END PROCESS;END arc;带闹钟控制模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mode_adjust_with_alarm ISPORT (adjust,mode,clk1hz: IN STD_LOGIC;clkh,enh,clkm,enm,clks,enha: OUT STD_LOGIC;clkh_a,clkm_a:OUT STD_LOGIC;mode_ss: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END mode_adjust_with_alarm;ARCHITECTURE arc OF mode_adjust_with_alarm ISTYPE mystate IS (s0,s1,s2,s3,s4,s5);SIGNAL c_state,next_state: mystate;BEGINPROCESS (c_state)BEGINCASE c_state ISWHEN s0=> next_state <= s1; clkh<=clk1hz; clkm<=clk1hz; clks<=clk1hz;enh<='0'; enm<='0'; enha<='0'; clkh_a<= '0'; clkm_a<= '0'; mode_ss <="000";WHEN s1=> next_state <= s2; clkh<=adjust; clkm<= '0'; clks<='0';enh<='1'; enm<='0';enha<='0'; clkh_a<= '0';clkm_a<= '0'; mode_ss <="001";WHEN s2=> next_state <= s3; clkh<= '0'; clkm<=adjust; clks <= '0';enh<='0';enm<='1';enha<='0'; clkh_a<= '0'; clkm_a<= '0'; mode_ss <="010";WHEN s3=> next_state <= s4; clkh<= '0'; clkm<= '0'; clks<=adjust;enh<='0'; enm<='0';enha<='0'; clkh_a<= '0'; clkm_a<= '0'; mode_ss <="011";WHEN s4=> next_state <= s5; clkh<= clk1hz; clkm<= clk1hz; clks<=clk1hz;enh<='0';enm<='0';enha<='1'; clkh_a<=adjust; clkm_a<= '0'; mode_ss <="100";WHEN s5=> next_state <= s0; clkh<= clk1hz; clkm<= clk1hz; clks<=clk1hz;enh<='0'; enm<='0'; enha<='0'; clkh_a<= '0'; clkm_a<=adjust; mode_ss <="101";END CASE;END PROCESS;PROCESS (mode)BEGINIF (mode'EVENT AND mode='1') THENc_state<=next_state ;END IF;END PROCESS;END arc;扫描模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY scan ISPORT(clk256hz:IN STD_LOGIC;ss:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END scan;ARCHITECTURE arc OF scan ISTYPE mystate IS (s0, s1,s2,s3,s4,s5);SIGNAL c_state,next_state: mystate;BEGINPROCESS ( c_state )BEGINCASE c_state ISWHEN s0=> next_state <=s1; ss<="010";WHEN s1=> next_state <=s2; ss<="011";WHEN s2=> next_state <=s3; ss<="100";WHEN s3=> next_state <=s4; ss<="101";WHEN s4=> next_state <=s5; ss<="110";WHEN s5=> next_state <=s0; ss<="111";END CASE;END PROCESS;PROCESS (clk256hz)BEGINIF (clk256hz'EVENT AND clk256hz='1') THENc_state<=next_state ;END IF;END PROCESS;END arc;复用模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux ISPORT(hh,hl,mh,ml,sh,sl,hha,hla,mha,mla:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ss,mode_ss:IN STD_LOGIC_VECTOR(2 DOWNTO 0);y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);alarm:OUT STD_LOGIC);END mux;ARCHITECTURE arc OF mux ISSIGNAL a,hhtmp,hltmp,mhtmp,mltmp,shtmp,sltmp:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(mode_ss)BEGINCASE mode_ss ISWHEN "000"=>hhtmp<=hh; hltmp<=hl; mhtmp<=mh; mltmp<=ml; shtmp<=sh; sltmp<=sl;WHEN "001"=>hhtmp<=hh; hltmp<=hl; mhtmp<=mh; mltmp<=ml; shtmp<=sh; sltmp<=sl;WHEN "010"=>hhtmp<=hh; hltmp<=hl; mhtmp<=mh; mltmp<=ml; shtmp<=sh; sltmp<=sl;WHEN "011"=>hhtmp<=hh; hltmp<=hl; mhtmp<=mh; mltmp<=ml; shtmp<=sh; sltmp<=sl;WHEN "100"=> hhtmp<=hha; hltmp<=hla; mhtmp<=mha; mltmp<=mla; shtmp<=sh; sltmp<=sl;WHEN "101"=> hhtmp<=hha; hltmp<=hla; mhtmp<=mha; mltmp<=mla; shtmp<=sh; sltmp<=sl;WHEN OTHERS=>hhtmp<="0000";hltmp<="0000";mhtmp<="0000";mltmp<="0000";shtmp<="0000";sltmp<="0000"; END CASE;END PROCESS;PROCESS(ss)BEGINCASE ss ISWHEN "010"=> a <=hhtmp;WHEN "011"=> a <=hltmp;WHEN "100"=> a <=mhtmp;WHEN "101"=> a <=mltmp;WHEN "110"=> a <=shtmp;WHEN "111"=> a <=sltmp;WHEN OTHERS => a <="0000";END CASE;y<=a;END PROCESS;alarm<='1' WHEN ((hh=hha)AND(hl=hla)AND(mh=mha)AND(ml=mla)) ELSE '0';END arc;闪烁模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY blink_control ISPORT(ss,mode_ss:IN STD_LOGIC_VECTOR(2 DOWNTO 0);blink_en:OUT STD_LOGIC);END blink_control;ARCHITECTURE arc OF blink_control ISBEGINPROCESS (ss,mode_ss)BEGINIF(ss="010" AND mode_ss="001") THEN blink_en<='1';ELSIF(ss="011" AND mode_ss="001") THEN blink_en<='1';ELSIF(ss="100" AND mode_ss="010") THEN blink_en<='1';ELSIF(ss="101" AND mode_ss="010") THEN blink_en<='1';ELSIF(ss="110" AND mode_ss="011") THEN blink_en<='1';ELSIF(ss="111" AND mode_ss="011") THEN blink_en<='1';ELSIF(ss="010" AND mode_ss="100") THEN blink_en<='1';ELSIF(ss="011" AND mode_ss="100") THEN blink_en<='1';ELSIF(ss="100" AND mode_ss="101") THEN blink_en<='1';ELSIF(ss="101" AND mode_ss="101") THEN blink_en<='1';ELSE blink_en<='0';END IF;END PROCESS;END arc;Top文件LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY design3 ISPORT (mode,adjust,clk1hz,clk2hz,clk256hz,clk1khz:IN STD_LOGIC;alarm,a,b,c,d,e,f,g:OUT STD_LOGIC;ss:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END design3;ARCHITECTURE arc OF design3 ISCOMPONENT mode_adjust_with_alarm PORT (adjust,mode,clk1hz: IN STD_LOGIC;clkh,enh,clkm,enm,clks,enha: OUT STD_LOGIC;clkh_a,clkm_a:OUT STD_LOGIC;mode_ss: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END COMPONENT;COMPONENT scan PORT (clk256hz:IN STD_LOGIC;ss:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END COMPONENT;COMPONENT segment4to7 PORT (s: IN STD_LOGIC_VECTOR(3 DOWNTO 0);a,b,c,d,e,f,g: OUT STD_LOGIC);END COMPONENT;COMPONENT mux PORT(hh,hl,mh,ml,sh,sl,hha,hla,mha,mla:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ss,mode_ss:IN STD_LOGIC_VECTOR(2 DOWNTO 0);y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);alarm:OUT STD_LOGIC);END COMPONENT;COMPONENT blink_control PORT(ss,mode_ss:IN STD_LOGIC_VECTOR(2 DOWNTO 0);blink_en:OUT STD_LOGIC);END COMPONENT;COMPONENT count24 PORT (clk,en:IN STD_LOGIC;cout:OUT STD_LOGIC;hh,hl:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT count60 PORT (clk ,en:IN STD_LOGIC;cout:OUT STD_LOGIC;hh,hl:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;SIGNALclkh,enh,clkm,enm,clks,clkh_a,clkm_a,coutm,couts,coutm_en,couts_en,cout,vcc,coutma_en,coutma,alarm1,bli nk_en,blink_tmp,enha: STD_LOGIC;SIGNAL mode_ss,ss1:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL hh,hl,mh,ml,sh,sl,hha,hla,mha,mla,y,i:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINvcc<='1';coutm_en <= enh OR coutm;couts_en <= enm OR couts;coutma_en<= enha OR coutma;blink_tmp<=blink_en and clk2hz;i(3)<=y(3) OR blink_tmp;i(2)<=y(2) OR blink_tmp;i(1)<=y(1) OR blink_tmp;i(0)<=y(0) OR blink_tmp;ss<=ss1;alarm<=alarm1 AND clk1khz;u1:mode_adjust_with_alarmPORT MAP( adjust,mode,clk1hz,clkh,enh,clkm,enm,clks,enha,clkh_a,clkm_a,mode_ss);u2:count24 PORT MAP(clkh,coutm_en,cout,hh,hl);u3:count60 PORT MAP(clkm,couts_en,coutm,mh,ml);u4:count60 PORT MAP(clks,vcc,couts,sh,sl);u5:count24 PORT MAP(clkh_a,coutma_en,cout,hha,hla);u6:count60 PORT MAP(clkm_a,vcc,coutma,mha,mla);u7:mux PORT MAP(hh,hl,mh,ml,sh,sl,hha,hla,mha,mla,ss1,mode_ss,y,alarm1);u8:scan PORT MAP(clk256hz,ss1);u9:blink_control PORT MAP(ss1,mode_ss,blink_en);u10:segment4to7 PORT MAP(i,a,b,c,d,e,f,g);END arc;实验结果:数字钟包括正常的时分秒计时, 实验箱左下角的6个动态数码管(DS6 A~DS1A)显示时、分、秒。
秒表-六位数码管有效显示2
![秒表-六位数码管有效显示2](https://img.taocdn.com/s3/m/3087e988680203d8ce2f2464.png)
秒表-六位数码管有效显示 C51单片机1.#include <reg51.h>2.#include <intrins.h>3.#define uchar unsigned char1.void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值2552.void key_scan(); // 按键扫描3.void key_to(); // 按键处理4.5.uchar code dis_code[11] = {0xc0,0xf9,0xa4,0xb0,0x99, //段码表6.//0 1 2 3 4 对应内容7. 0x92,0x82,0xf8,0x80,0x90,0xbf};8.// 5 6 7 8 9 - 9.10.uchar data dis[8]; // dis[0]为百分之一秒值,dis[1]为十分之一秒值11. // dis[2],dis[5]为'-'段码的偏移量12. // dis[3]为秒个位值,dis[4]为秒十位值13. // dis[6]为分个位值,dis[7]为分十位值14.15.uchar data dot = 0; // 百分之一秒计数器(0.00s-0.99s)16.uchar data sec = 0; // 秒计数器(00s-59s)17.uchar data min = 0; // 分计数器(00m-99m)18.19.uchar data dis_b; // dis_b为位码选通数码管20.uchar data dis_r; // dis_r为取段码时的偏移量21.22.uchar data key_t = 0; // 按键次数,初始为023.24.sbit K = P1^4; // K键与P1.4相连25.26.void main()27.{28. P2 = 0xff; // 关所有数码管29. P1 = 0xff; // p1为准双向口,作输入时先写130. dis[2] = 10; // '-'在段码表中偏移量为1031. dis[5] = 10; // '-'在段码表中偏移量为1032. dis_b = 0x7f; // 初始选通P2.7口数码管33. dis_r = 0; // 初始化偏移量为034.35. TMOD = 0x11; // 定时/计数器0,1工作于方式136. TH0 = 0xd8; // 预置定时常数55536(d8f0),产生10ms时基信号37. TL0 = 0xf0;38. TH1 = 0xfc; // 预置定时常数64536(fc18),产生1ms间隔用于动态显示39. TH1 = 0x18;40. EA = 1; // 开总中断41. ET0 = 1; // 定时/计数器0允许中断42. ET1 = 1; // 定时/计数器1允许中断43. TR0 = 0; // 关闭定时/计数器044. TR1 = 1; // 启动定时/计数器145. while(1)46. {47. if(K != 1) // 有键按下48. {49. delay_ms(10); // 延时10ms去抖50. if(K != 1) // 确定是有键按下51. {52. while(K != 1); // 等待键松开53. key_to(); // 按键处理54. }55. }56. }57.}58.void key_to() // 按键处理子程序59.{60. key_t++; // 按键次数加161. if(key_t == 1) // 第一次按下62. TR0 = 1; // 启动定时器063. else64. {65. if(key_t == 2) // 第二次按下66. TR0 = 0; // 关闭定时器067. else68. {69. if(key_t == 3) // 第三次按下70. {71. dot = 0; // 三个计数器清零72. sec = 0;73. min = 0;74. key_t = 0; // 按键次数清零75. }76. }77. }78.79.}80.void tiem0(void) interrupt 1 // T/C0中断服务程序(产生10ms时基信号)81.{82. dot++; // 百分之一秒计数器加183. if(dot == 100) // 计数值到10084. {85. dot = 0; // 清零86. sec++; // 秒计数器加1(进位10ms*100=1s)87. if(sec == 60) // 秒计数值到6088. {89. sec = 0; // 秒计数器清零90. min++; // 分计数器加1(进位60s=1m)91. if(min == 100) // 分计数到10092. min = 0; // 分计数器清零93. }94. }95. TH0 = 0xd8; // 重置定时常数96. TL0 = 0xf0;97.}98.void time1(void) interrupt 3 // T/C1中断服务程序(延时1ms数码管动态显示)99.{100. dis[0] = dot % 10; // 百分之一秒计数器个位分离出来赋绐dis[0]101. dis[1] = dot / 10; // 百分之一秒计数器十位分离出来赋绐dis[1]102. dis[3] = sec % 10; // 秒计数器个位赋绐dis[3] 103. dis[4] = sec / 10; // 秒计数器十位赋绐dis[4] 104. dis[6] = min % 10; // 分计数器个位赋绐dis[6] 105. dis[7] = min / 10; // 分计数器十位赋绐dis[7] 106.107.P0 = dis_code[dis[dis_r]]; // 段码送P0口(dis[0]...dis[7])108.P2 = dis_b; // 位码送P2口109.110. dis_r++; // 偏移量加1,下次中断时显示下个数111. dis_r &= 0x07; // dis_r增到8时自动清0(使之在0到7间循环)112.113. dis_b = _cror_(dis_b,1); // 位码循环右移,下次中断时选通下个数码管114.115.TH1 = 0xfc; // 重置定时常数116.TL1 = 0x18;117.118.}119.void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255120.{121.uchar i;122.while(ms--)123.for(i = 0; i < 124; i++);124.}。
多功能数字时钟
![多功能数字时钟](https://img.taocdn.com/s3/m/8db8585452ea551811a68705.png)
一、实验任务及要求1.能进行正常的时、分、秒计时功能,分别由6个数码管显示24小时、60分钟、60秒钟的计数器显示。
2.能进行闹钟的时、分、秒的设置,分别由6个数码管显示24小时、60分钟、60秒钟的闹钟显示。
3.当“mode”为“1”时,6个数码管显示显示正常计时状态,当“mode”为“0”时,6个数码管显示显示闹钟状态。
4.能利用实验系统上的按键实现计时状态下的“校时”与“校分”功能:(1)当“set_hour”为“1”时,每次按动“k_hour”键一次,“小时”+1,若一秒内未按动“k_hour”键则小时以4Hz的频率递增计数,并按24小时循环,计满23小时后在回00;(2)当“set_minute”为“1”时,每次按动“k_minute”键一次,“分钟”+1,若一秒内未按动“k_minute”键则分钟以4Hz的频率递增计数,并按60分钟循环,计满分钟后回00;(3)按下“reset”键时,“小时”,“分钟”,“秒”清零;5.能用实验系统上的按键实现闹钟下的“校时”与“校分”功能:(4)当“set_hour_alarm每次按动“k_hour_alarm”键一次,“小时”+1,若一秒内未按动“k_hour_alarm”键则小时以4Hz的频率递增计数,并按24小时循环,计满23小时后在回00;(5)当“set_minute_alarm”为“1”时,每次按动“k_minute_alarm”键一次,“分钟”+1,若一秒内未按动“k_minute_alarm”键则分钟以4Hz的频率递增计数,并按60分钟循环,计满分钟后回00;6.能利用蜂鸣器做整点报时:(1)当计时到达59’50’’时开始报时,在59’51’’、53’’、55’’、57’’鸣叫,鸣叫频率可为512Hz;(2)到达59’59’’时发频率为1024Hz的高音,结束时为整点。
7.能利用蜂鸣器做闹钟报时:当闹钟定时时间到时,蜂鸣器发出周期为1s的滴、滴声,持续时间为10s;8.用层次化设计方法设计该电路,用VHDL语言编写各个功能模块。
单片机6个数码管上显示时分秒
![单片机6个数码管上显示时分秒](https://img.taocdn.com/s3/m/e02bd96502020740be1e9b6b.png)
//6个数码管上依次显示时、分、秒,//按下S2一次,停止计时,按下S2两次,开始计时;//停止计时后,按下S3一次,小时数加1;//停止计时后,按下S4一次,分钟数加1;//停止计时后,按下S5一次,秒数加1#include<reg52.h>//头文件#define uint unsigned int#define uchar unsigned char //宏定义sbit wela=P2^7;sbit dula=P2^6;//数码管锁存位声明sbit s2=P3^4;sbit s3=P3^5;sbit s4=P3^6;sbit s5=P3^7;//独立按键位声明uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9段码uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位码uint num=0,num1,num2;//全局变量uchar shi,fen,miao;void delay(uint);void display(uchar,uchar);void keyscan();void main(){TMOD=0x01;TH0=(65536-50000)/256;//赋初值TL0=(65536-50000)%256;EA=1;//中断使能ET0=1;TR0=1;while(1){shi=num/3600;fen=num%3600/60;miao=num%60;if(shi==13)num=num%3600;if(fen==60)num=num/3600*3600+num%60;if(miao==60)num=num/60*60;keyscan();//按键if(num2==0){display(shi,0);//显示display(fen,2);display(miao,4);}else{switch(num2){case 1:display(shi,0);display(fen,2);display(miao,4);break;case 2:display(shi,0);break;case 3:display(fen,2);break;case 4:display(miao,4);break;}}}}void delay(uint x){uint i,j;//局部变量for(i=0;i<x;i++)for(j=0;j<110;j++);//延时子函数}void display(uchar disnum,uchar weinum){uchar sh,ge;sh=disnum/10;ge=disnum%10;P0=0xff;wela=1;wela=0;P0=table[sh];dula=1;dula=0;P0=table1[weinum];wela=1;wela=0;delay(2);//十位显示P0=0xff;wela=1;wela=0;P0=table[ge];dula=1;dula=0;P0=table1[weinum+1];wela=1;wela=0;delay(2);//个位显示*/}void keyscan(){if(s2==0){delay(15);//消抖if(s2==0){TR0=0;num2++;while(!s2);//松手检测if(num2==5){num2=0;TR0=1;}}}if(num2!=0){if(s3==0){delay(5);if(s3==0){while(!s3);num=num+3600;}}if(s4==0){delay(5);if(s4==0){num=num+60;while(!s4);}}if(s5==0){delay(5);if(s5==0){num++;while(!s5);}}}}void time0() interrupt 1{TH0=(65536-50000)/256;//赋初值TL0=(65536-50000)%256;num1++;if(num1==20){num1=0;num++;//if(num==43200)//num=0;}}。
程序简洁的单片机6位数字钟
![程序简洁的单片机6位数字钟](https://img.taocdn.com/s3/m/e739fa32376baf1ffc4fadfa.png)
程序简洁的单片机6位数字钟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那么到分位处理程序。
6位数码管时钟
![6位数码管时钟](https://img.taocdn.com/s3/m/f0399e09a300a6c30c229f62.png)
uchartime_y05s=0;
ucharbit_shan_f=0;
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(ucharhour,ucharmin,ucharsec)
#include<reg52.h>
#defineucharunsigned char
#defineuintunsignedint
sbitdula=P2^6;
sbitwela=P2^7;
sbitkey1=P3^4;
sbitkey2=P3^5;
sbitkey3=P3^6;
sbitkey4=P3^7;
ucharcode table[]={
{
hourshi=hour/10;
hourge=hour%10;
minshi=min/10;
minge=min%10;
secshi=sec/10;
secge=sec%10;
if(shanshuo_s&&(bit_shan_f==1)) //送关闭显示这个功能可以在按键的时候在价格位标志可以判断是否需要闪烁
hour--;
if(hour<=0)
hour=23;
while(!key3)
{
display(hour,min,sec);
}
}
}
}
if(key4==0)
{
delayms(8);
if(key4==0)
{
aa=0;
num=0;
单片机 电子时钟 6位数码管
![单片机 电子时钟 6位数码管](https://img.taocdn.com/s3/m/8c4ab4e2998fcc22bcd10d75.png)
org 00h;显示缓冲单元在70H—75H,70H—71H显示秒,72H—73H显示分,74H—75H显示时;时间计数单元在70H—71H(秒)、76H—77H(分)、78H—79H (时),7AH单元放熄灭符(#0AH);计数单元采用BCD码计数,定时器T0设置为50MS溢出中断,为秒计数用,定时器T1为调整时闪烁用;P3.2为调整按钮,P1口为字符输出口,采用共阳显示管。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断入口程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHLJMP INTT0ORG 0013HRETIORG 001BHLJMP INTT1ORG 0023HRETIORG 002BHRETI; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 主程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START: MOV R0, #70HMOV R7, #0BHMOV 20H, #00H CLEARDISP: MOV @R0, #00H INC R0DJNZ R7,CLEARDISP MOV 7AH,#0AHMOV TMOD,#11HMOV TL0, #0B0HMOV TH0, #3CHMOV TL1, #0B0HMOV TH1, #3CHSETB EASETB ET0SETB TR0MOV R4,#14Hstart1: LCALL DISPLAY JNB P3.2,SETMM1 SJMP Start1SETMM1: LJMP SETMM ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1秒定时程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;INTT0: PUSH ACCPUSH PSWCLR ET0CLR TR0MOV A,#0B7H ;中断同步修正ADD A,TL0MOV TL0,AMOV A,#3CHADD A,TH0MOV TH0,ASETB TR0DJNZ R4, OUTT0 ADDSS: MOV R4,#14H MOV R0,#71HACALL ADD1 ;加1程序MOV A,R3CLR CCJNE A,#60H,ADDMM ADDMM: JC OUTT0 ACALL CLR0MOV R0,#77H ACALL ADD1MOV A,R3CLR CCJNE A,#60H,ADDHH ADDHH: JC OUTT0 ACALL CLR0MOV R0,#79H ACALL ADD1MOV A,R3CLR CCJNE A,#24H,HOUR HOUR: JC OUTT0 ACALL CLR0OUTT0: MOV 72H,76H MOV 73H,77HMOV 74H,78HMOV 75H,79HPOP PSWPOP ACCSETB ET0RETI; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 闪动调时程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;INTT1: PUSH ACC PUSH PSWMOV TL1, #0B0HMOV TH1, #3CHDJNZ R2,INTT1OUTCPL 02HJB 02H,FLASH1MOV 72H,76HMOV 73H,77HMOV 74H,78HMOV 75H,79HINTT1OUT: POP PSW POP ACCRETIFLASH1: JB 01H,FLASH2 MOV 72H,7AHMOV 73H,7AHMOV 74H,78HMOV 75H,79HAJMP INTT1OUT FLASH2: MOV 72H,76H MOV 73H,77HMOV 75H,7AHAJMP INTT1OUT;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 加1程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;ADD1: MOV A,@R0 DEC R0SWAP AORL A,@R0ADD A,#01HDA AMOV R3,AANL A,#0FHMOV @R0,AMOV A,R3INC R0SWAP AANL A,#0FHMOV @R0,ARET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 清零程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;CLR0: CLR AMOV @R0,ADEC R0MOV @R0,ARET; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 时钟调整程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;SETMM: cLR ET0CLR TR0LCALL DL1SJB P3.2,CLOSEDISMOV R2,#06HSETB ET1SETB TR1SET2: JNB P3.2,SET1 SETB 00HSET4: JB P3.2,SET3 LCALL DL05SJNB P3.2,SETHHMOV R0,#77H ;加1分程序LCALL ADD1MOV A,R3CLR CCJNE A,#60H,HHH HHH: JC SET4LCALL CLR0CLR CAJMP SET4 CLOSEDIS: SETB ET0 SETB TR0CLOSE: JB P3.2,CLOSE LCALL DISPLAYJB P3.2,CLOSE WAITH: JNB P3.2,WAITH LJMP START1 SETHH: CLR 00H SETHH1: JNB P3.2,SET5 SETB 01HSET6: JB P3.2,SET7 LCALL DL05SJNB P3.2,SETOUTMOV R0,#79HLCALL ADD1MOV A,R3CLR CCJNE A,#24H,HOUU HOUU: JC SET6LCALL CLR0AJMP SET6SETOUT: JNB P3.2,SETOUT1 LCALL DISPLAYJNB P3.2,SETOUTCLR 01HCLR 00HCLR 02HCLR TR1CLR ET1SETB TR0SETB ET0LJMP START1SET1: LCALL DISPLAY AJMP SET2SET3: LCALL DISPLAY AJMP SET4SET5: LCALL DISPLAY AJMP SETHH1SET7: LCALL DISPLAY AJMP SET6SETOUT1: LCALL DISPLAY AJMP SETOUT; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 显示程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DISPLAY: MOV R1,#70H MOV R5,#0BFHPLAY: MOV A,R5MOV P2,AMOV A,@R1MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ALCALL DL1MSINC R1MOV A,R5JNB ACC.1,ENDOUTRR AMOV R5,AAJMP PLAYENDOUT: SETB P2.1MOV P0,#0FFHRETTAB: DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 延时程序;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;DL1MS: MOV R6,#14HDL1: MOV R7,#19HDL2: DJNZ R7,DL2DJNZ R6,DL1RET;DS20MS: ACALL DISPLAY ACALL DISPLAYACALL DISPLAYRETDL1S: LCALL DL05S LCALL DL05SRETDL05S: MOV R3,#20HDL05S1: LCALL DISPLAY DJNZ R3,DL05S1RETEND。
六位共阴数码管显示时钟程序
![六位共阴数码管显示时钟程序](https://img.taocdn.com/s3/m/f4feb11b9ec3d5bbfc0a74dd.png)
#include<reg52.h> // 包含51 单片机寄存器定义的头文件#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar int_time ; //中断次数计数变量uchar second; //秒计数变量uchar minute; //分钟计数变量uchar hour; //小时计数变量void delay(uint z) //延时函数,延时约1ms{uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/****************************************************************** 函数功能:显示秒的子程序入口参数:s******************************************************************* */ void DisplaySecond(uchar s){wela=1;P0=0xef; //DS5点亮wela=0;P0=0xff; //消隐dula=1;P0=table[s/10]; //显示十位dula=0;delay(1);wela=1;P0=0xdf; //DS6点亮wela=0;P0=0xff; //消隐dula=1;P0=table[s%10]; //显示个位dula=0;delay(1);}/****************************************************************** 函数功能:显示分钟的子程序入口参数:m******************************************************************* */ void DisplayMinute(uchar m){wela=1;P0=0xfb; //DS3点亮wela=0;P0=0xff; //消隐dula=1;P0=table[m/10]; //显示十位dula=0;delay(1);wela=1;P0=0xf7; //DS4点亮wela=0;P0=0xff; //消隐dula=1;P0=table[m%10]; //显示个位dula=0;delay(1);wela=1;P0=0xf7; //DS4点亮wela=0;P0=0xff; //消隐dula=1;P0=0x80; //显示'.'dula=0;delay(1);}/****************************************************************** 函数功能:显示小时的子程序入口参数:h******************************************************************* */ void DisplayHour(uchar h){wela=1;P0=0xfe; //DS1点亮wela=0;P0=0xff; //消隐dula=1;P0=table[h/10]; //显示十位dula=0;delay(1);wela=1;P0=0xfd; //DS2点亮wela=0;P0=0xff; //消隐dula=1;P0=table[h%10]; //显示个位dula=0;delay(1);wela=1;P0=0xfd; //DS2点亮wela=0;P0=0xff; //消隐dula=1;P0=0x80; //显示'.'dula=0;delay(1);}/************初始化************/void init(){TMOD=0x01; //使用定时器T0EA=1; //开中断总允许ET0=1; //允许T0 中断TH0=(65536-50000)/256; //定时器高八位赋初值TL0=(65536-50000)%256; //定时器低八位赋初值TR0=1;int_time=0; //中断计数变量初始化second=0; //秒计数变量初始化minute=0; //分钟计数变量初始化hour=0; //小时计数变量初始化}/****************************************************************** 函数功能:主函数******************************************************************* */void main(){init();while(1){DisplaySecond(second); //调用秒显示子程序delay(1);DisplayMinute(minute); //调用分钟显示子程序delay(1);DisplayHour(hour); //调用小时显示子程序delay(1);}}/****************************************************************** 函数功能:定时器T0的中断服务子程序******************************************************************* */ void interserve() interrupt 1 //using Time0{int_time++;if(int_time==1)//控制速度{int_time=0; //中断计数变量清0second++; //秒计数变量加1}if(second==60){second=0; //如果秒计满60,将秒计数变量清0minute++; //分钟计数变量加1}if(minute==60){minute=0; //如果分钟计满60,将分钟计数变量清0 hour++; //小时计数变量加1}if(hour==24){hour=0; //如果小时计满24,将小时计数变量清0 }TH0=(65536-50000)/256; //定时器重新赋初值TL0=(65536-50000)%256;}。
【设计】六位数码管电子钟
![【设计】六位数码管电子钟](https://img.taocdn.com/s3/m/753989a3f7ec4afe05a1dfe8.png)
文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 【关键字】设计毕业设计(论文)(2011届)题目六位数码管电子钟系别信息电子系专业信息电子工程管理班级信电0811姓名张淑娇指导教师2011年月日目录摘要 (1)文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 4六位数码管电子钟【摘要】数字钟是一个将“ 时”,“分”,“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能。
因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和振荡器组成。
干电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。
将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。
“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。
“时计数器”采用24进制计时器,可实现对一天24小时的累计。
译码显示电路将“时”、“分”、“秒”计数器的输出状态送到七段显示译码器译码,通过七位LED七段显示器显示出来。
整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时。
校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整的。
数字钟是以不同的计数器为基本单元构成的,它的用途十分广泛,只要有计时、计数的存在,便要用到数字钟的原理及结构;同时在日期中,它以其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱。
【关键词】:校时电路、报时电路、振荡器第一章数字电子钟的设计方案论证1.1数字电子钟的应用意义数字电子钟是用数字电路实现“时”、“分”、“秒”数字显示的计时装置,主要由振荡器、分频器、计数器、译码显示器、校时电路、报时电路等六部分组成。
基于单片机的电子时钟6位LED数码管显示
![基于单片机的电子时钟6位LED数码管显示](https://img.taocdn.com/s3/m/ea97bfee0975f46527d3e100.png)
数码管显示电子时钟设计一.功能要求1.数字电子时钟最主要是LED数码管显示功能,以24小时为一个周期,显示时间时、分、秒。
2.具有校时功能,可以对时、进行单独校对,使其校正到标准时间。
二.方案论证1.数字时钟方案数字时钟是本设计的最主要的部分。
根据需要,可利用两种方案实现。
方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。
该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。
为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。
当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。
而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。
方案二:本方案完全用软件实现数字时钟。
原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。
该方案具有硬件电路简单的特点。
但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。
而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。
基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。
2.数码管显示方案方案一:静态显示。
所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。
该方式每一位都需要一个8 位输出口控制。
静态显示时较小的电流能获得较高的亮度,且字符不闪烁。
但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。
方案二:动态显示。
所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
六位数码管显示时分秒,通过四个按键进行时间的控制。
按下"调时"按键,时间显示停止;按下"选择时分秒"按键,数码管上方的发光二极管会点亮,对应着选中的要修改的时间是小时、分钟还是秒;按下"按下增加"按键,选中的时间将会增加;按下"完成"按键,时间继续显示。
已通过proteus仿真,电路图如下所示,希望大家多多指点,积极留言:
//编程:jumpmysoul
#include<reg51.h>
#define ulong unsigned long
char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管数字码
char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共阳数码管数字码(带小数点)
#define LED P0 //P0为数码管的段选
#define LIGHT P1 //P1为时分秒位的指示灯
#define WS P2 //P2为数码管的位选
sbit time_change=P3^0; //P3^0为“调时”按键
sbit time_choose=P3^1; //P3^1为“选择时分秒”按键
sbit time_inc=P3^2; //P3^2为“增加”按键
sbit time_ok=P3^3; //P3^3为“完成”按键
ulong t;
ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位
int choose_n; //按下“选择时分秒”按键的次数
0 1
1
60 1
60 1
24
1
1
4
1
2
3
1 1160
2160
3124。