单片机LED时钟程序

合集下载

51单片机作的电子钟程序及电路图

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个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。

以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断入口程序 ;; (仅供参考) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG 0000H ;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H ;外中断0中断程序入口RETI ;外中断0中断返回ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行ORG 0013H ;外中断1中断程序入口RETI ;外中断1中断返回ORG 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行ORG 0023H ;串行中断程序入口地址RETI ;串行中断程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 主程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START: MOV R0,#70H ;清70H-7AH共11个内存单元MOV R7,#0BH;clr P3.7 ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清20H(标志用)MOV 7AH,#0AH ;放入"熄灭符"数据MOV TMOD,#11H ;设T0、T1为16位定时器MOV TL0,#0B0H ;50MS定时初值(T0计时用)MOV TH0,#3CH ;50MS定时初值MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)MOV TH1,#3CH ;50MS定时初值SETB EA ;总中断开放SETB ET0 ;允许T0中断SETB TR0 ;开启T0定时器MOV R4,#14H ;1秒定时用初值(50M S×20)START1: LCALL DISPLAY ;调用显示子程序JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序SJMP START1 ;P3.7口为1时跳回START1 SETMM1: LJMP SETMM ;转到时间调整程序SETMM; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR TR0 ;关闭定时器T0MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,A ;重装初值(低8位修正值)MOV A,#3CH ;高8位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8位修正值)SETB TR0 ;开启定时器T0DJNZ R4, OUTT0 ;20次中断未到中断退出ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于60秒时中断退出ACALL CLR0 ;大于或等于60秒时对秒计时单元清0MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0MOV R0,#79H ;指向小时计时单(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器RETI ;中断返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 闪动调时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T1中断服务程序,用作时间调整时调整单元闪烁指示INTT1: PUSH ACC ;中断现场保护PUSH PSW ;MOV TL1, #0B0H ;装定时器T1定时初值MOV TH1, #3CH ;DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)MOV R2,#06H ;重装0.3秒定时用初值CPL 02H ;0.3秒定时到对闪烁标志取反JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"MOV 72H,76H ;02H位为0时正常显示MOV 73H,77H ;MOV 74H,78H ;MOV 75H,79H ;INTT1OUT: POP PSW ;恢复现场POP ACC ;RETI ;中断退出FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据MOV 74H,78H ;MOV 75H,79H ;AJMP INTT1OUT ;转中断退出FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示MOV 74H,7AH ;MOV 75H,7AH ;AJMP INTT1OUT ;转中断退出; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 加1子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADD1: MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高四位与低四位交换ORL A,@R0 ;前一地址中数据放入A中低四位ADD A,#01H ;A加1操作DA A ;十进制调整MOV R3,A ;移入R3寄存器ANL A,#0FH ;高四位变0MOV @R0,A ;放回前一地址单元MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高四位与低四位交换ANL A,#0FH ;高四位变0MOV @R0,A ;数据放入当削地址单元中RET ;子程序返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 清零程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;............. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 时钟调整程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;当调时按键按下时进入此程序SETMM: cLR ET0 ;关定时器T0中断CLR TR0 ;关闭定时器T0LCALL DL1S ;调用1秒延时程序JB P3.7,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)MOV R2,#06H ;进入调时状态,赋闪烁定时初值SETB ET1 ;允许T1中断SETB TR1 ;开启定时器T1SET2: JNB P3.7,SET1 ;P3.7口为0(键未释放),等待SETB 00H ;键释放,分调整闪烁标志置1SET4: JB P3.7,SET3 ;等待键按下LCALL DL05S ;有键按下,延时0.5秒JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态MOV R0,#77H ;按下时间小于0.5秒加1分钟操作LCALL ADD1 ;调用加1子程序MOV A,R3 ;取调整单元数据CLR C ;清进位标志CJNE A,#60H,HHH ;调整单元数据与60比较HHH: JC SET4 ;调整单元数据小于60转SET4循环LCALL CLR0 ;调整单元数据大于或等于60时清0CLR C ;清进位标志AJMP SET4 ;跳转到SET4循环CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。

单片机 定时器实现24小时时钟程序

单片机  定时器实现24小时时钟程序

#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制sbit LS138C = P2^4; //定义138译码器的输入脚C由sbit k1=P2^0;sbit k2=P2^1 ;sbit k3=P2^5;bit flag;uchar sec=0,min=0,hour=12;uchar count_10ms, DelayCNT;int m=1;//此表为LED 的字模, 共阴数码管0-9 -unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void delay(uint z){int x,y;for(x=z;x>0;x--)for(y=20;y>0;y--) ;}void timer(){TMOD=0x01;TH0=0xdc;TL0=0x00;EA=1;ET0=1;TR0=1;}void key(){ int t;if(k1==0){delay(30);if(k1==0){ while(!k1);t++;m=t%2;}}}/************主函数**********************/ main(){ unsigned int i ;unsigned int LedOut[10];timer();while(1) //进入循环状态{if(m==0){if(k2==0){delay(30);if(k2==0)while(!k2);hour++;}if(hour>=24)hour=0;if(k3==0){delay(30);if(k3==0)while(!k3);min++;}if(min>=60)min=0;}LedOut[0]=Disp_Tab[hour/10];LedOut[1]=Disp_Tab[hour%10];LedOut[2]=Disp_Tab[10];LedOut[3]=Disp_Tab[min/10];LedOut[4]=Disp_Tab[min%10];LedOut[5]=Disp_Tab[10];LedOut[6]=Disp_Tab[sec/10];LedOut[7]=Disp_Tab[sec%10];for( i=0; i<9; i++) //实现8位动态扫描循环{P0 = LedOut[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选也可以是用查表的方式学员可以试着自己修改{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(10);}}}void timer1() interrupt 1 // 中断函数{TH0=0xdc;TH0=0x00;key();if(m){{count_10ms++;}if(count_10ms==10){count_10ms=0;sec++;if(sec>=60){sec=0;min++;if(min>=60){min=0;hour++;if(hour>=24){hour=0;sec=0;min=0;}}}}}}。

基于51单片机电子时钟程序

基于51单片机电子时钟程序

// 本程序实现功能:显示小时和分钟,并以最后一位的小数点闪烁一次表示一秒。

按下INT0键后显示日期。

