内容发布更新时间 : 2024/12/31 4:53:25星期一 下面是文章的全部内容请认真阅读。
附录一:程序(方案一)
#include
#define PA XBYTE[0xD1FF] #define PB XBYTE[0xD2FF] #define PC XBYTE[0xD5FF] #define PCON XBYTE[0xD7FF] sbit buzzer=P3^3;//蜂鸣器端口 //数码管0-9的段选编码 uchar code tabledu[]={ 0xA0,0xBB,0x62,0x2A, 0x39,0x2C,0x24,0xBA, 0x20,0x28};
//数码管各位选编码 uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //全局变量定义
unsigned long num1,num2;
uchar shi0,shi1,fen0,fen1,m0,m1,num,
num3,aa,bb,cc,count,temp,count,S,flag,flag1; char hour,min,second,h0,h1,mi0,mi1,s0,s1; void init();//初始化函数声明
void display(uchar,uchar,uchar,uchar,uchar,uchar );//显示函数声明void delay(uint);//带参数延时函数声明 1毫秒 void keyscan();//键盘扫描函数 void main() { PCON=0x80; init(); while(1)//主体循环 { keyscan(); //时钟分离部分 m1=aa; m0=aa/10; fen1=bb; fen0=bb/10; shi1=cc; shi0=cc/10; //clock分离部分
17
s1=second; s0=second/10; mi1=min; mi0=min/10; h1=hour; h0=hour/10; //时钟显示和clock显示部分 if(num3>=1&&num3<=4||count==0) display(shi0,shi1,fen0,fen1,m0,m1); else display(h0,h1,mi0,mi1,s0,s1); //************整点报时***********// if(aa==0&&bb==0) //报时10秒 { TR1=1; //开启定时器1 flag=1; //控制整点报时计数num1++ }
//********闹钟报时 *********// if(aa==second&&bb==min&&cc==hour)//闹时一分钟 { TR1=1; //开启定时器1 flag1=1; //控制闹钟计数num2++ } } }
//************初始化函数**************// void init() { //********定时器0,1初始化********// TMOD=0x11; EA=1; ET0=1; ET1=1; TH0=(65536-50000)/256; TL0=(65536-50000)%6; TH1=(65536-1000)/256; TL1=(65536-1000)%6; TR0=1; }
void time0() interrupt 1 //定时0时钟函数(控制数码时钟) { TH0=(65536-50000)/256; TL0=(65536-50000)%6; num++;
18
if(num==20) { num=0; aa++; if(aa==60) { aa=0; bb++; if(bb==60) { bb=0; cc++; if(cc==24) cc=0; } } } }
void time1() interrupt 3 //定时1时钟函数(控制整点报时时间) { TH1=(65536-1000)/256; TL1=(65536-1000)%6; if(flag==1) num1++; if(flag1==1) num2++; buzzer=~buzzer; if(num1==10000||num2==60000) { num1=0; num2=0; buzzer=1; TR1=0; flag=0; flag1=0; } }
//************数码管显示函数******************//
void display(uchar shi0,uchar shi1,uchar fen0,uchar fen1,uchar m0,uchar m1) { PA=tablewe[0]; PB=tabledu[shi0]; delay(1); PA=0XFF;
19
PB=0XFF; PA=tablewe[1]; PB=tabledu[shi1]; delay(1); PA=0XFF; PB=0XFF; PA=tablewe[2]; PB=tabledu[fen0]; delay(1); PA=0XFF; PB=0XFF; PA=tablewe[3]; PB=tabledu[fen1]; delay(1); PA=0XFF; PB=0XFF; PA=tablewe[4]; PB=tabledu[m0]; delay(1); PA=0XFF; PB=0XFF; PA=tablewe[5]; PB=tabledu[m1]; delay(1); PA=0XFF; PB=0XFF; }
//************毫秒函数******************// void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=124;y>0;y--) ; }
//************键盘函数函数******************// void keyscan() { PC=0xfe; temp=PC; temp=temp&0xf0; if(temp!=0xf0) { delay(5);
20
temp=PC;
temp=temp&0xf0; if(temp!=0xf0) { temp=PC; switch(temp) { case 0xee:num3=1; //秒钟加一按键 break; case 0xde:num3=2; //分钟加一按键 break; case 0xbe:num3=3; //时钟加一按键 break; case 0x7e:num3=4; //清零按键 break; } while(temp!=0xf0) //松手检测 { temp=PC; temp=temp&0xf0; display(shi0,shi1,fen0,fen1,m0,m1); } switch(num3) { case 1: aa++; if(aa>59) aa=0; break; case 2: bb++; if(bb>59) bb=0; break; case 3: cc++; if(cc>23) cc=0; break; case 4: aa=0,bb=0,cc=0; break; } }
21