LED数码管时钟程序+电路-时间可调
时间:08-16
来源:互联网
点击:
不来废话上程序:/**************************************************************** 程序名称:51单片机数码管电子钟+定时闹钟 晶振:12.00* 实验对象:51hei单片机学习开发板* 单 片 机:AT89S52或STC89C52 闹钟时间:7:10分(程序自定义)*使用定时器方式,数码管显示24小时“00-00-00”(增加中断进入对时功能P1为按键,P2为段选,P0为位选, ****************************************************************//***使用定时器方式,数码管显示24小时“00-00-00”(增加进入对时功能)P1为按键,P2为段选,P0为位选,{闹钟暂时不可调待完善})***/ #include reg52.h> #define uchar unsigned char /*宏定义 */ #define uint unsigned int /*宏定义 */ uchar hour,hour_h,hour_l; /*定义小时,小时的高位,小时的低位*/ uchar min,min_h,min_l; /*分*/ uchar sec,sec_h,sec_l; /*秒*/ uchar int_num; /*定时溢出作用标号*/ sbit key_secadd=P1^1; /*定义了 p1.1为秒增1键,用在调时中断里*/ sbit key_minadd=P1^2; /*定义了 p1.2为分增1键,用在调时中断里*/ sbit key_houradd=P1^3; /*定义了 p1.3为时增1键,用在调时中断里*/ sbit key_intime=P1^0; //按P1.0进入调时sbit key_quit=P1^5; //P1.5退出调时sbit bell=P1^5; //小喇叭void delay(uchar time); /*延时子函数声明*/ void display(); /*显示子函数声明*/ void inter_init(); /*定时器初始化子函数声明*/ void time24();/****专用数码管显示表***/ uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40}; /*0x40显示“一”符号*/ uchar code wema[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00}; /*小时hour 分min 秒sec*/ //---------------------延时子函数--------------------------------void delay(uchar time) /*延时子函数*/ { uchar time_1; for (;time>0;time--) for (time_1=100;time_1>0;time_1--); } //---------------------初始化T0函数-------------------------- void time0(void) interrupt 1 /*定时器T0服务子程序*/ { TH0=(65535-50000)/256; TL0=(65535-50000)%256; int_num++; }//---------------------定时器函数--------------------------void inter_init() /*定时器初始化子函数*/ { EA=1; /*开总中断*/ EX0=1; /*开外部中断0*/ ET0=1; /*打开定时器T0*/ TMOD=0x01; /*工作方式1*/ TCON = 0x00; /*触发方式*/ IP = 0x01; /*中断优先级别,T0优先*/ TH0=(65535-50000)/256; /*置初值,大约50ms一个中断 */ TL0=(65535-50000)%256; TR0=1; /*置位TR0,启动定时器0*/ } //---------------------24小时时间自加 --------------------------void time24() /*时间递增*/ { if(int_num==20) /*值满20,大约就是一秒的时间。*/ { /* 其值设为2,则定时时间快10倍,可做毫秒计时*/ int_num=0; sec++; /*秒值加1*/ if(sec==60) /*如果秒值满60,就归0*/ { sec=0; min++; /*分值加1*/ if(min==60) { min=0; hour++; /*分值归0,时值加1*/ if(hour==24) { hour=0; /*时值满24归0*/ } } } }}//-----------按键调整子函数-------------------------------------void key(void) //按键调整子函数{ if(key_intime==0){EA=0; // 关中断sec=0; //秒归零while(100) //正确 { display();if(key_quit==0){EA=1;break;}if(key_secadd==0) { delay(1); if(key_secadd==0) { sec++; while(!key_secadd); if(sec==60) { sec=0; } } } if(key_minadd==0) { delay(80); if(key_minadd==0) { min++; while(!key_minadd); if(min==60) { min=0; } } } if(key_houradd==0) { delay(80); if(key_houradd==0) { hour++; while(!key_houradd); if(hour==24) {hour=0; } } }} } } //---------------------数码管显示子函数------------------------------------- void display() /*数码管显示子函数*/ {sec_h=sec/10; /*求出秒高位需要显示的字符*/ sec_l=sec%10; /*求出秒低位需要显示的字符*/ min_h=min/10; min_l=min%10; hour_h=hour/10; hour_l=hour%10; P2=duma[sec_h]; /*显示秒高位*/ P0=wema[6]; delay(10);P2=duma[sec_l]; /*显示秒低位*/ P0=wema[7]; delay(10); P2=duma[10]; /* “一”符号的显示 */ P0=wema[5]; delay(10);P2=duma[min_h]; /*分*/ P0=wema[3]; delay(10);P2=duma[min_l]; P0=wema[4]; delay(10);P2=duma[10]; /* “一”符号的显示 */ P0=wema[2]; delay(10); P2=duma[hour_h]; /*时*/ P0=wema[0]; delay(10);P2=duma[hour_l]; P0=wema[1]; delay(10);} //---------------------主函数--------------------------------/*void alarm_clock() //闹钟子函数-变频发声{uint i,j,y,m;if(hour==00)//时到了00点?{if(min>=01){m=0;} //分大于或等于01就把m清零,若不成立向下执行if(min==00)//到了00分?{if(m15){do{ //循环-变频m++; display();for(i=0;i2000;i++) {bell=~bell;for(j=0;j24;j++);} //取反/ for(y=0;y2000;y++){bell=~bell;for(j=0;j25;j++);} //取反/for(i=0;i2000;i++) {bell=~bell;for(j=0;j26;j++);} //取反/ for(i=0;i2000;i++) {bell=~bell;for(j=0;j27;j++);} //取反/ }while(m15); //闹15次结束}}} }*///---------------------主函数--------------------------------void main() { inter_init(); /*定时器初始化*/ hour=23; /*自定义一个初值,方便快速观察翻转状态(可修改)*/ min=59; sec=50; while(1){ key(); time24(); /*分开时间,分别显示字符*/ //alarm_clock();//闹钟函数display(); /*调用显示函数来显示*/ } }
- DSP在LED大屏显示中的应用(03-14)
- DSP在LED显示中的应用(08-21)
- 基于μC/OS2II的LED显示屏控制器(08-14)
- 基于DSP的LED大屏幕显示系统(10-03)
- 基于单片机的彩灯设计方案(10-29)
- 基于μC/OS-II及Nios II的多窗口显示屏控制器的设计与实现(01-23)