并在所设定的时间蜂铃器响5次以此为闹钟;// 第二:按下INT1键后,可对时间,日期,闹钟进行设置,再次按下INT1推出设置//// 显示说明:前两位显示小时和月份,后两位显示分钟和日期//#include <reg52.h>/*==========================================宏定义uchar和uint===========================================*/#define uchar unsigned char#define uint unsigned intsbit alarm=P1^4;/*==============================================变量的定义==============================================*/int year=2010;/*初始年份为2010年*/uchar alarm_hour=0,alarm_min=0; /*初始闹钟时间为00:00*/uchar qian=0,bai=0,shi=0,ge=0,key_flag=0,Key=0,num=0,Flag=0; /*定义输出函数变量和按键号*/uchar x,dis_flag=0; /*显示变换标志位*/uchar Key_control=0; /*按键被按下的标志位*/uchar mounth=7,day=25; /*初始日期设为7月25号*/uchar hour=0,t=0,min=0,sec=0,ring=0;/*初始时间为00:00:00*//*=============================================子函数的定义=============================================*/void Init(); /*此函数用于初始化所有需要使用的中断*/void delay(uint z); /*用于数码管显示*/uchar Key_num(void); /*此函数为确定按下的按键输出编号*/void Led_display();void display(uchar cc, uchar dd); /*显示时间的函数,中间的点表示:*/void display_nian(uchar cc, uchar dd); /*显示年份的显示函数,即没有中间的点*/void display_date(uchar cc, uchar dd); /*显示日期的函数,即四个小数点全亮*/void display_alarm(uchar cc, uchar dd); /*显示闹钟的函数,第二个和第四个点*/void Leap_Nonleap(int aa); /*判断是闰年还是平年,并将二月的最大天数赋给Mounth_array[1]*/void Judge_Setting(uchar Key_set); /*所得出的按键号进行对应的设置*//*==========================================所使用数组的定义============================================*/uchar Mounth_array[12]={31,29,31,30,31,30,31,31,30,31,30,31}; /*每个月的最大天数数组*/uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,/*数码管显示编码*/};uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/*百位及其小数点的段码*//*==============================================主函数部分==============================================*/void main(){Init();while(1){Leap_Nonleap(year); /*进入大循环后首先对年份进行判断*/while(Key_control)/*当P3.3被按下后Key_control=1进入函数进行设置,直到第二次Key_control=0推出循环*/{Flag=Key_num(); /*将按键函数里面是否有按键被按下的标志位赋给Flag*/if(Flag) /*当有按键被按下时,进入设置函数*/{Judge_Setting(num); /*将num值传入函数,并进行设置*/}Led_display(); /*保证在设置的循环时有显示*/}Led_display();/*循环式动态显示*/}}/*===========================================系统初始化函数=============================================*/void Init() /*初始化系统,启动计时器0,1,外部中断0,1*/{TMOD=0x01; /*将计时器0定位工作方式1,将计时器1定为工作方式2*/TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;TR0=1;// ET1=1;// TR1=1;IE0=1;EX0=1; /*使用外部中断0和1,分别作为显示变换,设置的前戏*/IT0=1;/*为下降沿突发*/IE1=1;EX1=1;IT1=1;/*为下降沿突发*/EA=1;}void Display_flag() interrupt 0 /*使用外部中断0,进行显示时间和日期的转换P3.2口切换显示*/{dis_flag++;if(dis_flag==4) /*当dis_flag=0时,输出时间,当dis_flag=1时,输出日期,当dis_flag=2时,输出闹钟*/dis_flag=0; /*当dis_flag=3时,输出年份。

C语言51单片机时钟程序

