基于51单片机开发板的电子时钟的C语言源程序
51单片机时钟C语言代码
num3++;
if(num3==24)
num3=0;
while(!key1);
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
num2++;
if(num2==60)
num2=0;
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
:[{"area_type":"main_cont","paragraph_list":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169]}],"content":[{"content":[{"text":"#include","type":"text"}],"special_feature":0,"type":"paragraph"},{"content":[{"text":"#define uchar unsigned char","type":"text"}],"special_feature":0,"type":"paragraph"},{"content":[{"text":"#define uint unsigned int","type":"text"}],"special_feature":0,"type":"paragraph"},{"content":[{"text":"sbit key1=p3^4;","type":"text"}],"special_feature":0,
基于51单片机的电子时钟设计源程序
unsigned char i,j; unsigned char SetMillisecond; //启动秒表
code unsigned char LEDCode[]={0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80}; //数码管显示代码
#include<reg51.h>
unsigned char DispBuf[6]; //时间显示缓冲区
unsigned char Disdate[6]; //日期显示缓冲区
unsigned char DisSec[6]; //秒表缓冲区
struct //设定时间结构体
{
unsigned char Hour;
{
DispBuf[2]=DispBuf[2]|0xff; //分钟熄灭
DispBuf[3]=ห้องสมุดไป่ตู้ispBuf[3]|0xff;
}
else
{
DispBuf[2]=DispBuf[2]&0xff; //分钟点亮
DispBuf[3]=DispBuf[3]&0xff;
};
if(Flash_flag & point==3) //更新秒钟
Time.Min=0;
Time.Sec=0;
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
}
/******************************延时子程序*********************************************/
单片机时钟程序设计代码
单片机时钟程序设计代码好的,由于你没有给出具体的单片机型号,下面是一个基于 51 单片机的时钟程序设计示例:```c#include <reg52.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>// 定义变量char str[20];int i=0;int j=0;int k=0;int time=0;int flag=0;int h=0,m=0,s=0;void delay(int xms){int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;time++;if(time==20){time=0;s++;if(s==60){s=0;m++;if(m==60){m=0;h++;}}}// 将时间数据转换为字符串sprintf(str," %02d:%02d:%02d",h,m,s);// 输出时间字符串for(i=0;i<16;i++){P0=str[i];delay(1000);}}void main(){// 初始化定时器 0 为 16 位定时器模式,计数初值为 50000 TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;while(1);}```该程序利用 51 单片机的定时器 0 来产生定时中断,每 20 次中断为 1 秒,通过对秒、分、时的累计来实现时钟功能。
在中断服务函数中,将当前时间转换为字符串,并通过循环输出到 P0 口。
51单片机数码管显示时钟(C语言)
* 输出
:无
*******************************************************************************
/
void main() {
Ds1302Init(); Timer0Configuration(); while(1) {
Ds1302ReadTime(); disp[7] = DIG_CODE[TIME[0]&0x0f]; disp[6] = DIG_CODE[TIME[0]>>4]; disp[5] = 0X40; disp[4] = DIG_CODE[TIME[1]&0x0f]; disp[3] = DIG_CODE[TIME[1]>>4]; disp[2] = 0X40; disp[1] = DIG_CODE[TIME[2]&0x0f]; disp[0] = DIG_CODE[TIME[2]>>4]; }
/
void DigDisplay() interrupt 1 { //定时器在工作方式二会自动重装初,所以不用在赋值。 // TH0=0X9c;//给定时器赋初值,定时 1ms // TL0=0X00;
DIG=0; //消隐 switch(Num) //位选,选择点亮的数码管, {
case(7): LSA=0;LSB=0;LSC=0; break;
uchar n;
EA = 0; RST = 0; _nop_();
SCLK = 0;//先将 SCLK 置低电平。 _nop_(); RST = 1; //然后将 RST(CE)置高电平。 _nop_();
for (n=0; n<8; n++)//开始传送八位地址命令 {
51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)
51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)效果图:程序如下://51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int/*七段共阴管显示定义*///此表为LED 的字模,共阴数码管0-9 -uchar code dispcode[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制/*定义并初始化变量*/uchar seconde=0;//秒uchar minite=0;//分uchar hour=12; //时uchar shi=0;//闹铃功能uchar fen=0;uchar bjcs;//报警次数sbit P1_0=P1^0; //second 调整定义sbit P1_1=P1^1; //minite调整定义sbit P1_2=P1^2; //hour调整定义sbit P1_5=P1^5; //整点报时sbit P1_3=P1^3; //闹铃功能,调整时间sbit P1_6=P1^6; //调整时sbit P1_7=P1^7; //调整分sbit P1_4=P1^4; //关闭闹铃/*函数声明*/void delay(uint k ); //延时子程序void time_pro( ); //时间处理子程序void display( ); //显示子程序void keyscan( ); //键盘扫描子程序/*xx子程序*/void delay (uint k){uchar j;while((k--)!=0){for(j=0;j<125;j++){;}}}/*时间处理子程序*/void time_pro(void){if(seconde==60){seconde=0;minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}/*显示子程序*/void display(void){if(P1_3==1){P2=0XFE; P0=dispcode[seconde%10];//秒个位delay(1);P2=0XFD;P0=dispcode[seconde/10];//秒十位delay(1);P2=0XFB;P0=dispcode[10];//间隔符-delay(1);P2=0XF7;P0=dispcode[minite%10];//分个位delay(1);P2=0XEF;P0=dispcode[minite/10];//分十位delay(1);P2=0XDF;P0=dispcode[10];//间隔符-delay(1);P2=0XBF;P0=dispcode[hour%10];//时个位delay(1);P2=0X7F;P0=dispcode[hour/10];//时十位delay(1);}}/*键盘扫描子程序*/void keyscan(void){if(P1_0==0)//秒位的调整{delay (30);if(P1_0==0){seconde++;if(seconde==60){seconde=0;}}delay(250);}if(P1_1==0)//分位的调整{delay(30);if(P1_1==0){minite++;if(minite==60){minite=0;}}delay(250);}if(P1_2==0)//时位的调整{delay(30);if(P1_2==0){hour++;if(hour==24){hour=0;}}delay(250);}}/*整点报警*/void zhengdian (void){if((seconde==0)&(minite==0))//整点报时{P1_5=0;delay(1000);P1_5=1;}}/*定时闹钟*/void dingshi(void){if(P1_3==0)//按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。
51单片机c语言编写的1602液晶显示闹钟
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]=" 2012-08-17 MON"; //设定开始显示的时间uchar code table1[]=" 12:30:00";uchar code table2[7][3]= {{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}};//定义二维字符数组sbit wr=P3^6; // 1602液晶的读/写端sbit dula=P2^6; // 数码管段选sbit wela=P2^7; // 数码管位选sbit lcden=P3^4; // 1602液晶使能端sbit lcdrs=P3^5; // 1602液晶命令/数据端sbit key1=P3^0; // 声明s4按键sbit key2=P3^1; // 声明s8按键sbit key3=P3^2; // 声明s12按键sbit key4=P3^3; // 声明s16按键sbit beep=P2^3; // 声明蜂鸣器sbit rd=P3^7; // 声明4个按键的公共端uchar num1,shi=12,fen=30,miao,yue=8,ri=17,shi1,fen1,miao1,keynum1,week; //定义时分秒变量uint nian=2012; //定义年变量void delayms(uint x){uint i,j;for(i=x;i>0;i--) //定义带参数延时函数for(j=110;j>0;j--);}void write_com(uchar com) //1602液晶写指令函数{ wr=0;lcdrs=0;P0=com;delayms(1);lcden=1;delayms(1);lcden=0;}void write_date(uchar date) //1602液晶写数据函数{ wr=0;lcdrs=1;P0=date;delayms(1);lcden=1;delayms(1);lcden=0;}void write_addate1(uchar add,uint date) //定义显示年的函数{ uint qian;uchar bai,shi,ge;qian=date/1000;bai=date%1000/100;shi=date%1000%100/10;ge=date%10;write_com(add+0x80);write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge);}void write_addate2(uchar add,uchar date) //定义显示月、日、时、分、秒函数{uchar shi,ge;shi=date/10;ge=date%10;write_com(add+0x80);write_date(0x30+shi);write_date(0x30+ge);}void write_rq(uchar i) //定义显示星期的函数{ uchar x;for(x=0;x<3;x++){ write_date(table2[i][x]);delayms(1);}}void init () //定义初始化函数{dula=0; // 关闭数码管段、位选端wela=0;TMOD=0x01; // 定时器0工作方式为16位TH0=(65536-45872)/256; // 装初值TL0=(65536-45872)%256;EA=1; // 开总中断ET0=1; // 开定时器0中断write_com(0x38); // 设置16*2显示,5*7点阵,8位数据口write_com(0x06); // 写一个字符后地址指针加1write_com(0x0c); // 设置开显示,不显示光标write_com(0x01); // 显示清0,数据清0write_com(0x80); // 使指针指向第1行第1列}void keyscan() // 定义按键函数{uchar keynum;rd=0; //4个按键公共端为低电平if(key1==0) //s4按键被按下{ delayms(3); //去抖延时if(key1==0) //确认s4按键被按下,进入调时间模式{keynum++;while(!key1); //松手检测}if(keynum==1) //s4按下一次{ TR0=0; //关闭定时器0write_com(0x81); //指针指向第1行2列write_com(0x0f); //开启光标显示,光标闪烁}if(keynum==2){write_com(0x86); //光标跳到月份}if(keynum==3){write_com(0x89); //光标跳到日}if(keynum==4){write_com(0x8c); //光标跳到星期}if(keynum==5){write_com(0xc4); //光标跳到时}if(keynum==6){write_com(0xc7); //光标跳到分}if(keynum==7){write_com(0xca); //光标跳到秒}if(keynum==8){ keynum=0; //退出调时间模式TR0=1; //开启定时器0write_com(0x0c); //关闭光标显示}}if(keynum) //当进入调时间模式时{if(key2==0) //s8按键按下{delayms(3); //去抖延时if(key2==0){if(keynum==1){nian++; //s8每按下一次年份加1if(nian==10000) // 加满清0nian=0;write_addate1(1,nian); // 显示年份write_com(0x81); //写完数据指针指向年份原来位置}if(keynum==2){yue++; //s8每按下一次月份加1if(yue==13)yue=0; //加满清0write_addate2(6,yue); //显示月份write_com(0x86); //写完数据指针指向月份原来位置}if(keynum==3){ ri++;if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) //1,3,5,7,8,10,12月有31天if(ri==32)//加满还原ri=1;if(yue==4||yue==6||yue==9||yue==11) //4,6,9,11月有30天if(ri==31)ri=1;if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0)) //闰年2月有30天if(ri==30)ri=1;if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0)) //非闰年2月有31天if(ri==29)ri=1;write_addate2(9,ri); //显示日write_com(0x89); //写完数据指针指向日原来位置}if(keynum==4){week++;//s8每按下一次星期加1if(week==7)//加满还原week=0;write_rq(week); //显示星期write_com(0x8c); //写完数据指针指向星期原来位置}if(keynum==5){shi++;//s8每按下一次时加1if(shi==24)shi=0;//加满还原write_addate2(0x44,shi); //显示时write_com(0xc4); //写完数据指针指向时原来位置}if(keynum==6){fen++;//s8每按下一次分加1if(fen==60)fen=0;//加满还原write_addate2(0x47,fen); //显示分write_com(0xc7);//写完数据指针指向分原来位置}if(keynum==7){miao++;//s8每按下一次秒加1if(miao==60)miao=0;//加满还原write_addate2(0x4a,miao);//显示秒write_com(0xca);//写完数据指针指向秒原来位置}while(!key2); //松手检测}}if(key3==0){delayms(3);if(key3==0){ //s12按下时减1if(keynum==1){nian--;if(nian==-1)nian=9999;write_addate1(1,nian);write_com(0x81);}if(keynum==2){ yue--;if(yue==-1)yue=12;write_addate2(6,yue);write_com(0x86);}if(keynum==3){ri--;if(ri==0){if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)ri=31;if(yue==4||yue==6||yue==9||yue==11)ri=30;if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))ri=29;if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))ri=28;}write_addate2(9,ri);write_com(0x89);}if(keynum==4){week--;if(week==-1)week=6;write_rq(week);write_com(0x8c);}if(keynum==5){shi--;if(shi==-1)shi=23;write_addate2(0x44,shi);write_com(0xc4);}if(keynum==6){fen--;if(fen==-1)fen=59;write_addate2(0x47,fen);write_com(0xc7);}if(keynum==7){miao--;if(miao==-1)miao=59;write_addate2(0x4a,miao);write_com(0xca);}while(!key3); //松手检测}}}if(key4==0) //s16被按下进入调闹钟模式{ delayms(3);if(key4==0){keynum1++;while(!key4);}if(keynum1==1){ write_com(0x01); //清屏,指针清0write_com(0xc6); //在时分之间显示“:”write_date(':');write_com(0xc9); //在分秒之间显示“:”write_date(':');write_com(0x0f); //开启光标write_com(0xc4); //光标指向时}if(keynum1==2){write_com(0xc7);//光标指向分}if(keynum1==3){write_com(0xca); //光标指向秒}if(keynum1==4){ keynum1=0;write_com(0x0c); //关闭光标}}if(keynum1){if(key2==0) //s8按下加1{delayms(3);if(key2==0){if(keynum1==1){shi1++;if(shi1==24)shi1=0;write_addate2(0x44,shi1);write_com(0xc4);}if(keynum1==2){fen1++;if(fen1==60)fen1=0;write_addate2(0x47,fen1);write_com(0xc7);}if(keynum1==3){miao1++;if(miao1==60)miao1=0;write_addate2(0x4a,miao1);write_com(0xca);}while(!key2);}}if(key3==0) //s12每按一次减1{delayms(3);if(key3==0){if(keynum1==1){shi1--;if(shi1==-1)shi1=23;write_addate2(0x44,shi1);write_com(0xc4);}if(keynum1==2){fen1--;if(fen1==-1)fen1=59;write_addate2(0x47,fen1);write_com(0xc7);}if(keynum1==3){miao1--;if(miao1==-1)miao1=59;write_addate2(0x4a,miao1);write_com(0xca);}while(!key3);//松手检测}}}}void main(){ uchar num;init();for(num=0;num<15;num++){ write_date(table[num]);delayms(5);} //显示初始时间write_com(0xc0);for(num=0;num<12;num++){ write_date(table1[num]);delayms(5);}TR0=1; //开启定时器0while(1){ if(shi==shi1&&fen==fen1&&miao==miao1) //闹钟到了蜂鸣器响beep=0;keyscan(); //扫描键盘}}void time() interrupt 1 //中断函数{TH0=(65536-45872)/256;TL0=(65536-45872)%256; //进入中断装初值num1++;if(num1==20) //一秒到了{ num1=0; //清0miao++;if(miao==60) //一分到了{ miao=0; fen++; }if(!keynum1) write_addate2(0x4a,miao); //当调闹钟模式按下时不显示当前时间if(fen==60){ fen=0;shi++;}if(!keynum1) write_addate2(0x47,fen); //当调闹钟模式按下时不显示当前时间if(shi==24){shi=0;ri++;week++;}if(!keynum1) write_addate2(0x44,shi); //当调闹钟模式按下时不显示当前时间if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)if(ri==32){ ri=1; y ue++; }if(yue==4||yue==6||yue==9||yue==11)if(ri==31){ ri=1; yue++; }if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))if(ri==30){ ri=1; yue++; }if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))if(ri==29){ ri=1; yue++; }if(!keynum1) write_addate2(9,ri);//当调闹钟模式按下时不显示当前时间if(week==7)week=0;if(!keynum1)//当调闹钟模式按下时不显示当前时间{ write_com(0x8c);write_rq(week);}if(yue==13){ yue=0;nian++;}if(!keynum1)//当调闹钟模式按下时不显示当前时间{write_addate2(6,yue);write_com(0x88);write_date('-');}if(nian==10000)nian=0;if(!keynum1){ write_addate1(1,nian);//当调闹钟模式按下时不显示当前时间write_com(0x85);write_date('-');}}}。
51单片机电子闹钟程序(亲自编写,可用)
学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到******************询问。
51单片机电子时钟硬件图及完整程序代码
delay(10);
P2=0xdf; //片选秒十位
P0=table[s/10];//显示小时十位
delay(10);
P2=0xff; //关闭所有片选位
}
/*=================初始化函数================*/
void init()
delay(10);
P2=0xf7; //片选分十位
P0=table[f/10]; //显示分十位
delay(10);
P2=0xff; //关闭所有片选位
}
/*=================时显示程序================*/
void displayshi(uchar s)
{
P2=0xef; //片选小时个位
sbit beep=P1^0; //定义蜂鸣器端
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//7段代码表(0~9)
uchar count ,s1num;
char miao,shi,fen;
/*=================延时程序================*/
void delay1ms(void)
{
unsigned i,j;
for(i=0;i<10;i++)
for(j=0;j<1;j++);
}
void delay(unsigned z)
{
unsigned m;
for(m=0;m<z;m++)
51单片机电子时钟C语言程序
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];
数字钟51单片机程序c语言
goto F0; //*按键未释放,在此等候*//
}
//*延时子函数*/
unsigned char i,j;
for(i=5;i>0;i--)
for(j=248;j>0;j--);
}
//*5mS定时中断服务 子函数*//
void zd(void) interrupt 1
{
TH0=-(4800//256);
TL0=-(4800%256);
deda++;
}
//*调整走时时间*//
{
t_dirve();
}
if(P3_7==0)
delay(1);
if(P3_7==0)
t_min++;
if(t_min==60)
{
if(deda<=100)
d_05s=0;
else d_05s=1;
if(deda>=200)
{sec++;deda=0;}
if(sec==60)
{min++;sec=0;}
if(min==60)
{hour++;min=0;}
if(hour==24)
{hour=0;}
p_out(); //*判别闹时到 子函数*// 否
}
//*定时器 T0 5mS初始化*//
void init_timer()
{
TMOD=0x01;
TH0=-(4800//256);
TL0=-(4800%256);
IE=0x82;
基于51单片机的时钟C语言代码
基于51单⽚机的时钟C语⾔代码#include#define uint unsigned int#define uchar unsigned charsbit dula=P2^6; //定义锁存器锁存端sbit wela=P2^7;sbit rs=P3^5; //定义1602液晶RS端sbit lcden=P3^4; //定义1602液晶LCDEN端sbit s1=P3^0; //按键功能键sbit s2=P3^1; //增⼤键sbit s3=P3^2; //减⼩键sbit rd=P3^7;sbit beep=P2^3;sbit sda=P2^0;sbit scl=P2^1;uchar a;void delay21(){ ;; }void start() //{sda=1;delay21();scl=1;delay21();sda=0;delay21();}void stop() //{sda=0;delay21();scl=1;delay21();sda=1;delay21();{uchar i;scl=1;delay21();while((sda==1)&&(i<250))i++; scl=0;delay21();}void init_24c02(){sda=1;delay21();scl=1;delay21();}void write_byte(uchar date) { uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay21();sda=CY;delay21();scl=1;delay21();// scl=0;// delay21();}scl=0;delay21();sda=1;delay21();uchar read_byte(){uchar i,k;scl=0;delay21();sda=1;delay21();for(i=0;i<8;i++){scl=1;delay21();k=(k<<1)|sda;scl=0;delay21();}return k;}void write_add(uchar address,uchar date) { start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date);respons();stop();}uchar read_add(uchar address){uchar date;start();write_byte(0xa0);respons();write_byte(address);write_byte(0xa1);respons();date=read_byte();stop();return date;}uchar count,s1sum;char miao,shi,fen;uchar code table[]="2016-11-10 xiao";//定义初始上电时液晶默认显⽰状态void delay(uint z) {uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void di(){beep=0;delay(100);beep=1;}void write_com(uchar com)//写指令{rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date)//写数据{rs=1;delay(5);lcden=1;delay(5);lcden=0;}void write_sfm(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add); //设置显⽰位置write_date(0x30+shi);write_date(0x30+ge);}void init()//初始化函数{uchar num;rd=0; //软件将矩阵按键第四列⼀端置低⽤以分解出独⽴按键dula=0; //关闭两锁存器锁存端;防⽌操作液晶时数码管出现乱码wela=0;lcden=0;fen=0;miao=0;shi=0;count=0;s1sum=0;init_24c02(); //write_com(0x38); //初始化1602液晶write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80); //设置显⽰初始坐标for(num=0;num<16;num++){write_com(0x80+0x40+6); //显⽰时间的冒号write_date(':');delay(5);write_com(0x80+0x40+9);write_date(':');delay(5);miao=read_add(1);//⾸次上电从AT24C02中读出的存储的数据fen=read_add(2);shi=read_add(3);write_sfm(10,miao); //分别送去液晶显⽰write_sfm(7,fen);write_sfm(4,shi);TMOD=0x01;//设置定时器0为⼯作⽅式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0}void keyscan() //按键扫描函数{if(s1==0){delay(5);if(s1==0) //确认功能键被按下{s1sum++; //功能键按下记录次数while(!s1); //释放确认di(); //每当有按键释放蜂鸣器发出滴声if(s1sum==1) //第⼀次被按下时{TR0=0; //关闭定时器write_com(0x80+0x40+10); //光标定位到秒位置if(s1sum==2) //第⼆次按下光标定位到分位置{write_com(0x80+0x40+7);}if(s1sum==3) //第⼆次按下光标定位到时位置{write_com(0x80+0x40+4);}if(s1sum==4) //第四次按下{s1sum=0; //记录按键数清零write_com(0x0c); //取消光标闪烁TR0=1; //启动定时器使时钟开始⾛}}}if(s1sum!=0) //只有功能键被按下后,增⼤和减⼩键才有效{ if(s2==0){delay(5);if(s2==0) //增加键确认被按下{while(!s2); //按键释放di();if(s1sum==1) //若功能键第⼀次按下{miao++; //+1秒if(miao==60) miao=0;write_sfm(10,miao);//调节⼀次送液晶显⽰⼀次write_com(0x80+0x40+10);//显⽰位置重新回到调节处write_add(1,miao); //数据改变⼀次⽴即存⼊24C02 }if(s1sum==2){if(fen==60) fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);write_add(2,fen);}if(s1sum==3){shi++;if(shi==24) miao=0;write_sfm(4,shi);write_com(0x80+0x40+4);write_add(3,shi);}}}if(s3==0){delay(5);if(s3==0) //增加键确认被按下{while(!s3); //按键释放di();if(s1sum==1) //若功能键第⼀次按下{miao--; //+1秒if(miao==-1) miao=59;write_sfm(10,miao);//调节⼀次送液晶显⽰⼀次write_com(0x80+0x40+10);//显⽰位置重新回到调节处write_add(1,miao); //数据改变⼀次⽴即存⼊24C02 } if(s1sum==2){fen--;if(fen==-1) fen=59;write_sfm(7,fen);write_add(2,fen);}if(s1sum==3){shi--;if(shi==-1) miao=23;write_sfm(4,shi);write_com(0x80+0x40+4);write_add(3,shi);}}}}}void main(){init(); //初始化各数据while(1){keyscan(); //不停地检测按键是否被按下}}void time0() interrupt 1 //定时器0中断服务程序{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==20) //20次50毫秒为⼀秒{count=0;miao++;if(miao==60){miao=0;fen++;{fen=0;shi++;if(shi==24){shi=0;}write_sfm(4,shi); //⼩时若变化则重新写⼊write_add(3,shi); //数据改变⽴即存⼊24C02 }write_sfm(7,fen);write_add(2,fen);}write_sfm(10,miao);write_add(1,miao);}}。
51单片机带字库液晶12864ds1302数字时钟c源程序(无按键修改功能)
51单片机+带字库液晶12864+DS1302数字时钟C 源程序(无按键修改功 能)过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了 这个程序。
目前还不能修改时间与日期,只是以预定时间以始。
适用于开发板:51单片机(AT89S52 +带字库液晶12864(ST7920)+DS1302实时时钟)实现功能:简单,数字时钟 +日期(以后会不断完美)。
C 语言源程序如下:#include <reg52.h>#include <intrins.h> #define uchar unsigned char #define uint unsigned int /*DS1302 端 口设置 */sbit SCK=P3A 6;sbit SDA=P3A4;sbit RST = P3A5;bitReadRTC_Flag;/* 12864 端口定义 */ #define LCD_data P0 sbit LCD_RS = P2A4;sbit LCD_RW = P2A5; sbit LCD_EN = P2A 6;//液晶使能控制sbit PSB 二卩2八1; //并口控制 //DS1302 时钟 //DS1302 IO // DS1302 复位 //读DS1302全局变量//带字库液晶 12864数据口// 寄存器选择输入// 液晶读/写控制sbit RES=P2A3;uchar code dis1[] = {"电子设计天地"};// 液晶显示的汉字uchar code dis2[] = {"有志者,事竟成!"};uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'};unsigned char temp;#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};void lcd_pos(uchar X,uchar Y); //确定显示位置unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};〃秒分时日月周年09-10-19 16:07:00code unsigned charwrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位code unsigned charread_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};void Write_Ds1302_byte(unsigned char temp);void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);//read RTCvoid Set_RTC(void); //set RTCvoid InitTIMER0(void);//inital timer0/*******************************************************************//**//* 延时函数 *//* *//******************************************************************* /void delay(unsigned int m) // 延时程序 {unsigned int i,j;for(i=0;i<m;i++)**************************************************//*检查LCD 忙状态*//*lcd_busy 为1时,忙,等待。
基于51单片机的电子钟C语言程序
基于51单片机的电子钟C语言程序#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int/*七段共阴管显示定义*/uchar codedispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};/*定义并初始化变量*/uchar seconde=0;uchar minite=0;uchar hour=12;uchar mstcnt=0;sbit P1_0=P1^0; // second 调整定义sbit P1_1=P1^1; //minite调整定义sbit P1_2=P1^2; //hour调整定义/*函数声明*/void delay(uint k ); //延时子程序void delay1(uchar h );void time_pro( ); //时间处理子程序void display( ); //显示子程序void keyscan( ); //键盘扫描子程序/*****************************//*延时子程序*//****************************/void delay1 (uchar h){uchar j;while((h--)!=0){for(j=0;j<125;j++){;}}}void delay (uint k){uint a,b,c;for(c=k;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);}/**************************//*时间处理子程序*//**************************/void time_pro( void){if(seconde==60) //秒钟设为60进制 { seconde=0;minite++;if( minite==60) //分钟设为60进制{ minite=0;hour++;if(hour==24) //时钟设为24进制{hour=0; }}}}/*****************************//* 显示子程序*//*****************************/void display(void){P2=0xfe;P0=dispcode[hour/10]; //显示小时的十位 delay1(4);P2=0xfd;P0=(dispcode[(hour%10)])|0X80; //显示小时的个位 delay1(4);P2=0xfb;P0=dispcode[minite/10]; //显示分的十位 delay1(4);P2=0xf7;P0=(dispcode[minite%10])|0X80; //显示分的个位 delay1(4);P2=0xef;P0=dispcode[seconde/10]; //显示秒的十位delay1(4);P2=0xdf;P0=dispcode[seconde%10]; //显示秒的个位delay1(4);}/*******************************//*键盘扫描子程序*//*******************************/void keyscan (void){if(P1_0==0) //按键1秒的调整{delay(2);if(P1_0==0)//delay(300);{seconde++;if(seconde==60){seconde=0; }}}if(P1_1==0) //按键2分的调整{delay(2);if(P1_1==0)// delay(300);{minite++;if(minite==60){minite=0;}}}if(P1_2==0) //按键3小时的调整{delay(2);if(P1_2==0)//delay(300);{hour++;if(hour==24){hour=0; }}}}void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次{TH0=0x3c;TMOD = 0x11;mstcnt++;if(mstcnt==20){seconde++;mstcnt=0; //注意点。
51单片机C语言电子时钟程序设计程序
主程序:#include"DS18B20_3.H"#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;#define yh 0x80#define er 0x80+0x40//液晶屏的与C51之间的引脚连接定义sbit rs=P2^0;sbit en=P2^2;sbit rw=P2^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了sbit led=P2^6; //LCD背光开关//DS1302时钟芯片与C51之间的引脚连接定义sbit IO=P1^1;sbit SCLK=P1^0;sbit RST=P1^2;sbit ACC0=ACC^0;sbit ACC7=ACC^7;//校时按键与C51的引脚连接定义sbit key1=P1^5; //设置键sbit key2=P1^6; //加键sbit key3=P1^7; //减键sbit buzzer=P1^3; //蜂鸣器,通过三极管9012驱动,端口低电平响/**************************************************************/uchar code tab1[]={"20 - - "}; //年显示的固定字符uchar code tab2[]={" : : "}; //时间显示的固定字符//延时函数,后面经常调用void delay(uint xms) //延时函数,有参函数{uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}/********液晶写入指令函数与写入数据函数,以后可调用**************/write_1602com(uchar com) //****液晶写入指令函数****{rs=0; //数据/指令选择置为指令rw=0; //读写选择置为写P0=com; //送入数据delay(1);en=1; //拉高使能端,为制造有效的下降沿做准备delay(1);en=0; //en由高变低,产生下降沿,液晶执行命令}write_1602dat(uchar dat) //***液晶写入数据函数****{rs=1; //数据/指令选择置为数据rw=0; //读写选择置为写P0=dat; //送入数据delay(1);en=1; //en置高电平,为制造下降沿做准备delay(1);en=0; //en由高变低,产生下降沿,液晶执行命令}lcd_init() //***液晶初始化函数****{write_1602com(0x38); //设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c); //开显示不显示光标write_1602com(0x06); //整屏不移动,光标自动右移write_1602com(0x01); //清显示write_1602com(yh+1); //日历显示固定符号从第一行第1个位置之后开始显示for(a=0;a<14;a++){write_1602dat(tab1[a]); //向液晶屏写日历显示的固定符号部分//delay(3);}write_1602com(er+2); //时间显示固定符号写入位置,从第2个位置后开始显示for(a=0;a<8;a++){write_1602dat(tab2[a]); //写显示时间固定符号,两个冒号//delay(3);}}/*********************over***********************//***************DS1302有关子函数********************/void write_byte(uchar dat)//写一个字节{ACC=dat;RST=1;for(a=8;a>0;a--){IO=ACC0;SCLK=0;SCLK=1;ACC=ACC>>1;}}uchar read_byte() //读一个字节{RST=1;for(a=8;a>0;a--){ACC7=IO;SCLK=1;SCLK=0;ACC=ACC>>1;}return (ACC);}//----------------------------------------void write_1302(uchar add,uchar dat) //向1302芯片写函数,指定写入地址,数据{RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;}uchar read_1302(uchar add) //从1302读数据函数,指定读取数据来源地址{uchar temp;RST=0;SCLK=0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);}uchar BCD_Decimal(uchar bcd) //BCD码转十进制函数,输入BCD,返回十进制{uchar Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));}//--------------------------------------void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4){RST=0;SCLK=0;write_1302(0x8e,0x00); //允许写,禁止写保护//write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00//write_1302(0x82,0x00); //向DS1302内写分寄存器82H写入初始分数据00//write_1302(0x84,0x12); //向DS1302内写小时寄存器84H写入初始小时数据12//write_1302(0x8a,0x04); //向DS1302内写周寄存器8aH写入初始周数据4//write_1302(0x86,0x07); //向DS1302内写日期寄存器86H写入初始日期数据07//write_1302(0x88,0x01); //向DS1302内写月份寄存器88H写入初始月份数据01//write_1302(0x8c,0x10); //向DS1302内写年份寄存器8cH写入初始年份数据10write_1302(0x8e,0x80); //打开写保护}//温度显示子函数void write_temp(uchar add,uchar dat) //向LCD写温度数据,并指定显示位置{uchar gw,sw;gw=dat%10; //取得个位数字sw=dat/10; //取得十位数字write_1602com(er+add); //er是头文件规定的值0x80+0x40write_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码write_1602dat(0xdf); //显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码write_1602dat(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码}//时分秒显示子函数void write_sfm(uchar add,uchar dat) //向LCD写时分秒,有显示位置加、现示数据,两个参数{uchar gw,sw;gw=dat%10; //取得个位数字sw=dat/10; //取得十位数字write_1602com(er+add); //er是头文件规定的值0x80+0x40write_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码}//年月日显示子函数void write_nyr(uchar add,uchar dat) //向LCD写年月日,有显示位置加数、显示数据,两个参数{uchar gw,sw;gw=dat%10; //取得个位数字sw=dat/10; //取得十位数字write_1602com(yh+add); //设定显示位置为第一个位置+addwrite_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码}void write_week(uchar week) //写星期函数{write_1602com(yh+0x0c); //星期字符的显示位置switch(week){case 1:write_1602dat('M'); //星期数为1时,显示write_1602dat('O');write_1602dat('N');break;case 2:write_1602dat('T'); //星期数据为2时显示write_1602dat('U');write_1602dat('E');break;case 3:write_1602dat('W'); //星期数据为3时显示write_1602dat('E');write_1602dat('D');break;case 4:write_1602dat('T'); //星期数据为4是显示write_1602dat('H');write_1602dat('U');break;case 5:write_1602dat('F'); //星期数据为5时显示write_1602dat('R');write_1602dat('I');break;case 6:write_1602dat('S'); //星期数据为6时显示write_1602dat('T');write_1602dat('A');break;case 7:write_1602dat('S'); //星期数据为7时显示write_1602dat('U');write_1602dat('N');break;}}//****************键盘扫描有关函数**********************void keyscan(){if(key1==0) //key1为功能键(设置键){delay(9); //延时,用于消抖动if(key1==0) //延时后再次确认按键按下{buzzer=0; //蜂鸣器短响一次delay(20);buzzer=1;while(!key1);key1n++;if(key1n==9)key1n=1; //设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环switch(key1n){case 1: TR0=0; //关闭定时器//TR1=0;write_1602com(er+0x09); //设置按键按动一次,秒位置显示光标write_1602com(0x0f); //设置光标为闪烁temp=(miao)/10*16+(miao)%10; //秒数据写入DS1302write_1302(0x8e,0x00);write_1302(0x80,0x80|temp);//miaowrite_1302(0x8e,0x80);break;case 2: write_1602com(er+6); //按2次fen位置显示光标//write_1602com(0x0f);break;case 3: write_1602com(er+3); //按动3次,shi//write_1602com(0x0f);break;case 4: write_1602com(yh+0x0e); //按动4次,week//write_1602com(0x0f);break;case 5: write_1602com(yh+0x0a); //按动5次,ri//write_1602com(0x0f);break;case 6: write_1602com(yh+0x07); //按动6次,yue//write_1602com(0x0f);break;case 7: write_1602com(yh+0x04); //按动7次,nian//write_1602com(0x0f);break;case 8:write_1602com(0x0c); //按动到第8次,设置光标不闪烁TR0=1;//打开定时器temp=(miao)/10*16+(miao)%10;write_1302(0x8e,0x00);write_1302(0x80,0x00|temp);//miao数据写入DS1302write_1302(0x8e,0x80);break;}}}//------------------------------加键key2----------------------------if(key1n!=0) //当key1按下以下。
基于C51单片机的数字时钟课程设计(C语言带闹钟)
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。
键盘采用动态扫描方式。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
51单片机设置的电子闹钟(可调时间和闹钟)
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define LED P0 // 数码管的段选#define LIGHT P1 // 时分秒位的指示灯#define WS P2 // 数码管的位选sbit key1=P3^0; // 时间暂停/开始sbit key2=P3^1; // 时间/闹钟设置sbit key3=P3^2; // 增加sbit key4=P3^3; // 减少sbit alarm=P3^6; // 闹铃uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9uchar tab_dp[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 0.-9.(带小数点)uchar data1[]={0,0,0,0,0,0};uchar data2[]={0,0,0,0,0,0};uint t,k,kk,k1,flag;uint bbh,bbm,bbs,bbh1,bbm1,bbs1;uint sec,min,hour,sec1,min1,hour1; // 定义秒,分,时void init();void display();void display_bb();void delay( uint );void keyscan();void main(){init();while(1){keyscan();if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if((bbh==hour)&&(bbm==min)&&data1[4]==0&&data1[5]==5) // 5s报时{alarm=~alarm;delay(1);}if((bbs==sec)&&(bbm==min)&&(bbh==hour)) // 可调报时{alarm=~alarm;delay(1);}}}void init(){WS=LIGHT=flag=0;sec=min=hour=0; // 将0赋给时分秒TMOD=0x01; // 方式1 P129(见课本)TH0=0x3c; // 65536-50000=15536=0x3cb0(50ms) P128(见课本)TL0=0xb0;EA=1; // 开总中断P161(见课本)TR0=1; // 定时/计数器0开启ET0=1; // 定时器/计数器0溢出中断启动P161(见课本)}void delay( unsigned int t) // 延时函数{unsigned int i;while(t--)for(i=0;i<125;i++);}void display() // 显示时间函数{if(TF0==1) // 定时器/计数器溢出P130(见课本){TF0=0; // 清中断标志位t++;if(t==20) // (50ms*20=1s){t=0;sec++; // 秒加1if(sec==60) // 秒为60,则清零,分加1{sec=0;min++;}if(min==60) // 分为60,则清零,时加1{min=0;hour++;}if(hour==24)// 时为24,则清零{hour=0;}}}data1[5]=sec%10;data1[4]=sec/10;data1[3]=min%10;data1[2]=min/10;data1[1]=hour%10;data1[0]=hour/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data1[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data1[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data1[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data1[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data1[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data1[0]];delay(1);}void display_bb() // 显示闹钟函数{data2[5]=bbs%10;data2[4]=bbs/10;data2[3]=bbm%10;data2[2]=bbm/10;data2[1]=bbh%10;data2[0]=bbh/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data2[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data2[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data2[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data2[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data2[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data2[0]];delay(1);}void keyscan() // 键盘扫描{if(key1==0) // 暂停/开始{++kk;while(!key1){display();if(kk==1){TR0=0;if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if(key2==0) // 模式选择(调节时间/闹钟){k1++;while(!key2){if(k1==1) // 第1次按下{sec1=sec; // 保存秒的数值sec=88; // 显示88,表示可以调节秒的数值了display(); // 显示88sec=sec1; // 恢复前一刻秒的数值}if(k1==2){min1=min;min=88;display();delay(1);min=min1;}if(k1==3){hour1=hour;hour=88;delay(1);hour=hour1;}if(k1==4){sec1=bbs; // 保存秒的数值bbs=66; // 显示66,表示可以调节秒的数值了display_bb(); // 显示66bbs=sec1; // 恢复前一刻秒的数值}if(k1==5){min1=bbm;bbm=66;display_bb();delay(10);bbm=min1;}if(k1==6){hour1=bbh;bbh=66;display_bb();delay(10);bbh=hour1;}if(k1==7){k1=0;display();}}}if(key3==0) // 时间/闹钟增加设置{while(!key3){if(k1==1){sec++;// 秒加1if(sec==60)sec=0;display();}if(k1==2){min++;delay(60);if(min==60)min=0;display();}if(k1==3){hour++;delay(60);if(hour==24)hour=0;display();}if(k1==4){bbs++; // 秒加1delay(60);if(bbs==60)bbs=0;display_bb();}if(k1==5){bbm++;delay(60);if(bbm==60)bbm=0;display_bb();}if(k1==6){bbh++;delay(60);if(bbh==24)bbh=0;display_bb();if(k1==7){k1=0;display();}}}if(key4==0) // 时间/闹钟减少设置{while(!key4){if(k1==1){sec--; // 秒加1delay(60);if(sec==0)sec=60;display();}if(k1==2){min--;delay(60);if(min==0)min=60;display();}if(k1==3){hour--;delay(60);if(hour==0)hour=24;display();}if(k1==4){bbs--; // 秒减1delay(60);if(bbs==0)bbs=60;display_bb();if(k1==5){bbm--;delay(60);if(bbm==0)bbm=60;display_bb();}if(k1==6){bbh--;delay(60);if(bbh==0)bbh=24;display_bb();}if(k1==7){k1=0;display();}}}}}if(kk==2){kk=0;k1=0;TR0=1;}}}。
完整51单片机多功能电子钟程序代码
完整51单片机多功能电子钟程序代码#include "regx52.h"#define uint8 unsigned charcode uint8 LED[] = {0xc0, 0xf9, 0xa4, 0xb0,0x99, 0x92, 0x82, 0xf8,0x80, 0x90, 0x88, 0x83,0xc6, 0xa1, 0x86, 0x8e}; unsigned char riqi[8]; static uint8 keyReleas;uint8 disptmp;uint8 pos;uint8 buffer[8];code uint8 BIT[8] = {0xfe, 0xfd, 0xfb, 0xf7,0xef, 0xdf, 0xbf, 0x7f}; uint8 flag2ms;uint8 t2msCnt;uint8 halfSecCnt;uint8 IsTimerRun;uint8 mode;void GlobalvarInit();void T0Init();void TimeRun();unsigned char KeyScan();void Command();void Command();void T0IntSvr() interrupt 1 using 1{TL0 = (65536-2000)%256;TH0 = (65536-2000)/256;switch(mode){case 0:disptmp=LED[buffer[pos]]; switch(pos){case 2:case 4:case 6:disptmp&=~(1<<7); break;}break;case 1:disptmp=LED[riqi[pos]]; switch(pos){case 2:case 4:disptmp&=~(1<<7); break;}break;}P2 = 0xff;P0 = disptmp;P2 = BIT[pos];pos++;if(pos>7)pos = 0;flag2ms = 1;}void main(){GlobalvarInit();T0Init();EA = 1;while(1){TimeRun();Command();}}void TimeRun(){if(IsTimerRun == 0) return; if(flag2ms != 1) return; flag2ms = 0;t2msCnt++;if(t2msCnt < 250) return; t2msCnt = 0; halfSecCnt++;if(halfSecCnt < 2) return; halfSecCnt = 0;buffer[0]++;if(buffer[0] < 10) return; buffer[0] = 0;buffer[1]++;if(buffer[1] < 6) return; buffer[1] = 0;buffer[2]++;if(buffer[2] < 10) return;buffer[2] = 0;buffer[3]++;if(buffer[3] < 6) return;buffer[3] = 0;buffer[4]++;switch(buffer[5]){case 0:case 1:if(buffer[4] < 10) return; buffer[4] = 0;break; case 2: if(buffer[4] < 4) return; buffer[4] = 0;break; }buffer[5]++;if(buffer[5] < 3) return;buffer[5] = 0;riqi[0]++;switch(riqi[1]){case 0:if( riqi[0] < 10) return; riqi[0] = 1;break; case 1: case 2:if( riqi[0] < 10) return; riqi[0] = 0;break; case 3:if( riqi[0] < 2) return; riqi[0] = 0;break;}riqi[1]++;if(riqi[1]<4) return;riqi[1]=0;riqi[2]++;switch(riqi[3]){case 0:if( riqi[2] < 10) return; riqi[2] = 1;break;case 1:if( riqi[2] < 3) return; riqi[2] = 0;break; }riqi[3]++;if(riqi[3]<1) return;riqi[3]=0;riqi[4]++;if(riqi[4]<10) return;riqi[4]=0;riqi[5]++;if(riqi[5]<10) return;riqi[5]=0;riqi[6]++;if(riqi[6]<10) return;riqi[6]=0;riqi[7]++;if(riqi[7]<10) return;riqi[7]=0;}void T0Init(){TMOD = TMOD & 0xf0 | 0x01;// 2msTL0 = (65536-2000)%256;TH0 = (65536-2000)/256;ET0 = 1;TR0 = 1;}// 全局变量初始化void GlobalvarInit(){uint8 i;for (i = 0; i < 8; i++){buffer[i] = 0;}pos = 1;flag2ms = 0;t2msCnt = 0; IsTimerRun = 1;mode = 0;riqi[0]= 0;riqi[1]= 2;riqi[2]=6;riqi[3]=0;riqi[4]=3;riqi[5]=1;riqi[6]=0;riqi[7]=2;}unsigned char KeyScan() { unsigned char key;P3 = 0x0f;if ((P3 & 0x0f) == 0x0f) {return 0;}P3 = 0x7f;key = P3;key = key & 0x0f;if(key != 0x0f){return (key | 0x70);}P3 = 0xbf;key = P3;key = key & 0x0f;if(key != 0x0f){return (key | 0xb0);}P3 = 0xdf;key = P3;key = key & 0x0f;if(key != 0x0f){return (key | 0xd0);}P3 = 0xef;key = P3;key = key & 0x0f;if(key != 0x0f){return (key | 0xe0);}return 0;}static uint8 keyRelease = 1; void Key_bd(){buffer[7] = 0x0b; buffer[6] = 0x0d; }void Key_be() {switch(mode) {case 0:mode = 1; break;case 1:mode = 0; break;}}void Key_0x77() {if(buffer[4]>3) {buffer[5]++;if(buffer[5]>1) buffer[5]=0;}else{buffer[5]++;if(buffer[5]>2) buffer[5]=0;}}void Key_0x7b(){switch(buffer[5]){case 0:case 1:buffer[4]++;if(buffer[4]>9)buffer[4]=0; break;case 2:buffer[4]++;if(buffer[4]>3)buffer[4]=0;break; }}void Key_0xee(){switch(riqi[1]){case 0: riqi[0]++;if(riqi[0]>9) riqi[0]=1;break;case 1:case 2:riqi[0]++;if(riqi[0]>9) riqi[0]=0;break;case 3:riqi[0]++;if(riqi[0]>1)riqi[0]=0;break;}}void Key_0xeb() {switch(riqi[3]){case 0:riqi[2]++;if(riqi[2]>9) riqi[2]=1; break;case 1:riqi[2]++;if(riqi[2]>2) riqi[2]=0; break;}}void Key_0xed() {if(riqi[0]<=1){riqi[1]++;if(riqi[1]>3)riqi[1]=0;}if(riqi[0]>1){riqi[1]++;if(riqi[1]>2)riqi[1]=0;}}void Key_0xe7(){if(riqi[2]>2)riqi[3]=0;else{riqi[3]++;if(riqi[3]>1)riqi[3]=0;}}void Command(){uint8 key;key = KeyScan();if (key == 0){keyRelease = 1;return;}if(keyRelease == 0)return;keyRelease = 0;switch(key){case 0xbe: Key_be(); break; // Key_8 case 0xbd: Key_bd(); break; // Key_9 case 0xbb: IsTimerRun = 1; break;// Key_A case 0xb7: IsTimerRun = 0; break;// Key_Bcase 0x77: Key_0x77();break;// Key_Fcase 0x7b: Key_0x7b();break;// Key_Ecase 0x7d: buffer[3]++;if(buffer[3]>5)buffer[3]=0;;break;// Key_D case 0x7e: buffer[2]++;if(buffer[2]>9)buffer[2]=0;;break;// Key_C case 0xde: riqi[4]++;if(riqi[4]>9)riqi[4]=0; break;// Key_4 case 0xdd: riqi[5]++;if(riqi[5]++>9)riqi[5]=0; break;// Key_5 case 0xdb: riqi[6]++;if(riqi[6]>9)riqi[6]=0; break;// Key_6case 0xd7: riqi[7]++;if(riqi[7]>9)riqi[7]=0; break;// Key_7case 0xee: Key_0xee(); break;// Key_0case 0xed: Key_0xed();break;// Key_1case 0xeb: Key_0xeb(); break;// Key_2case 0xe7: Key_0xe7();break;// Key_3}}。
51单片机电子时钟(C语言)
#include <reg51.h>#include <intrins.h>#define uchar unsigned char //宏定义#define uint unsigned intuchar sec,min,hour,sec50,jishu,dtp2; //sec、min、hour、为显示单元,sec50为60秒计数单元,jishu为扫描数码管计数单元uchar sec1,min1,hour1; //时间中介单元uchar nzmin,nzhour,nzjishu=0,dispjishu=0; //闹钟分、时定义uchar data nzbit=0; //闹钟标志位,闹钟默认为开启uchar data dispbit=0; //显示标志位,默认显示当前时间uchar data disp[8]; //秒、分、时个位与十位存放数组及‘—’uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0-9sbit KEYmin=P3^2; //分加1按钮sbit KEYhour=P3^3; //时加1按钮sbit LABA=P1^0; //闹钟输出I/O口sbit NZdisplay=P3^4; //闹钟显示按钮,按住不放显示闹钟时间,放开则显示当前时间sbit KEYnzmin=P3^5; //闹钟分加1按钮sbit KEYnzhour=P3^6; //闹钟时加1按钮sbit KEYoff=P3^7; //关闭闹钟按钮,按第一次为关闭,第二次为开启void display(); //显示函数声明void keyscan(); //按键扫描函数声明void naozhong(); //闹钟判别函数声明void keynz(); //闹钟按键函数声明void main(){sec=0; //时间初始化为00—00—00min=0;hour=0;sec1=0; //显示单元初始化为00—00—00min1=0;hour1=0;nzmin=01; //闹钟初始时间为01:01nzhour=01;jishu=0;dtp2=0xfe;P0=0xff;TMOD=0x11; //设T0、T1为模式1IE=0x8a;TH0=0xb8; //T0定时20msTL0=0x0;TH1=0xfc; //T1定时1msTL1=0x66;TR0=1;TR1=1;while(1){display(); //调用显示子程序keyscan(); //调用按键子程序keynz(); //调用闹钟按键子程序}}void t0int() interrupt 1 //T0定时中断程序{TH0=0xb8;TL0=0x0;sec50++;if(sec50==50) //对20ms计数50次即1s{sec50=0; //清秒计数器,为下次做准备naozhong(); //调用闹钟判别子程序sec1++; //秒加1}if(sec1==60) //对秒计数60次即1min{sec1=0;min1++; //分加1}if(min1==60) //对分计数60次即1hour{min1=0;hour1++; //时加1}if(hour1==24){hour1=0;}if(dispbit==0) //判断显示标志位是否为0,为0显示当前时间{sec=sec1;min=min1;hour=hour1;}else //显示标志位为1,显示闹钟时间{min=nzmin; //将闹钟时间给显示单元hour=nzhour;}}void t1int() interrupt 3 //T1中断程序{TH1=0xfc;TL1=0x66;P2=0xff; //关闭所有数码管P2=dtp2;dtp2=_crol_(dtp2,1);P0=disp[jishu];jishu++;if(jishu==8) //扫描完8位数码管清0,重新从第一位开始扫描{jishu=0;}}void delay(uint x) //延时函数uchar i;while(x--){for(i=0;i<120;i++);}}void display() //显示子程序{disp[7]=table[sec%10]; //秒个位显示disp[6]=table[sec/10]; //秒十位显示disp[4]=table[min%10]; //分个位显示disp[3]=table[min/10]; //分十位显示disp[1]=table[hour%10]; //时个位显示disp[0]=table[hour/10]; //时十位显示disp[2]=0xbf; //显示‘_’disp[5]=0xbf;}void keyscan() //按键子程序{delay(20); //延时消抖if(KEYmin==0)//时间分加1按钮{min1++; //时间分加1if(min1==60){min1=0;hour1++; //分加到60对时加1}if(hour1==24){hour1=0;}while(!KEYmin); //等待按键放开}delay(20); //延时消抖if(KEYhour==0) //时间时加1按钮{hour1++; //时间时加1if(hour1==24){hour1=0;}while(!KEYhour); //等待按键放开}void naozhong() //闹钟判断{if(nzbit==0) //判断闹钟标志位,0为开启闹钟判断,1为关闭闹钟{if(min1==nzmin) //闹钟与时间分的判别if(hour1==nzhour) //闹钟与时间时的判别LABA=0; //时间分、时与闹钟分、时相等就打开蜂鸣器}elseLABA=1;}void keynz() //闹钟加、减及闹钟关闭、开启按键处理子程序{delay(20); //延时消抖if(KEYnzmin==0) //判别闹钟分加1按键{nzmin++; //闹钟分加1if(nzmin==60){nzmin=0;nzhour++; //闹钟分加到60对闹钟时加1if(nzhour==24)nzhour=0;}while(!KEYnzmin); //等待按键放开}delay(20); //延时消抖if(KEYnzhour==0) //判别闹钟时加1按键{nzhour++; //闹钟时加1if(nzhour==24)nzhour=0;while(!KEYnzhour); //等待按键放开}if(KEYoff==0)//判断关闭闹钟按键是否按下{delay(20); // 延时消抖nzjishu++;if(nzjishu==1) //判断是否为第一次按下{nzbit=1; //第一次按下关闭闹钟if(nzjishu==2) //判断是否为第二次按下{nzjishu=0; //第二次按下清计数单元nzbit=0; // 第二次按下开启闹钟判别}while(!KEYoff); //等待按键放开}if(NZdisplay==0) //判别显示切换闹钟按键是否按下{dispjishu++;if(dispjishu==1) //第一次按下显示闹钟时间{dispbit=1; //第一次按下,把标志位置1,显示切换为闹钟时间}if(dispjishu==2) //第二次按下显示为当前时间{dispjishu=0; //清零,重新计数dispbit=0; //第二次按下清零显示标志位,显示切换为当前时间}while(!NZdisplay); //等待按键放开}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
fen++; if(fen==60) fen=0;//满 60,清零 write(6,fen);//重新写秒数据 wcode(0xc7);//写地址 } if(num==3) { shi++; if(shi==24) shi=0;//满 24,清零 write(3,shi);//重新写秒数据 wcode(0xc4);//写地址 } } } //***************************减键控制************************************ //功能:减键按下,时分秒对应减一 if(jian==0) { delay(5); if(jian==0) while(!jian); beep(); if(num==1) { miao--; if(miao==-1)
} //*************************************************************************** //功能:功能键控制时分秒的地址移动,加键控制时分秒加,减键控制减 //*************************************************************************** void keyscan() {
//功能:向 LCD 写一命令
//***************************************************************************
wcode(uchar t)
{
rs=0; // 写的是命令
rw=0;
// 写状态
e=1;
P1=t;
delay(10);
miao=59;//减到-1,退到 59 write(9,miao);//重新写秒数据 wcode(0xca);//写秒地址 } if(num==2) { fen--; if(fen==-1) fen=59;//减到-1,退到 59 write(6,fen);//重新分秒数据 wcode(0xc7);//写分地址 } if(num==3) { shi--; if(shi==-1)
delay(uint z) {
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<120;j++);
}
//***************************************************************************
//功能:在按键按下时,蜂鸣器响
di=0; if(gongneng==0) { delay(5);//延时去抖
if(gongneng==0) {
while(!gongneng); num++;//计数 beep();//滴滴响
if(num==1) {
TR0=0;//关闭定时器 wcode(0xca);//秒的地址 wcode(0x0f);//光标闪烁 } if(num==2) {
} //*************************************************************************** //功能:定时 50ms //*************************************************************************** timer0() interrupt 1 using 1 //使用定时器 0 对各运行时间进行计时 {
//*********************************电子秒表设计****************************** //***************************作者鱼展 2011 年 4 月 16 日*************************** //***************************修改鱼展 2011 年 4 月 16 日*************************** //程序功能:4*4 键盘的驱动,用其中几个来控制时间的加减 // 按键 扫描结果 | 按键 扫描结果| 按键 扫描结果 | 按键 扫描结果 // S1 0XEE | S5 0XDE | S9 0XBE | S13 0X7E // S2 0XED | S6 0XDD | S10 0XBD | S14 0X7D // S3 0XEB | S7 0XDB | S11 0XBB | S15 0X7B // S4 0XE7 | S8 0XD7 | S12 0XB7 | S16 0X77 // 从 4*4 键盘中分离四个键盘,将 P3^5=0,则 S5 代表功能键,S6 代表加,S7 代表减 //*************************************************************************** //头文件,宏定义 //*************************************************************************** #include<reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int //*************************************************************************** //端口定义 //*************************************************************************** sbit rs=P0^0; sbit rw=P0^1; sbit e=P0^2; sbit gongneng=P3^0; sbit jia=P3^1; sbit jian=P3^2; sbit di=P3^5; sbit feng=P0^4; //*************************************************************************** //第一行,第二行显示设置,变量定义 //*************************************************************************** uchar data dis1[13]={"2011 4 16 SAT"}; uchar data dis2[11]={" 00:00:00"};
//***************************************************************************
beep()
{
feng=1;
delay(50);
feng=0;
}
//***************************************************************************
if(num!=0) {
if(jia==0) { delay(5);
if(jia==0) {
while(!jia); beep(); if(num==1)
{ miao++; if(miao==60) miao=0; //满 60,清零 write(9,miao);//重新写秒数据 wcode(0xca);//写地址
e=0; //数据的锁定
}
//***************************************************************************
//功能:向 LCD 写一数据
//***************************************************************************
wcode(0xc7);//分的地址 } if(num==3) {
wcode(0xc4);//时的地址 } if(num==4) {
num=0;//计数清零 wcode(0x0c);//关闭光标 TR0=1;//启动定时器 } } } //*******************************加键控制******************************* //功能:加键按下,时分秒对应加一
uint Data[10] = {0x0030,0x0031,0x0032,0x0033,0x0034,0x0035, 0x0036,0x0037,0x0038,0x0039};
uchar num; char hao,miao,fen,shi; //*************************************************************************** //功能:延时函数 //***************************************************************************
TH0=(65536-50000)/256; //每次中断延时 10MS
TL0=(65536-50000)%256; hao++; if(hao==20) { hao=0; miao++; if(miao==60) { miao=0;//满 60 秒,分加一 fen++; if(fen==60) { fen=0;//满 60 分,时加一 shi++; if(shi==24) { shi=0;//到 24 时,清零 } write(3,shi);//写时地址 } write(6,fen);//写分地址 } write(9,miao);//写秒地址 }