#include<reg51.h> unsigned char code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char int_time; unsigned char second; unsigned char minute; unsigned char hour; sbit SA=P1^4; sbit SB=P1^5; sbit SC=P1^6; sbit SD=P1^7; void delay(void) { unsigned char i; for(i=0;i<200;i++) ; } void delay60ms(void) { unsigned char i,j; for(i=0;i<200;i++) for(j=0;j<100;j++) ; } void DisplaySecond(unsigned char s) { P0=Tab[s/10]; P2=0xfd; delay(); P2=0xff; P0=Tab[s%10]; P2=0xfe; delay(); P2=0xff; } void DisplayMinute(unsigned char m) { P0=Tab[m/10]; P2=0xf7; delay(); P2=0xff; P0=Tab[m%10]; P2=0xfb; delay(); P2=0xff; } void Displayhour(unsigned char h) { P0=Tab[h/10]; P2=0xdf; delay(); P2=0xff; P0=Tab[h%10]; P2=0xef; delay(); P2=0xff; } void key_scan(void) { P1=0xf0; if((P1&0xf0)!=0xf0) { delay60ms(); if((P1&0xf0)!=0xf0) { if(SA==0) second++; if(SB==0) minute++; if(SC==0) hour++; if(SD==0) { second=0; minute=0; hour=0; } } } } void mian(void) { TMOD=0x01; EA=1; ET0=1; TH0=(65536-46083)/256; TL0=(65536-46083)%256; TR0=1; int_time=0; second=0; minute=0; hour=0; while(1) { DisplaySecond(second); DisplayMinute(minute); Displayhour(hour); } } void interserve(void) interrupt 1 using 1 { TR0=0; int_time++; if(int_time==20) { int_time=0; second++; } if(second==60) { second=0; minute++; } if(minute==60) { minute=0; hour++; } if(hour==24) { hour=0; } key_scan(); TH0=(65536-46083)/256; TL0=(65536-46083)%256; TR0=1; }
理解问题#include<reg51.h> unsigned char code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char int_time; unsigned char second; unsigned char minute; unsigned char hour; sbit SA=P1^4; sbit SB=P1^5; sbit SC=P1^6; sbit SD=P1^7; void delay(void) { unsigned char i; for(i=0;i<200;i++) ; } void delay60ms(void) { unsigned char i,j; for(i=0;i<200;i++) for(j=0;j<100;j++) ; } void DisplaySecond(unsigned char s) { P0=Tab[s/10]; P2=0xfd; delay(); P2=0xff; P0=Tab[s%10]; P2=0xfe; delay(); P2=0xff; } void DisplayMinute(unsigned char m) { P0=Tab[m/10]; P2=0xf7; delay(); P2=0xff; P0=Tab[m%10]; P2=0xfb; delay(); P2=0xff; } void Displayhour(unsigned char h) { P0=Tab[h/10]; P2=0xdf; delay(); P2=0xff; P0=Tab[h%10]; P2=0xef; delay(); P2=0xff; } void key_scan(void) { P1=0xf0; if((P1&0xf0)!=0xf0) { delay60ms(); if((P1&0xf0)!=0xf0) { if(SA==0) second++; if(SB==0) minute++; if(SC==0) hour++; if(SD==0) { second=0; minute=0; hour=0; } } } } void mian(void) { TMOD=0x01; EA=1; ET0=1; TH0=(65536-46083)/256; TL0=(65536-46083)%256; TR0=1; int_time=0; second=0; minute=0; hour=0; while(1) { DisplaySecond(second); DisplayMinute(minute); Displayhour(hour); } } void interserve(void) interrupt 1 using 1 { TR0=0; int_time++; if(int_time==20) { int_time=0; second++; } if(second==60) { second=0; minute++; } if(minute==60) { minute=0; hour++; } if(hour==24) { hour=0; } key_scan(); TH0=(65536-46083)/256; TL0=(65536-46083)%256; TR0=1; }
已完成理解「#include<reg51.h> unsigned char code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char int_time; unsigned char second; unsigned char minute; unsigned char hour; sbit SA=P1^4; sbit SB=P1^5; sbit SC=P1^6; sbit SD=P1^7; void delay(void) { unsigned char i; for(i=0;i<200;i++) ; } void delay60ms(void) { unsigned char i,j; for(i=0;i<200;i++) for(j=0;j<100;j++) ; } void DisplaySecond(unsigned char s) { P0=Tab[s/10]; P2=0xfd; delay(); P2=0xff; P0=Tab[s%10]; P2=0xfe; delay(); P2=0xff; } void DisplayMinute(unsigned char m) { P0=Tab[m/10]; P2=0xf7; delay(); P2=0xff; P0=Tab[m%10]; P2=0xfb; delay(); P2=0xff; } void Displayhour(unsigned char h) { P0=Tab[h/10]; P2=0xdf; delay(); P2=0xff; P0=Tab[h%10]; P2=0xef; delay(); P2=0xff; } void key_scan(void) { P1=0xf0; if((P1&0xf0)!=0xf0) { delay60ms(); if((P1&0xf0)!=0xf0) { if(SA==0) second++; if(SB==0) minute++; if(SC==0) hour++; if(SD==0) { second=0; minute=0; hour=0; } } } } void mian(void) { TMOD=0x01; EA=1; ET0=1; TH0=(65536-46083)/256; TL0=(65536-46083)%256; TR0=1; int_time=0; second=0; minute=0; hour=0; while(1) { DisplaySecond(second); DisplayMinute(minute); Displayhour(hour); } } void interserve(void) interrupt 1 using 1 { TR0=0; int_time++; if(int_time==20) { int_time=0; second++; } if(second==60) { second=0; minute++; } if(minute==60) { minute=0; hour++; } if(hour==24) { hour=0; } key_scan(); TH0=(65536-46083)/256; TL0=(65536-46083)%256; TR0=1; }」
展开阅读网页
您提供的代码是一个基于51单片机的数字电子钟程序,它使用了定时器中断来实现秒、分、时的计时功能。以下是对代码的简要解释:
-
定义和初始化:程序首先定义了显示数字的编码
Tab
,以及秒second
、分minute
、时hour
的变量,还有控制位SA、SB、SC、SD。delay
和delay60ms
函数用于实现延时功能,DisplaySecond
、DisplayMinute
和Displayhour
函数用于在数码管上显示秒、分、时14。 -
定时器配置:在
main
函数中,设置了定时器模式TMOD
为模式1,启用了全局中断EA
和定时器0中断ET0
。定时器0的初始值设置为TH0
和TL0
,这是为了实现大约50ms的中断周期。然后启动定时器0TR0=1
28。 -
主循环:在
while(1)
循环中,不断调用显示函数来更新数码管上的显示。 -
中断服务:
interserve
函数是一个中断服务程序,它响应定时器0的中断。每次中断触发时,中断服务程序会增加int_time
计数,当int_time
达到20时,表示1秒已经过去,因此秒数增加1。如果秒数达到60,则分钟数增加1,依此类推。此外,还包含了一个按键扫描功能,用于手动调整时间46。 -
重置定时器:在中断服务程序的最后,重新设置定时器0的初始值,并重新启动定时器0。
-
注意:
mian
函数名应为main
,这是一个拼写错误。另外,interrupt 1 using 1
是51单片机的中断服务程序声明,其中1
表示中断号,using 1
指定了寄存器组1。