四位数码管秒闪烁可调时钟
- 格式:doc
- 大小:811.00 KB
- 文档页数:6
实验名称:SUMA & BUZZER实验描述:一个带有闹钟的数码时钟,加三个键,一个调小时键一个调分钟键,一个设置闹钟时间键实验方法:TIMER0中断用来计时,控制数码时钟的时间显示还可设置半秒或四分之一秒,用来控制音调TIMER1用来控制音普,,timer0用MODE2自动加载模式*/# include<reg52.h>sbit speaker=P2^3 ;sbit AA=P2^2 ; //调时用sbit BB=P2^1 ; //调分用sbit CC=P2^0 ; // 设置闹钟用sbit P1_7=P1^7; //小数点// int code seven_reg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0123456789int code seven_reg[]={0x40,0x79,0x24,0x30,0x19,0x12,0x2,0x78,0x00,0x10};// int code scan[]={0x1F,0x2F,0x4F,0x8F}; //1110,1101,1011,0111int code scan[]={0x1,0x2,0x4,0x8}; //0001,0010,0100,1000unsigned int timer0_times;unsigned int timer1_times;unsigned int timer0_times_AA; //按纽AA用unsigned int timer0_times_BB; //按纽BB用unsigned int timer0_times_CC; // 半秒计时用unsigned int timer0_times_DD; //四分之一秒用unsigned int timer0_times_EE; // 闹钟用typedef struct{unsigned char second;unsigned char minute;unsigned char hour;unsigned char half_second;unsigned char alarm_hour;unsigned char alarm_minute;unsigned char quarter_second ;} time; //此处是固定格式,不能改time now;char mode=0;int i=0,j=0,k=0;int code tone[]={1012,956,852,759,716,638,568,506,478,426,379};//7()低音)1234567(中音)123(高音)int code song[22][2]={ {6,2},{6,2},{7,4},{6,2},{6,2}, {7,4},{6,2},{7,2},{8,2},{7,2},{6,2},{7,1},{6,1},{4,4},{3,2},{1,2},{3,2},{4,2},{3,2},{3,1},{1,1},{0,4}} ;/********************************************************************/void timer1_isr() interrupt TF1_VECTOR using 2{ TR1=0;TL1=(65536-tone[(song[j][0])])%256;TH1=(65536-tone[(song[j][0])])/256;TR1=1;speaker=~speaker;}/*******************************************************************/void timer0_isr() interrupt TF0_VECTOR using 1{/***************************************************/if(CC!=0) timer0_times_EE=0;else{ timer0_times_EE++;if(CC==0&&timer0_times_EE==4000) //按1S进入设置闹钟模式{mode++;//500 ~0.125sif(mode==2) mode=0;}}/**=调时键设置=*/if(AA!=0) timer0_times_AA=0;else{ timer0_times_AA++;if(AA==0&&timer0_times_AA==500&&mode==0)//500*0.25ms=0.125s{ now.hour++;// timer0_times_AA=0;if (now.hour==24) now.hour=0;//后边代码不会达到此效果}if(AA==0&timer0_times_AA==500&&mode==1) //设置闹钟时间HOUR{ now.alarm_hour++;if(now.alarm_hour==24) now.alarm_hour=0;}}/***=调分键设置=***/if (BB!=0) timer0_times_BB=0;else{ timer0_times_BB++;if(BB==0&&timer0_times_BB==500&&mode==0) //0.125s{ //timer0_times_BB=0;now.minute++;if(now.minute==60) now.minute=0;}if(BB==0&&mode==0){ if(timer0_times_BB==2000) //0.5s{ now.minute++;timer0_times_BB=1000;if(now.minute==60) now.minute=0;}}if(BB==0&&timer0_times_BB==500&&mode==1) //设置闹钟时间MINUTE { now.alarm_minute++;if(now.alarm_minute==60) now.alarm_minute=0;}if(BB==0&&mode==1){ if(timer0_times_BB==2000) //0.5s{ now.alarm_minute++;timer0_times_BB=1000;if(now.minute==60) now.minute=0;}}}/*=自然时间设置=*/timer0_times_DD++; //四分之一秒if(timer0_times_DD==1000){ now.quarter_second++;timer0_times_DD=0;if(now.quarter_second==60) now.quarter_second=0;} //二分之timer0_times_CC++;if(timer0_times_CC==2000){now.half_second++;timer0_times_CC=0;if(now.half_second==60) now.half_second=0;}timer0_times++; //一秒一分一时if (timer0_times==4000){ now.second++;timer0_times=0;if(now.second==60){ now.minute++;now.second=0;if(now.minute==60){ now.hour++;now.minute=0;if(now.hour==24) now.hour=0;} } }/******************扫描显示******************************/switch(mode){case 0 :{switch(i){ /*0.005秒选一次*/ case 0:P1=seven_reg[now.minute%10] ;if(now.half_second%2==0)P1_7=1; /*实现让它0.5秒闪一次*/break;case 1:P1=seven_reg[now.minute/10];//小数点不亮同,P1_7=1if(now.half_second%2==0)P1_7=1; /*为什么不能放在上一句前面昵????*/ break;case 2:P1=seven_reg[now.hour %10];break;case 3:P1=seven_reg[now.hour /10];break;}} break;case 1:{switch(i){case 0:P1=seven_reg[now.alarm_minute%10] ;break;case 1:P1=seven_reg[now.alarm_minute/10];break;case 2: P1=seven_reg[now.alarm_hour %10];break;case 3: P1=seven_reg[now.alarm_hour /10];break; }} break;}P3=scan[i];i++;if (i==4) i=0;if(now.quarter_second%2==0){ k++;if(k==(song[j][1]*4)){ j++;k=0;if(j==22) j=0;} } }/****************************************************************/void timer0_initialize(){ EA=0;TR0=0;TMOD=0X12;TL0=(256-250); //0.025ms 自动加载模式0.025*4000=1sTH0=(256-250);ET0=1;TR0=1;EA=1;}void timer1_initialize(){TR1=0;TL1=(65536-tone[song[j][0]])%256;TH1=(65536-tone[song[j][0]])/256;TMOD=0X12;ET1=1;}main(){ unsigned char m1=0;speaker=0;now.alarm_minute=1;timer0_initialize();timer1_initialize();while(1){if(now.alarm_minute!=0)//将闹钟设置为0时,相当于取消闹钟,不会响{ if(now.hour==now.alarm_hour&&now.minute==now.alarm_minute) { if(CC==0&&timer0_times_EE==500) m1=1;switch (m1){ case 0:TR1=1 ;break;case 1 :TR1=0;speaker=0;break;}}else{TR1=0;speaker=0;m1=0;} } } }#include<reg52.h>sbit P10=P1^0; //第0位数码管sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;#define THCO 0xee#define THLO 0x00unsigned char miao=0,fen=0,shi=0;unsigned char code duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; main(void){TMOD=0x11;TH0=THCO;TL0=THLO;EA=1;ET0=1;TR0=1;while(1);}void timw0() interrupt 1{static unsigned char c=0,k=0;TH0=THCO;TL0=THLO;P1|=0xff;c++;if(c>200) {miao++;if(miao>=60){miao=0;fen++;}if(fen>=60){shi++;fen=0;}c=0;}if(k>3){k=0;}k++;switch(k-1){case(0):P10=0;P0=duan[shi/10];break;case(1):P11=0;P0=duan[shi%10];break;case(2):P12=0;P0=duan[fen/10];break;case(3):P13=0;P0=duan[fen%10];break;}}这是时钟程序,可以运行,无小数点,显示时分,小数点断码是0x80,其余的只有靠你自己了。
说明:最初跑得不太准,把1302的电容换成7p以后,精度非常好,具体没有查误差,反正好几个月与家里的石英钟很对时。
5v供电,亮度不高,室内用正好。
本人程序基本抄袭的,其中秒是用定时器模拟闪动,各位老师多多指教,原来是显示带拐角的7,让我改了,第一位为零时也改作不显示了,请各位大大批评指正!随便挣俩钱儿(感谢江顺万老师的细心批评指正,由于自己不够严谨导致一点错误,已经在原文改过,深表歉意!)先上电路图:再上个实物图:分解图:最后上c程序,不用下载,照顾没米的大大,欢迎批评,砸点儿币过来。
三鞠躬!/**********************************DS1302 四位数码管***********************************/#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define D P2 //段选#define D P0 //位选sbit IO=P1^1; //数据口sbit SCLK=P1^2; //控制数据时钟sbit RST=P1^0; //使能端、复位端/************按键引脚定义***********/sbit s1=P1^5; //按键加sbit s2=P1^3; //按键减sbit s3=P1^4; //按键选择sbit led=P1^7; //闪烁的小数点uchar s, knum=0,snum,fnum;标志。
/***********写时分秒地址************/#define write_shi 0x84#define write_fen 0x82#define write_miao 0x80/***********读时分秒地址************/#define read_shi 0x85#define read_fen 0x83#define read_miao 0x81bit miao_flag;char miao_num;char Dmiao;char shi,fen,miao; //读出数据存储变量uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //不带小数点,共阳uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点,共阳void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如 delay(200);大约延时200ms.{ //delay(500);大约延时500ms.uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void t0_init() //定时50ms一个中断{TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}uchar read_1302(uchar add) //读函数{uchar i,date;RST=0; //禁止读写数据for(i=0;i<8;i++){RST=1;SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++){if(IO)date=date|0x80;elsedate=date|0x00;SCLK=1;date>>=1;SCLK=0;}RST=0;date=date/16*10+date%16;//进制转换16转10进制IO=0; //数据读完后,IO口必须为0,不然小时一直显示85 return date;}void write_1302(uchar add,uchar dat) //写函数{uchar i;RST=0; //禁止读写数据SCLK=0;for(i=0;i<8;i++) //写地址{RST=1; //允许读写数据SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++) //写数据{RST=1; //允许读写数据SCLK=0;IO=dat&0x01;dat>>=1;SCLK=1;}RST=0;}void init_1302() //初始化函数设置时间{flag=read_1302(0x81);if(flag&0x80)write_1302(0x8e,0x00); //保护取消,可以进行读写操作write_1302(write_miao,0x56);write_1302(write_fen,0x49);write_1302(write_shi,0x14);write_1302(0x90,0xa5);write_1302(0x8e,0x80); //保护启动,不能进行读写操作}void display(uchar shi,uchar fen) //显示函数{if(knum==0){snum=30;fnum=30;}if(knum==1){fnum++;snum=30;}if(knum==2){snum++;fnum=30;}if(snum>=30){W=0xF7; //位选s=d[shi/10];//段码先给s,判断其值是否为0,if(s==0xc0){W=0xff;D=0xff;}D=s;//s不为零则给D,让其显示delay(5);D=0Xff; //消隐if(miao_flag) //小数点闪烁 {miao_flag=0;W=0xFb;D=dd[shi%10];delay(5);D=0Xff; //消隐}else{W=0xFb;D=d[shi%10];delay(5);D=0Xff;}if(snum==60)snum=0;}if(fnum>=30){W=0xFd;D=d[fen/10];delay(5);D=0Xff; //消隐W=0xFe;D=d[fen%10];delay(5);D=0Xff; //消隐if(fnum==60)fnum=0;}}void read_sf(){miao=read_1302(read_miao); /*if(miao!=Dmiao){Dmiao=miao;TR0=1;miao_flag=1;} */fen=read_1302(read_fen);shi=read_1302(read_shi);display(shi,fen);}void keyscan() //按键扫描函数{if(s3==0) //选择按键按下{delay(10);if(s3==0){while(!s3)display(shi,fen); //加上这句,按键按下就不会闪knum++;if(knum==1) //分闪烁{write_1302(0x8e,0x00); //保护取消write_1302(write_miao,0x80);}if(knum==3) //时钟启动{knum=0;write_1302(write_miao,0x00);write_1302(0x8e,0x80); //保护启动}}}if(knum==1) //分钟调节{if(s1==0) //加{delay(10);if(s1==0){while(!s1)display(shi,fen); //加上这句,按键按下就不会闪fen++;if(fen==60)fen=0;write_1302(write_fen,fen/10*16+fen%10); //写入1302 // read_sf(); //读出时间,然后显示}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen); //加上这句,按键按下就不会闪 fen--;if(fen==-1)fen=59;write_1302(write_fen,fen/10*16+fen%10);read_sf();}}}if(knum==2){if(s1==0){delay(10);if(s1==0){while(!s1)display(shi,fen); //加上这句,按键按下就不会闪 shi++;if(shi==24)shi=0;write_1302(write_shi,shi/10*16+shi%10);read_sf();}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen); //加上这句,按键按下就不会闪 shi--;if(shi==-1)shi=23;write_1302(write_shi,shi/10*16+shi%10);read_sf();}}}}void main(){init_1302();t0_init();while(1){ if(miao_num<10)led=0;if(miao_num>=10)led=1;read_sf();keyscan();}}void t0_timer() interrupt 1 {TMOD=0X01;TH0=(65536-50000)/256; TL0=(65536-50000)%256; miao_num++;if(miao_num>=20){miao_num=0;miao_flag=1;}}。
目录一.前言二.设计任务1.设计题目:4位数字时钟设计2.技术指标及设计要求3.给定条件及器件三.设计方案与实现1.硬件设计2.相关器件介绍3.数码管介绍4.数码管的驱动方式5.电路设计电路原理图如下,采用AT89C2051单片机制作,使用3~6V直流电源。
S1为复位按键,S2调时,S3调分;注意:1安装前检查元件,2元件安装极性和引脚方向。
此外J1 和J2是两根“飞线”,请先用电阻剪角焊接,然后焊接数码管。
四、总结五、附录元件清单六、参考文献一、前言当前,电子技术已经广泛应用于社会生活中,电子技术俨然成为了我们日常生活的必备技术,无论计算机、电视机、洗衣机还是手机、MP3播放器都不能缺少电子技术的支持。
电子技术综合课程设计是集电路分析、模拟电子技术、数字电子技术以及电路实验、模拟电子技术实验、数字电子技术实验等课程之后的一门理论与实践相结合的综合设计性课程。
作为电子信息领域的一员,无疑电子技术对我们的专业课学习至关重要,通过对《数字电子技术基础》、《模拟电子技术基础》等课程的学习,经过不懈的探讨努力,最终完成设计任务制作。
本次课程设计我们将设计一个四位数字时钟。
本系统采用以A T89C2051为主控芯片,实现电子时钟的设计并考虑节约系统的硬件,而且达到时钟功能为24小时的设计方式,显示时、分;具有快速校准时、分的功能,实现时间的调整,然后输出四位的显示器显示出来。
二、设计任务1、题目:4位数字时钟的设计2、技术指标及设计要求(1)显示小时、分钟时间(2)实现秒的量化显示(3)具有调整时间功能(4)手动复位显示功能3、综合条件及器件(1)单片机及相关外围器件(2)直流稳压电源4V(3)万用电路板(4)4联共阳数码管4、器件介绍1)数码管介绍数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
《单片机原理与应用》课程设计题目:单片机电子时钟的设计与实现一、题目单片机电子时钟的设计与实现二、主要功能要求1.基本要求:(1)实现功能:若使用4位数码管,系统开机显示四个闪烁的“8”,前两位数码管用于小时(24小时制)的调整和显示,后两位数码管用于分钟的调整和显示,第3位数码管的小数点闪烁作为秒的指示使用,闪烁一下表示1秒,60秒后分钟数码管加1显示,60分后小时数码管加1显示;若使用6位数码管,系统开机显示六个闪烁的“8”,前两位数码管用于小时(24小时制)的调整和显示,中间两位数码管用于分钟的调整和显示,后两位数码管用于秒的调整和显示,时钟每走1秒,秒数码管加1显示,60秒后分钟数码管加1显示,60分后小时数码管加1显示。
电子时钟走时的调整由键盘输入完成。
键盘输入还可以控制电子时钟的启动和停止。
(2)设计89S51单片机最小系统。
(3)掌握使用Protel 99se绘制原理图和布板的过程、方法和技巧。
(4)掌握单片机开发软件(Keil C51或Wave)的使用和调试。
(5)编写并调试单片机定时及其中断程序,以实现电子时钟的功能。
(6)设计八段数码管显示电路并编写驱程,输入并调试拆字程序和数码显示程序。
(7)掌握硬件和软件联合调试的方法。
(8)完成系统硬件电路的设计和制作。
(9)完成系统程序的设计。
(10)完成整个系统的设计、调试和制作。
三、整体设计框图及整机概述整机概述:单片机开机时,自动读取ds1302的时间初始化时分秒。
之后由单片机的定时器产生基准时间信号开始计时。
功能简介:本设计具有时钟和闹铃功能,在掉电情况下能完成时钟的正常运行。
六个数码管显示时钟的时、分、秒。
1602液晶第一行显示时钟的年、月、日,第二行显示提示操作。
四个按键用来完成时钟和闹铃的调节设置,按键1为功能选择键,可分别进入调节时钟的时和分、闹铃的时和分、1602的年、月、日、星期。
按键2和按键3分别为数字加一和减一键。
/******************************************************************************************* **/#include<STC12C2052AD.H>//STC头文件/******************************************************************************************* ***///“程序开发调试设置项”#define DY_LI 9 //设置LED显示的亮度(值域:~9)#define DY_DELAY 12 //设置每一个点显示的时间长度(~20)/******************************************************************************************* ***/sbit DY_LED1_H1 =P3 ^ 0; //设置LED点阵屏连接的I/O口sbit DY_LED1_H2 =P3 ^ 1; //设置LED点阵屏连接的I/O口sbit DY_LED1_H3 =P3 ^ 2; //设置LED点阵屏连接的I/O口sbit DY_LED1_H4 =P3 ^ 3; //设置LED点阵屏连接的I/O口sbit DY_LED1_L1 =P1 ^ 0; //设置LED点阵屏连接的I/O口sbit DY_LED1_L2 =P1 ^ 1; //设置LED点阵屏连接的I/O口sbit DY_LED1_L3 =P1 ^ 2; //设置LED点阵屏连接的I/O口sbit DY_LED1_L4 =P1 ^ 3; //设置LED点阵屏连接的I/O口sbit DY_LED1_L5 =P1 ^ 4; //设置LED点阵屏连接的I/O口sbit DY_LED1_L6 =P1 ^ 5; //设置LED点阵屏连接的I/O口sbit DY_LED1_L7 =P1 ^ 6; //设置LED点阵屏连接的I/O口sbit DY_LED1_L8 =P1 ^ 7; //设置LED点阵屏连接的I/O口//sbit DY_BEEP =P2 ^ 2; //扬声器//sbit DY_KEY1 =P0 ^ 2; //按键(M键)(连接在P1.3和P0.2,读P0.2为低时表示有按键动作)//sbit DY_KEY2 =P3 ^ 0; //按键(+键)(连接在P4.6和P3.0,读P3.0为低时表示有按键动作)//sbit DY_KEY3 =P3 ^ 6; //按键(-键)(连接在P2.4和P3.6,读P3.6为低时表示有按键动作)#define DY_P1M0SET 0x00 //设置I/O口工作方式//00000000(左到右,高到低位)#define DY_P1M1SET 0x00 //设置I/O口工作方式//00101000#define DY_P3M0SET 0x00 //设置I/O口工作方式//00000000#define DY_P3M1SET 0xff //设置I/O口工作方式//10010100data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS,ty;//设置日、月、年、周、时、分、秒和温度存放区data unsigned char cou = 0; // 软计数器,对ms时基信号累加到sdata unsigned char bn;//扫描映射全局变量data unsigned char KEY_BIT = 0;//按键值data unsigned char DY_PWM;//显示亮度data unsigned char DY_PWM2;//显示暂存unsigned char code disdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9)};/******************************************************************************************* **/void delay (unsigned int a){ // 用于点扫描的延时unsigned int i;while( --a != 0){for(i = 0; i < DY_DELAY; i++);}}/******************************************************************************************* **/void delay1ms (unsigned int a){ // 1ms延时程序(MHz 10倍于单片机速度时)unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}}/******************************************************************************************* **/void dis_off (void){P1 = ~DY_P1M1SET; //关所有显示P3 = ~DY_P3M1SET;delay(10-DY_PWM);}/******************************************************************************************* **/void displayHH1 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H1 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH2 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H2 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H2 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H2 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H2 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H2 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H2 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H2 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H2 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH3 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H3 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H3 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H3 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H3 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H3 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H3 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H3 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H3 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH4 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H4 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H4 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H4 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H4 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();if(i == 0x10){DY_LED1_H4 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H4 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H4 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H4 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void diplay_data (unsigned char l,unsigned char d){switch (l){//显示的列位置case 1://displayHH1(d); //将显示数据送入break;//case 2://displayHH2(d); //将显示数据送入break;//case 3://displayHH3(d); //将显示数据送入break;//case 4://displayHH4(d); //将显示数据送入break;//}}/******************************************************************************************* **/void init (void){ //上电初始化P1M0 = DY_P1M0SET;P1M1 = DY_P1M1SET;P3M0 = DY_P3M0SET;P3M1 = DY_P3M1SET;////dis_off();DY_PWM = DY_LI;////TMOD = 0x11; // 定时/计数器,1工作于方式TH0 = 0x3c; // 预置产生ms时基信号EA = 1; // 开总中断ET0 = 1; // 定时/计数器允许中断TR0 = 1; // 开闭定时/计数器//////TIME_DD = 18; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值//TIME_MO = 5; //初始时间:年月日周一,时分秒//TIME_YY = 9;//TIME_WW = 1;//TIME_HH = 22;//TIME_MM = 13;//TIME_SS = 40;}/******************************************************************************************* **/void main (void){ //主程序init();while (1){diplay_data (1,disdata[TIME_MM/10]);diplay_data (2,disdata[TIME_MM%10]);diplay_data (3,disdata[TIME_SS/10]+0x80);diplay_data (4,disdata[TIME_SS%10]+0x80);}}/******************************************************************************************* ***/void tiem0(void) interrupt 1{ // T/C0中断服务程序(产生ms时基信号)cou++; // 软计数器加if(cou > 19){ // 计数值到(1s)cou = 0; // 软计数器清零TIME_SS++; // 秒计数器加(进位ms*100=1s)if(TIME_SS > 59){ // 秒计数值到TIME_SS = 0; // 秒计数器清零TIME_MM++; // 分计数器加(进位s=1m)if(TIME_MM > 59){ // 分计数到TIME_MM = 0; // 分计数器清零TIME_HH++; // 时计数器加(进位m=1h)if(TIME_HH > 23){ // 时计数到TIME_HH = 0; // 时计数器清零}}}}TH0 = 0x3c; // 重置定时常数TL0 = 0xb0;}/******************************************************************************************* ***//*************************************************************/*************************************************************/。
LED数码显示电子钟一、产品说明数码显示电子钟电路,采用LM8560、CD4060和四位LED显示屏,通过驱动显示屏便能显示时、分。
振荡部分采用石英晶体振作时基信号源,从而保证了走时的精确。
该电路还供有定时报警功能,它定时调整方便,电路稳定可靠,能耗低。
该产品还具有定时报警功能。
它定时调整方便,电路稳定可靠。
本产品时钟显示采用12小时制,使用四个LED数码管显示时间,本产品由五个操作开关控制S1、S2、S3、S4、K1。
其输入电源为220V交流电源,经由变压器输出6V电压,安全环保。
适应于小型办公场地、书房、卧室的使用。
二、原理框图及程序流程图1.1原理框图1.2 程序流程图三、原理及参数该产品由220V交流电直接供电;由集成芯片LM8560与CD4060和四位LED 显示屏实现时、分的显示;并具有闹钟功能;由蜂鸣器实现提示报警功能。
1、CD4060芯片工作电压范围宽在3V~15V,输入阻抗高,唯一现在使用的可能就是计数器,CD4060的计数器可以到14级二进制串行计数/ 分频器。
CD4060内部包含14位二分频器和一个振荡器,电路简洁,30720HZ的信号经分频后,得到50HZ的信号送到LM8560的25脚,并做秒信号经VT2、VT3驱动显示屏内的冒号闪动2.晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。
晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定。
数字钟的精度主要取决于时间标准信号的频率及其稳定度。
晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确。
该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数。
3、LM8560集成电路内含显示译码驱动电路、12/24小时选择电路及以其他各种设置报警等电路。
它具有较宽的工作电压范围(7.5-14V)和工作温度范围(-20℃+70℃);自身功耗很小,输出能直接驱动发光二极管显示屏。
电子时钟实验报告电子时钟实验报告_电子时钟电子时钟实验报告一、实验目的学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。
二、设计任务及要求利用实验平台上4个LED数码管,设计带有闹铃功能的数字时钟,要求:1.在4位数码管上显示当前时间,显示格式为“时时分分”;2.由LED闪动做秒显示;3.利用按键可对时间及闹玲进行设置,并可显示闹玲时间。
当闹玲时间到蜂鸣器发出音乐,按停止键使可使闹玲声停止。
三、工作原理及设计思路利用单片机定时器完成计时功能,定时器0计时中断程序每隔5ms中断一次并当作一个计数,每中断一次计数加1,当计数200次时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。
为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现LED显示。
闹铃声由交流蜂鸣器产生,电路如右图,当P1.7输出不同频率的方波,蜂鸣器便会发出不同的声音。
四、电路设计及描述(1) 硬件连接部分:在ZKS-03单片机综合实验仪上有四位共阳LED数码管,其标号分别为LED1~LED4。
为了节省MCU的I/O口,采用串行接口方式,它仅占用系统2个I/O口,即P1.0口和P1.1口,一个用作数据线SDA,另一个用作时钟信号线CLK,它们都通过跳线选择器JP1相连。
由于采用共阳LED数码管,它的阴极分别通过限流电阻R20~R27连接到控制KD_0~KD_Q7。
这样控制8个发光二极管,就需要8个I/O口。
但由于单片机的I/O口资源是有限的,因此常采用实验电路所示的串并转换电路来扩充系统资源。
串并转换电路其实质是一个串入并处的移位寄存器,串行数据再同步移位脉冲CLK的作用下经串行数据线SDA把数据移位到KD_0~KD_Q7端,这样仅需2根线就可以分别控制8个发光二极管的亮灭。
而P0口只能作地址/数据总线,P2口只能作地址总线高8位,P3.0、P3.1作为串行输入、输出接口,实验仪上单片机可用作I/O的口仅有:P1.0--P1.7 ,8位;P3.2、P3.3、P3.4、P3.5 ,4位。