C语言51单片机时钟程序
/*延时?函数*/ void delay(uint k) { uint i,j; for(i=0;i<k;i++){ for(j=0;j<121;j++) {;}}
} /*----------------------- 主函数 ------------------------- */
/*主函数*/
void main()
{
init_timer();
/*定时器 T0 初始化*/
while(1) /*无限循环*/
{
if(P2_4==0)scan_key(); /*有按键,调用按键扫描?函数*/
switch(set)
/*根据 set 键值散转*/
{
case 0:time(); break; /*走时时间程序*/
程序三
同时用两个定时器控制蜂鸣器发声, 定时器 0 控制频率,定时器 1 控制同个 频率持续的时间,间隔 2s 依次输出 1,10,50,100,200,400,800, 1k(hz)的方波
#include<reg52.h> //52 单片机头文件 #include <intrins.h> //包含有左右循环移位子函数的库 #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 sbit beep=P2^3;
ET0=1;//开定时器 0 中断
TR0=1;//启动定时器 0
a=0xfe;
while(1);//等待中断产生
}
void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; if(tt==2) {

单片机电脑时钟的程序代码

单片机电脑时钟的程序代码

#include<reg51.h>sbit P10=P1^0;sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit P20=P2^0;sbit P21=P2^1;sbit P22=P2^2;sbit P23=P2^3;sbit P24=P2^4;sbit P25=P2^5;sbit P26=P2^6;sbit P32=P3^2;unsigned int year=2011,month=5,diary=16,hour=12,minute=0,flag=0;unsigned char code led[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; main(void){TMOD=0x11;TR0=1;ET0=1;EA=1;while(1);}void timer0() interrupt 1{static unsigned char Bit=0,huan=0,m=0,n=0,l=0,k=0,a=0;static unsigned int i=0,z=0,num=0;TH0=0xee;TL0=0x00;if(flag==0){P23=1;P24=1;P25=1;P26=1;z++;if(z==200)z=0;if(++i%12000==0){i=0;if(++minute==60){minute=0;if(++hour==24){hour=0;if(++diary==31){diary=1;if(++month==13){month=1;year++;} } } }} }if(P20==1){m=1;}if(P20==0&&m==1){flag++;m=0;i=0;huan=0;num=0;P23=1;P24=1;P25=0;P26=0;if(flag>4)flag =0;}if(P21==1){n=1;}if(P21==0&&n==1){n=0;switch(flag){case(1):switch(huan){case(0):if(year<10000) year++; break;case(1):if(year<10000) year+=100; break; }break;case(2):switch(huan){case(0):if(diary<31) diary++; break;case(1):if(month<13) month++; break; }break;case(3):switch(huan){case(0):if(minute<60) minute++;break;case(1):if(hour<24) hour++; break; }break;} }if(P22==1){l=1;}if(P22==0&&l==1){l=0;switch(flag){case(1):switch(huan){case(0):if(year>0) year--; break;case(1):if(year>100) year-=100;break; }break;case(2):switch(huan){case(0):if(diary>1) diary--; break;case(1):if(month>1) month--; break; }break;case(3):switch(huan){case(0):if(minute>0) minute--; break;case(1):if(hour>0) hour--; break; }break;} }if(P32==1){k=1;}if(P32==0&&k==1){k=0;if(flag==4&&a==0)a=1;if(flag==4&&a==1)a=0;if(flag!=4)switch(huan){case(0):huan=1;P23=0;P24=0;P25=1;P26=1;break;case(1):huan=0;P23=1;P24=1;P25=0;P26=0;break; } }if(a==1) {i++;if(i>1){i=0;num++;if(num==9999){num=0;}}}if(Bit>3){Bit=0;}Bit++;P1|=0xff;switch(flag){case(0):if(z<100)switch(Bit-1){case(0):P0=led[minute%10]; P13=0;break;case(1):P0=led[minute/10]; P12=0;break;case(2):P0=(led[hour%10])|0x80;P11=0;break;case(3):P0=led[hour/10]; P10=0;break;}elseswitch(Bit-1){case(0):P0=led[minute%10]; P13=0;break;case(1):P0=led[minute/10]; P12=0;break;case(2):P0=(led[hour%10]); P11=0;break;case(3):P0=led[hour/10]; P10=0;break;}break;case(1):switch(Bit-1){case(0):P0=led[year%10]; P13=0;break;case(1):P0=led[year%100/10]; P12=0;break;case(2):P0=led[year%1000/100]; P11=0;break;case(3):P0=led[year/1000]; P10=0;break;}break;case(2):switch(Bit-1){case(0):P0=led[diary%10]; P13=0;break;case(1):P0=led[diary/10]; P12=0;break;case(2):P0=led[month%10]|0x80; P11=0;break;case(3):P0=led[month/10]; P10=0;break;}break;case(3):switch(Bit-1){case(0):P0=led[minute%10]; P13=0;break;case(1):P0=led[minute/10]; P12=0;break;case(2):P0=led[hour%10]|0x80; P11=0;break;case(3):P0=led[hour/10]; P10=0;break;}break;case(4):switch(Bit-1){case(0):P0=led[num%10]; P13=0;break;case(1):P0=led[num%100/10]; P12=0;break;case(2):P0=(led[num%1000/100])|0x80;P11=0;break;case(3):P0=led[num/1000]; P10=0;break;}break;}}。

8位数码管显示电子时钟c51单片机程序

8位数码管显示电子时钟c51单片机程序

8位数码管显示电子时钟c51单片机程序 /*8位数码管显示时间格式 055000 标示05点50分00秒S1 用于小时加1操作S2 用于小时减1操作S3 用于分钟加1操作S4 用于分钟减1操作*/#includereg52.hsbit KEY1=P3^0; //定义端口参数sbit KEY2=P3^1;sbit KEY3=P3^2;sbit KEY4=P3^3;sbit LED=P1^2; //定义指示灯参数code unsigned chartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管09unsigned char StrTab[8]; //定义缓冲区unsigned char minute=19,hour=23,second; //定义并初始化为12:30:00void delay(unsigned int cnt){while(cnt);}/********************************************************** ********//* 显示处理函数 *//********************************************************** ********/void Displaypro(void){StrTab[0]=tab[hour/10]; //显示小时StrTab[1]=tab[hour%10];StrTab[2]=0x40; //显示StrTab[3]=tab[minute/10]; //显示分钟StrTab[4]=tab[minute%10];StrTab[5]=0x40; //显示StrTab[6]=tab[second/10]; //显示秒StrTab[7]=tab[second%10];}main(){TMOD |=0x01; //定时器0 10ms inM crystal 用于计时TH0=0xd8; //初值TL0=0xf0;ET0=1;TR0=1;TMOD |=0x10; //定时器1用于动态扫描 TH1=0xF8; //初值TL1=0xf0;ET1=1;TR1=1;EA =1;Displaypro(); //调用显示处理函数while(1){if(!KEY1) //按键1去抖以及动作{delay(10000);if(!KEY1){hour++;if(hour==24)hour=0; //正常时间小时加1Displaypro();}if(!KEY2) //按键2去抖以及动作 {delay(10000);if(!KEY2){hour;if(hour==255)hour=23; //正常时间小时减1 Displaypro();}}if(!KEY3) //按键去抖以及动作{delay(10000);if(!KEY3){minute++;if(minute==60)minute=0; //分加1Displaypro();}if(!KEY4) //按键去抖以及动作{delay(10000);if(!KEY4){minute;if(minute==255)minute=59; //分减1Displaypro();}}}}/********************************************************** ********//* 定时器1中断 *//********************************************************** ********/void time1_isr(void) interrupt 3 using 0 //定时器1用来动态扫描static unsigned char num;TH1=0xF8; //重入初值TL1=0xf0;switch (num){case 0:P2=0;P0=StrTab[num];break; //分别调用缓冲区的值进行扫描case 1:P2=1;P0=StrTab[num];break;case 2:P2=2;P0=StrTab[num];break;case 3:P2=3;P0=StrTab[num];break;case 4:P2=4;P0=StrTab[num];break;case 5:P2=5;P0=StrTab[num];break;case 6:P2=6;P0=StrTab[num];break;case 7:P2=7;P0=StrTab[num];break;default:break;}num++; //扫描8次,使用8个数码管if(num==8)num=0;}/******************************************************************//* 定时器0中断 *//********************************************************** ********/void tim(void) interrupt 1 using 1{static unsigned char count; //定义内部局部变量TH0=0xd8; //重新赋值TL0=0xf0;count++;switch (count){case 0:case 20:case 40:case 60:case 80:Displaypro();break; //隔一定时间调用显示处理case 50:P1=~P1;break; //半秒 LED 闪烁default:break;}if (count==100){count=0;second++; //秒加1 if(second==60){second=0;minute++; //分加1 if(minute==60){minute=0;hour++; //时加1 if(hour==24)hour=0;}}}}。

基于51单片机,电子显示时钟带闹钟、整点报时、日期、星期

基于51单片机,电子显示时钟带闹钟、整点报时、日期、星期
void xianshishuzu()
{ StrTab[1]=second/10; //秒十位
StrTab[0]=second%10; //秒个位
StrTab[2]=10; //间隔符-
StrTab[4]=minute/10; //分十位
StrTab[3]=minute%10; //分个位
StrTab[5]=10; //间隔符-
void display(uchar w[32])
{ unsigned int i,j,c=0;
if(a==0)//正常时间显示
{ for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示
{ P2=weikong_code[i]; //位选
j=w[i]; //取出要显示的数码
P0=tab[j]; //取出段选编码
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}
week++;//星期走
if(week==8)
week=1;
data1();
week1();
while(second==err);
}
}
/**********************键盘扫描子程序*************************/
{if(dБайду номын сангаасy==30); //闰年29天
{day=1; month++;
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}}

51单片机时钟代码(带秒表闹钟功能)

51单片机时钟代码(带秒表闹钟功能)

51单片机时钟代码(带秒表闹钟功能)#include#include#defineucharunignedchar#defineuintunignedintbitbeep=P1^5;//蜂鸣器bitLED1=P1"6;//LED灯bitep=P2"7;//1602使能端bitr=P2八6;//1602bitrw=P2八5;//1602bit0二P3八4;//停止闹铃和小灯bit1二P3八5;//功能键bit2二P3飞;//增大键bit3二P3X;//减小键bit4二P3「;//bit5=P3^2;bit6二P3八3;bit7=P3^0;uchar1num,4num,count,count1,judge=0;charec,min,hour,miao,fen,hi,ec1,min1,diwei;voiddelay(uintz){ uint某,y;for(某二z;某〉0;某--)for(y=100;y〉0;y—);}voiddi(){beep=0;delay(50);beep=1;}bitlcd_bz()//测试LCD忙碌状态{bitreult;r=0;rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();reult=(bit)(P0&0某80);ep=0;returnreult;}_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}voidwrite_data(uchardat)//写入字符显示数据到LCD{while(lcd_bz());//等待LCD空闲r=1;rw=0;ep=0;P0=dat;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_( );_nop_();_nop_();_nop_();ep=0;}ucharhi,ge;hi=dat/10;ge=dat;write_data(0某30+hi);write_data(0某30+ge);}voidwrite_alarm(ucharadd,uchardat){ucharhi1,ge1;hi1=dat/10;ge1=dat;count=0;//clearwrite_data('A');delay(5);hi=17;voidkeycan()//按键扫描{if(l==0){delay(5);if(1==0){1num++;while(!1);di(); if(1num==1){TR0=0;if(1num==2){if(1num==3){if(1num==4){1num=0;if(1num!=0){if(2==0){delay(5);if(2==0){while(!2);di();if(1num==1){ec++;if(ec==60)ec=0;min++;if(min==60)min=0;if(1num==3){hour++;if(hour==24)hour=0;delay(5);if(3==0){while(!3);di();if(1num==1){ec--;if(ec<0)ec=59;if(1num==2){min--;if(min<0)min=59;hour--;if(hour<0)hour=23;}voidkeycan1(){if(4==0){delay(5);if(4==0){4num++;while(!4);di();if(4num==1){TR0=0;if(4num==3){if(4num==4){if(4num!=0){if(5==0){delay(5);if(5==0){while(!5);di();if(4num==1){miao++;if(miao==60)miao=0; write_alarm(10,miao);if(4num==2){fen++;if(fen==60)fen=0;if(4num==3){hi++;if(hi==24)hi=0;write_alarm(4,hi);if(6==0){delay(5);if(6==0){while(!6);di();if(4num==1){miao--;if(miao<0)miao=59;if(4num==2){fen--;if(fen<0)fen=59;write_alarm(7,fen);if(4num==3){hi--;if(hi<0)hi=23;}}if(7==0){delay(5);if(7==0){while(!7)di();judge++;}}if(judge==2){TL0=0某b0;TH0=0某3c; {ec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;}}}}}if(judge==3){judge=0;ec1=0;min1=0;diwei=0;write_alarm(10,miao);write_alarm(7,fen);write_alarm(4,hi);wr ite_alarm(10,miao);write_alarm(7,fen);write_alarm(4,hi);} if(count==20){count=0;ec++;if(ec==60){ec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;}}}}}。

51单片机电子时钟C语言程序

51单片机电子时钟C语言程序
IT0=0;//电平触发(低电平有效)
EX0=1;
ET0=1;
TR0=1;
yueqh(),riqh();//初始化日月切换
}
void ritiao()//日期的调节函数
{ if(P36==0)//日期加一调节键
{
p36xd();
if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12))
{numyue=1;}
yueqh();
}
if(P37==0)
{
p37xd();
numyue-=1;
if(numyue==0)
{numyue=12;}
yueqh();
}
}
void int0() interrupt 0
{
p32xd();
if(numsec==-1)
{
numsec=59;
}
secqh();
}
}
};
p32xd();
while(P32!=0)//第二次按下p32时,进行分调时
{
for(m=0;m<40;m++)
{
P2=0x00;
P0=table[hou1];
P2=0X20;
delayms(1);
P2=0x00;
P0=table[hou2]&0x7f;
P2=0X10;
delayms(1);
P2=0x00;
P0=table[sec1];

单片机电子时钟设计程序

单片机电子时钟设计程序

单片机电子时钟设计程序
1.引用头文件和定义全局变量
首先需要引用相应的头文件,例如`reg52.h`,并定义全局变量用于
存储时间、闹钟时间以及其他相关参数。

2.初始化时钟
在主函数中,首先进行时钟的初始化。

这包括设置定时器和中断相关
的寄存器,以及初始化显示屏和按钮等外设。

3.时间更新
编写一个中断服务函数,用于根据定时器的中断来更新时间。

在该中
断服务函数中,需要将全局变量中的时间进行递增,并考虑到分钟、小时、日期和星期等的进位和换算。

4.按钮输入
设置一个子函数用于读取按钮输入,并根据按钮的状态来进行相应的
操作,比如切换时钟显示模式、设置闹钟等。

5.显示时间
编写一个子函数用于将时间信息显示在数码管上。

这需要先将时间信
息转换为数码管的显示格式,然后通过IO口输出控制数码管的显示。

6.闹钟设置
使用按钮输入的功能,可以设置闹钟时间和开关闹钟功能。

当闹钟时
间到达时,可以通过控制蜂鸣器发声或点亮LED等方式来进行提醒。

7.主函数
在主函数中,循环执行按钮输入的检测和相应操作,以及时间的更新和显示等功能。

可以通过一个状态机来控制整个程序的流程。

以上是一个简要的单片机电子时钟设计程序的概述。

实际的程序设计过程中,还需要考虑到各个模块之间的交互、错误处理、电源管理以及代码的优化等细节问题。

具体的程序实现可以根据具体需求和硬件平台的差异进行适当的修改和扩展。

单片机课设LED显示电子钟

单片机课设LED显示电子钟

辽宁工业大学单片机与接口技术课程设计(论文)题目:LED显示的电子钟院(系):电子与信息工程学院专业班级:计算机班学号:学生姓名:指导教师:教师职称:起止时间:课程设计(论文)任务及评语院(系):电子与信息工程学院教研室:计算机科学与技术目录第1章设计概述与要求 (1)1.1 设计概述 (1)1.2设计要求 (1)第2章系统设计 (3)2.1 框图设计 (3)2.2 硬件设计 (3)第3章软件设计 (9)3.1 程序流程图 (9)第4章PROTEUS仿真结果 (12)4.1 总体电路仿真结果 (12)4.2 各个功能的仿真结果 (12)第5章总结 (14)参考文献 (14)附录程序代码 (15)第1章设计概述与要求1.1 设计概述课程设计应以学生认知为主体,充分调动学生的积极性和能动性,重视学生自学能力培养。

根据课程设计具体课题安排时间,确定课题的涉及,变成和调试内容,分团队开展课程设计活动,安排完成每部分工作。

课程设计集中在实验室进行。

在课程设计过程中,坚持独立完成,实现课题规定的各项指标,并写出设计报告。

要求学生自己调研,设计系统功能,划分软硬件功能,选择器件,用Proteus软件在PC机上完成硬件原理图设计。

然后使用使用Proteus软件在PC机运行系统仿真,调试电路和修改调试程序。

对整个系统做试运行,有问题再进一步修改调试,直至达到设计的要求和取得满意的效果。

最后编写系统说明书,其内容主要包括系统功能介绍,使用范围,主要性能指标,使用方法,注意事项等。

要求学生通过理论设计和实物制作解决相应的实际问题,巩固和运用在《单片机原理与接口技术》课程中所学的理论知识和实验技能,掌握单片机应用系统的一般设计方法,提高设计能力和实践动手能力,为以后从事电子电路设计、研发电子产品打下良好的基础。

基于AT89C51单片机,制作一个LED显示的智能电子钟。

1.2设计要求1、设计题目:LED显示的电子钟2、设计任务:基于AT89C51单片机,制作一个LED显示的智能电子钟。

基于单片机LED点阵显示电子时钟设计

基于单片机LED点阵显示电子时钟设计

.2015~2016学年第一学期《单片机原理及应用》课程设计报告题目:基于单片机LED点阵显示电子时钟设计班级:13级电子信息姓名:指导教师:.电气工程学院2015年11月《单片机原理及应用》任务书摘要LED显示屏作为信息传播的一种重要手段,已经成为城市信息现代化建设的标志,LED显示屏随着社会经济的不断进步,以及LED制造技术的完善,人们对LED显示屏的认识将会越来越深入,其应用领域将会越来越广;LED显示屏经多年的开发、研制、生产,其技术目前已经成熟。

现在各种广告牌不再是白底黑字了,也不再是单一的非电产品,而是用上了丰富多彩的LED电子产品,为城市增添了一道靓丽的风景。

本次课程设计是基于AT89C52单片机的LED点阵电子显示器的设计,采用的并行方式的显示方案来实现。

该电子时钟由AT89C51,74LS373数码管等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时。

用keil软件生成.hex文件,用Proteus的ISIS软件实现了单片机LED 点阵电子时钟系统的设计与仿真。

关键词:单片机;LED点阵;电子显示器目录《单片机原理及应用》 (I)课程设计报告 (I)《单片机原理及应用》任务书....................................................................................................................... I I 摘要.. (IV)第1章方案选择与论证 (1)1.1 设计任务与要求 (1)1.2 总体设计方案 (1)1.2.1 硬件部分的设计 (1)1.2.2 软件部分设计 (3)第2章硬件电路的设计 (3)2.1 晶振电路设计 (3)2.2 复位电路设计 (4)2.3 时分调节电路设计 (4)2.4 驱动电路设计 (5)2.5 总原理图 (5)第3章系统软件设计 (7)3.1 软件流程图 (7)3.2 主要软件程序内容 (8)3.2.1 定时器工作程序 (8)3.2.2 数字显示程序 (9)第4章系统调试与仿真 (14)4.1开发过程 (14)4.2 电路仿真 (17)总结 (22)参考文献 (23)附录 (25)答辩记录及评分表 (36)第1章方案选择与论证1.1 设计任务与要求(1)采用LED灯进行显示(2)可以根据按键来对时间进行调整(3)初始时间为12:00.1.2 总体设计方案1.2.1硬件部分的设计这次硬件电路部分用PROTEUS软件,该软件主要用来进行元器件的绘制和原理图的绘制,PROTEUS软件对绘制好的原理图进行仿真和调试。

51单片机数字钟设计程序

51单片机数字钟设计程序

51单片机数字钟设计程序51单片机是一种常用的单片机芯片,它具有体积小、功耗低、性能稳定等特点,被广泛应用于各种电子设备中。

本文将以51单片机数字钟设计程序为主题,介绍如何使用51单片机设计并实现一个简单的数字钟。

我们需要了解一下数字钟的基本原理。

数字钟主要由时钟芯片、数码管、按键等组成。

时钟芯片负责计时和控制,数码管用于显示时间,按键则用于设置和调整时间。

在设计数字钟的程序时,我们需要考虑以下几个方面:1. 时钟设置:首先,我们需要设置时钟芯片的工作模式。

一般来说,时钟芯片有两种工作模式,分别是24小时制和12小时制。

我们可以通过按键来选择工作模式,并将选择结果保存到相应的寄存器中。

2. 时间显示:接下来,我们需要将时钟芯片中的时间数据通过数码管显示出来。

数码管通常由7段LED组成,每段LED对应一个数字或字符。

我们可以通过控制数码管的引脚状态来实现不同数字的显示。

同时,为了使时间显示更加清晰,我们可以在数码管之间加入冒号等分隔符。

3. 时间调整:为了保证时间的准确性,我们需要提供时间调整的功能。

可以通过按键来实现时间的增加和减少,从而调整时钟芯片中的时间数据。

当按键按下时,我们可以检测到相应的信号,并将其转换为时间调整的命令。

4. 闹钟功能:除了显示时间,数字钟还可以具备闹钟功能。

我们可以设置一个闹钟时间,并在达到闹钟时间时触发相应的报警信号。

一般来说,闹钟功能可以通过按键设置,并将设置结果保存在相应的寄存器中。

当时钟芯片中的时间与闹钟时间一致时,我们可以通过控制蜂鸣器等外设来发出报警信号。

通过以上的设计,我们可以实现一个简单的数字钟。

当然,如果我们希望数字钟具备更多的功能,比如温湿度显示、定时器等,我们还可以在程序中添加相应的代码来实现。

总结一下,本文以51单片机数字钟设计程序为主题,介绍了数字钟的基本原理以及设计过程。

通过对时钟芯片、数码管、按键等的控制,我们可以实现时间的显示、调整和闹钟功能。

单片机电子时钟设计程序(一)

单片机电子时钟设计程序(一)

单片机电子时钟设计程序(一)引言概述:电子时钟是一种广泛应用于家庭、办公室和公共场所的设备。

它在我们日常生活中起到了举足轻重的作用。

本文将介绍如何设计一个基于单片机的电子时钟程序,该程序能够准确地显示时间,并具备一些常用功能。

正文:1. 时钟芯片选择- 研究市场上常用的时钟芯片类型,如RTC芯片、单片机内部时钟等。

- 根据需求选择适合的时钟芯片,考虑其精度、功耗和价格等因素。

- 确定所选时钟芯片与单片机的连接方式和通信协议。

2. 硬件电路设计- 根据所选的时钟芯片类型和要求,设计电路连接图。

- 包括时钟芯片与单片机的连接,蜂鸣器和LED数码管等外部器件的接口设计。

- 确保电路可靠性和稳定性,避免干扰和电源问题。

3. 软件程序编写- 熟悉所选单片机的编程语言和开发环境。

- 设计时钟的显示逻辑,包括时、分、秒的显示方式和刷新频率。

- 实现时间的自动更新功能,通过与时钟芯片的通信获取准确的时间信息。

- 添加常用功能,如闹钟设置、定时器等,并编写相应的逻辑控制代码。

4. 调试与测试- 焊接和连接电路,并将单片机程序烧录进芯片。

- 进行硬件和软件的联合调试,确保电子时钟的功能正常。

- 测试不同情况下的准确性和稳定性,如供电中断、温度变化等。

5. 优化与改进- 对电子时钟的外观和显示效果进行优化,增加界面美感。

- 优化编程代码,提高时钟的运行效率和响应速度。

- 改进硬件电路,减少功耗和杜绝干扰,提高系统稳定性。

总结:通过本文提供的指导,我们可以设计一个功能齐全、准确可靠的单片机电子时钟程序。

从选择时钟芯片到硬件电路设计,再到软件程序编写和调试与测试,每个步骤都需要认真思考和细致操作。

通过不断优化与改进,我们可以提高电子时钟的性能和用户体验,为人们提供更好的时间显示和功能体验。

51单片机时钟程序设计

51单片机时钟程序设计

51单片机时钟程序设计51单片机时钟程序设计是基于51单片机的一种程序,用于控制和显示时间的各个参数,如小时、分钟、秒等。

在计时、计数、算术运算、控制输出、中断处理等领域都起到重要的作用。

本文将简单介绍51单片机时钟程序设计的基本框架和其实现方法。

1. 硬件准备在进行51单片机时钟程序设计之前,需要先准备好相关的硬件,包括51单片机芯片、晶振、LCD液晶显示屏等。

其中晶振是时钟源,用来产生稳定的时钟信号,LCD液晶显示屏则用于显示时钟相关信息。

2. 时钟程序的设计框架(1)初始化程序:此步骤的主要作用是设置相关的寄存器和标志位,为后续程序的正常运行做好准备。

(2)计时程序:此步骤的主要作用是对秒、分、时等时间参数进行计数,并将结果存储到相应的寄存器里。

(3)中断程序:此步骤的主要作用是设置中断触发条件和相应的处理程序,用来处理一些紧急事件。

(4)显示程序:此步骤的主要作用是将计时程序的结果以数字形式显示到LCD液晶显示屏上,同时可以进行一些特殊字符的显示。

(5)调试程序:此步骤的主要作用是用于调试程序代码,检测是否存在问题,比如程序写错了等等。

3. 时钟程序的实现方法(1)初始化程序初始化程序是开发52单片机时钟程序的第一步,可以根据实际需求进行相应的设置。

在本程序中,初始化程序需要进行以下设置:a. 定义输入输出端口;b. 配置定时器;c. 设置中断源;d. 初始化LCD液晶显示屏等相关参数;(2)计时程序计时程序是时钟程序的核心,其主要作用是计算并更新当前的时间参数。

在本程序中,计时程序需要进行以下操作:a. 设置定时器的时钟源和计数频率;b. 定义中断触发条件;c. 设置中断处理程序并对时间参数进行计数,并存储到相应的寄存器里;d. 根据时间参数更新液晶显示屏的显示内容。

(3)中断程序中断程序主要用于响应一些紧急事件,比如硬件异常、按键输入等。

在52单片机时钟程序中,中断程序需要以下操作:a. 定义中断触发条件;b. 检测中断源;c. 判断中断类型,并调用相应的处理程序;d. 清除中断标志位。

51单片机数码管显示时钟程序

51单片机数码管显示时钟程序

#include〈reg52.h〉//#include#include<intrins。

h〉#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit beep=P2^3;unsigned code table[]={0x3f ,0x06 ,0x5b , 0x4f ,0x66 ,0x6d ,0x7d ,0x07 ,0x7f ,0x6f ,0x77 ,0x7c,0x39 , 0x5e , 0x79 ,0x71};uchar num1,num2,s,s1,m,m1,f,f1,num,numf,nums,dingshi;uchar ns,ns1,nf,nf1,numns,numnf;void delay(uint z);void keyscan ();void keyscan1 ();void alram();void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1); void display0(uchar nf,uchar nf1,uchar ns,uchar ns1);void main(){TMOD=0x01;//设定定时器0工作方式1TH0=(65536—46080)/256 ;TL0=(65536—46080)%256 ;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0中断numns=12;numnf=0;while(1){if(dingshi==0){keyscan ();display(m,m1,f,f1,s,s1);alram();}else{keyscan1 ();display0(nf,nf1,ns,ns1);}}}void keyscan (){if(key1==0){delay(10);if(key1==0)nums++;if (nums==24)nums=0;while(!key1);display(m,m1,f,f1,s,s1);}if(key2==0){delay(10);if(key2==0)numf++;if (numf==60)numf=0;while(!key2);display(m,m1,f,f1,s,s1);}if(key3==0){delay(10);if(key3==0){dingshi=~dingshi;while(!key3)display(m,m1,f,f1,s,s1);}}/*if(key4==0){delay(10);if(key4==0){flag=1;while(!key4);display(m,m1,f,f1,s,s1);}}*/}void keyscan1(){if(key1==0){delay(10);if(key1==0)numns++;if (numns==24)numns=0;while(!key1);// display(nf,nf1,ns,ns1);}if(key2==0){delay(10);if(key2==0)numnf++;if (numnf==60)numnf=0;while(!key2);// display(nf,nf1,ns,ns1);}if(key3==0){delay(10);if(key3==0){dingshi=0;while(!key3);// display(m,m1,f,f1,s,s1);}}}void alram(){if((numnf==numf)&&(numns==nums))beep=0;if(((numnf+1==numf)&&(numns==nums))&&(dingshi==0))//一分钟报时提示beep=1;}void display0(uchar nf,uchar nf1,uchar ns,uchar ns1)//闹钟显示函数{nf=numnf%10;nf1=numnf/10;ns=numns%10;ns1=numns/10;/*wela=1;P0=0xc0;//送位选数据wela=0;P0=0xff;*/dula=1;P0=table[ns1];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[ns]|0x80;dula=0;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[nf1];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[nf];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(1);}void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1) //时间显示{dula=1;P0=table[m1];//秒位第1位dula=0;P0=0xff;wela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[m];// 秒位第2位dula=0;P0=0xff;wela=1;wela=0;delay(1);dula=1;P0=table[s1]; //时位第一位dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[s]|0x80;dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[f1];//分位第一位dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[f]|0x80;dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(1);}void T0_timer() interrupt 1{TH0=(65536—46080)/256 ;TL0=(65536—46080)%256 ;num2++;if(num2==20){num++;num2=0;m=num%10;m1=num/10;f=numf%10;f1=numf/10;s=nums%10;s1=nums/10;if(num==59){num=0;numf++;if(numf==59){numf=0;nums++;}if (nums==24)nums=0;}}}void delay(uint z){uint x,y;for(x=110;x〉0;x—-)for(y=z;y>0;y—-);}。

单片机时钟1234滚动程序代码

单片机时钟1234滚动程序代码

单片机时钟1234滚动程序代码单片机时钟1234滚动程序代码在单片机中,可以使用数字显示器来显示时钟。

而对于时钟的滚动显示,可以通过不断改变数字的显示值来实现。

以下是一个使用C 语言编写的单片机时钟1234滚动程序的代码示例:```c#include <reg52.h> // 引入单片机的头文件sbit D1 = P2^0; // 数字位选择引脚1sbit D2 = P2^1; // 数字位选择引脚2sbit D3 = P2^2; // 数字位选择引脚3sbit D4 = P2^3; // 数字位选择引脚4unsigned char code LED_Disp[] = { // 数码管显示0-9的编码值 0x3F, // 00x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 80x6F // 9};void delay(unsigned int t) { // 延时函数unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main() {unsigned char i = 0;while (1) {D1 = 1; // 选择第一个数码管P0 = LED_Disp[i % 10]; // 显示个位数字delay(5); // 延时D1 = 0; // 关闭选择D2 = 1; // 选择第二个数码管P0 = LED_Disp[i / 10 % 10]; // 显示十位数字delay(5); // 延时D2 = 0; // 关闭选择D3 = 1; // 选择第三个数码管P0 = LED_Disp[i / 100 % 10]; // 显示百位数字delay(5); // 延时D3 = 0; // 关闭选择D4 = 1; // 选择第四个数码管P0 = LED_Disp[i / 1000 % 10]; // 显示千位数字delay(5); // 延时D4 = 0; // 关闭选择i++; // 数字递增if (i >= 10000)i = 0; // 重新计数}}```这段代码中,我们通过控制四个数码管的选择引脚,以及通过改变P0口的输出值来实现数字的显示。

单片机课程设计LED点阵显示电子时钟

单片机课程设计LED点阵显示电子时钟

(课程设计)单片机原理及接口技术课程设计题目:LED点阵显示电子时钟学院班级:学生姓名:学号:摘要电子时钟是一种利用数字电路来显示秒、时的计时装置。

用单片机控制的LED点阵电子显示时钟具有结构简单、性能可靠、成本低廉和显示灵活等优点,其应用前景广阔。

本文设计的是一个5块8*8点阵时钟显示屏,数字采用静止显示方式。

实现的功能有:时钟功能,确定显示当前时间,并可以用按键实现误差调节;计时功能,开始与停止计时;显示精度切换功能,根据不同的工作场合,切换显示精度(时:分显示或分:秒显示硬件组成:AT89C51单片机、集成块74LS373和74LS138、LED点阵、按键若干、晶振、电容、电阻、电源等。

软件组成:定时中断程序、显示程序、起停控制程序、功能切换程序。

系统实现了计时和显示精度切换等创新功能。

关键词:点阵显示电子时钟;计时;精度切换目录摘要 (2)1 概述 (4)2 系统总体方案设计 (5)2.1系统总体设计框图 (5)2.2 初步设计思路 (5)3 硬件电路设计 (6)3.1 LED数码管显示电路 (6)3.1.1 LED点阵 (6)3.1.2 74LS373锁存器 (7)3.1.3 74LS138译码器 (7)3.2 复位电路 (8)3.3 晶振电路 (9)3.4 按键电路 (9)3.5 单片机连接电路 (10)4 软件设计 (11)4.1 计时程序设计 (11)4.2 显示程序设计 (11)4.3 时:分/分:秒切换程序 (13)4.4 起、停控制程序 (14)5 系统调试 (15)6 心得体会 (16)参考文献 (16)附录 (17)附录A:源程序清单 (17)附录B:元件清单 (23)1 概述在日常生活中,大家见到的都是数码管制作的电子钟,LED点阵时钟则不多见。

用单片机控制的LED点阵显示电子钟具有结构简单、性能可靠、成本低廉、价格便宜和显示灵活等优点,其应用前景广阔。

之所以使用LED点阵电子屏显示,是与它本身所具有的优点分不开的[1]。

51单片机24小时闹钟时钟可调简单程序

51单片机24小时闹钟时钟可调简单程序

#include<reg51.h>unsigned char seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char con[6]={0x1,0x2,0x4,0x8,0x10,0x20};unsigned char mm=0;unsigned char ss=0;unsigned char hh=0;unsigned char count=100;unsigned char TH=01,TM=00,m;sbit S1=P3^3;sbit S2=P3^4;sbit S3=P3^5;sbit S4=P3^6;sbit S5=P3^7;sbit S6=P3^2;sbit bell=P3^0;main(){TMOD=1;TH0=-10000>>8;TL0=-10000;EA=1;ET0=1;TR0=1;while(1);}void isr_time0() interrupt 1//24小时{//10毫秒间隔unsigned int i=0,j;unsigned char time[6];TH0=-10000>>8;TL0=-10000; count--;if(count==0){count=100;ss++;if(ss==60){ss=0;mm++;if(mm==60){mm=0;hh++;if(hh==24)hh=0;}}if(S5==0){TH++;}if(S6==0){TM++;}//闹钟调时//闹钟调分if(hh==TH){unsigned int a,b,y;if(mm>=01){m=0;}if(mm==TM&&ss<10){if(m<10){do{m++;ss++; //ss确保闹钟时间继续for(a=0;a<1250;a++){bell=!bell;for(b=0;b<15;b++);} //取反for(y=0;y<1250;y++){bell=!bell;for(b=0;b<33;b++);}for(a=0;a<1250;a++){bell=!bell;for(b=0;b<15;b++);}for(a=0;a<1250;a++){bell=!bell;for(b=0;b<33;b++);} }while(m<10);}}}if(S1==0){hh++;if(hh==24)}if(S2==0){mm++;if(mm==60){ mm=0;hh++;}}if(S3==0&&hh>0){hh--;//时钟减if(hh==0){hh=23;}}if(S4==0&&mm>0){mm--;//分钟减if(mm==0){ mm=59;}}}time[3]=hh/10;time[2]=hh%10; for(i=0;i<6;i++){P2=con[i];if(i==1||i==2)//小数点//分钟加{hh=0;}//时钟加//显示位time[1]=mm/10;time[0]=mm%10; P1=seg[time[i]]&0x7f;else P1=seg[time[i]];for(j=100;j>0;j--);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;函数名:MAIN
;输 入:无
;输 出:无
;调 用:BZ,LED_BL,INIT,INIT_TIMER,CONV,DISP,SET_TIME
;描 述:主函数
;******************************************************************************
嵌入式应用软件园,版权所有,请勿转载/销售。
单片机 LED 时钟程序
作者: 嵌入式应用软件园
1
嵌入式应用软件园,版权所有,请勿转载/销售。
目录
第 1 章 程序功能 .......................................................................................................3 第 2 章 程序代码 .......................................................................................................4
; 定义存放计时单元地址
BUF EQU 30H
;30~33H 连续 4 字节存放显示器数据
HOUR EQU 34H
;存放小时变量
MIN EQU 35H
;存放分钟变量
SEC EQU 36H
;存放秒钟变量
DEDA EQU 37H
;存放 5 ms 计数值
;********************************变量定义结束**********************************
;*******************************89C51 接口定义**********************************
;按键输入引脚定义
K1 EQU P2.4
;按键 1 引脚定义
K2 EQU P2.5
;按键 2 引脚定义
K3 EQU P2.6
;按键 3 引脚定义
K4 EQU P2.7
模式 1 计时
MOV TMOD,#00000000B
;设置定时器 0 工作模式为 0
MOV IE,#10000010B
;启用定时器 0 中断产生
MOV TL0,#(8192-5000) MOD 32
;加载低字节
MOV TH0,#(8192-5000)/32
;加载高字节
SETB TR0
;启动定时器 0 开始计时
;函数名:SET_TIME
;输 入:无
;输 出:无
;调 用:无
;描 述:调整时间
;******************************************************************************
SET_TIME:
CLR TR0
;定时器动作暂停
MOV SEC,#0
;改变扫描码 EX:XXXX1011
RR A
;累加器向右移动一位
INC R0
;显示器显示缓冲区地址加 1
DJNZ R2, S1
;循环判断是否继续执行
RET
;******************************************************************************
;函数名:DISP
;输 入:无
;输 出:无
;调 用:无
;描 述:扫描显示
;**************************************************************************** **
DISP:
MOV R0,#BUF
;指向显示器显示缓冲区起始地址
MOV R2,#4
原因
;
1.0
初始版本
;******************************************************************************
;***********************************变量定义***********************************
;循环执行 4 次
MOV ACC,#11110111b ;加载扫描信号初值 11110111B
S1:
PUSH ACC
MOV A,@R0
;取出显示器数据
MOV P0,A
;由 P0 送出一位显示器数据
POP ACC
MOV P2,ACC
;由 P2 送出扫描输出信号
MOV R5,#2
;延迟一会儿
ACALL DELAY
TO_ISR:
;定时器 0 计时中断程序每隔 5ms
中断一次
PUSH ACC
;将累加器放入堆栈
MOV TL0, #(8192-5000)MOD 32 ;加载低字节
MOV TH0, #(8192-5000)/32
;加载高字节
INC DEDA
;5ms 计数值加 1
;秒输出
MOV A, DEDA
CJNE A,#200,TT1
;未按下 K3 键则继续扫描 ;继续循环执行
;未按下 K4 键则继续扫描 ;继续循环执行
;继续循环执行
5
嵌入式应用软件园,版权所有,请勿转载/销售。
;******************************************************************************
ORG 0000H JMP MAIN ORG 000BH JMP TO_ISR
;程序代码由地址 0 开始执行 ;定时器 0 中断地址设置
4
嵌入式应用软件园,版权所有,请勿转载/销售。
;******************************************************************************
;分计数清除为 0
;是否 24h 到了
;秒钟变量清除为 0 ;分钟变量清除为 0 ;小时变量清除为 0
;将累加器由堆栈取出
;******************************************************************************
;函数名:CONV
;输 入:无
;****************************************************************************ห้องสมุดไป่ตู้*
;模 块:LED
;文件名:LED_Time.asm
;作 者:嵌入式应用软件园
;修 订:
;
版本号
;无穷循环 ;转换 时时 分分 数据 ;扫描显示 ;未按下 K1 键则继续扫描 ;LED 闪动 ;设置目前时间 ;继续循环执行
M1: JB
JMP
K2,M2 LOOP
M2:
JB
K3, M3
JMP LOOP
M3:
JB
K4,M4
JMP LOOP
M4: JMP LOOP
;未按下 K2 键则继续扫描 ;继续循环执行
;输 出:无
;调 用:无
;描 述:转换 时时:分分 数据
;******************************************************************************
CONV:
;转换小时数据
MOV
A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#TABLE ;查表转换
;是否 1s 到了
MOV DEDA,#00H
;计数值清除为 0
CPL WLED
;LED 灯亮灭变换
INC SEC
;秒计数加 1
MOV A,SEC
CJNE A,#60,TT1
;是否 1min 到了
;分输出
INC MIN
;分计数加 1
MOV SEC,#00H
;秒计数清除为 0
MOV A,MIN
CJNE A,#60,TT1
2.1 文本版代码........................................................................................................4 2.2 图片版代码......................................................................................................12
MOV BUF+3,A
RET
;共阳数码管段码表 TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
7
嵌入式应用软件园,版权所有,请勿转载/销售。
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;******************************************************************************
;是否 1h 到了
;时输出
INC HOUR
;小时计数加 1
6
嵌入式应用软件园,版权所有,请勿转载/销售。
MOV MIN,#00H
MOV A,HOUR
CJNE A,#24,TT1
MOV
DEDA,#00h
MOV SEC,#00H
MOV MIN,#00H
MOV HOUR,#00H
相关文档
最新文档