电子时钟计时器的设计(c语言版 - 调试完美通过 - 可直接使用)(附原理图源程序以及完整的文档) 下载本文

附录一:程序(方案一)

#include #include #define uint unsigned int #define uchar unsigned char

#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