超详细注释的C语言单片机电子时钟

合集下载

制作一个电子时钟C语言版

制作一个电子时钟C语言版

制作一个电子时钟C语言版平常我们常见的电子时钟,能够显示当下的时分秒信息,并且能够随时变化递增,记录着时间的流逝。

今天,我要用c语言来制作这样一款电子时钟,看时间这把杀猪刀如何“一刀一刀”溜掉。

我会一步一步引导大家了解制作过程。

首先,我们可以想到,需要获取系统的时间函数,并且显示在cmd控制台中。

time.h是c/c++日期和时间头文件,用于获取系统日期和时间等要求。

首先给出提取显示当前时间的1.0版本电子时钟。

#include<stdio.h>#include<time.h>#include<string.h>int main(){char str[50];//定义字符串用于存储时间time_t t;struct tm *nt;//tm是time.h中定义的一个结构体t=time(NULL);nt=localtime(&t);//获取当前时间strftime(str,50,"%Y-% m-%d %H:%M:%S ",nt);//strftime是根据当前计算机区域设置格式化本地时间日期printf("现在时刻:%s\n",str);//打印现在时刻getch();return 0;}运行的结果如下:可以看出,的确做到了显示当前时间,但是很明显这不是电子时钟,电子时钟要不断运行变换时间,而不是让时间凝滞。

那么,我们怎么实现真正的电子时钟呢?我们一起思考:如果要实现时间变化,需要不断重新获取当前时间,并且将之前的显示清除掉,然后再打印显示当前时间,这样循环往复。

所以,需要增加一个while(1)死循环,同时要增加一个清屏函数,清除原来的显示。

清屏函数常用的就是system("cls")。

下面是改进后的2.0版代码。

#include<stdio.h>#include<time.h>#include<string.h>int main(){char str[50];time_t t;struct tm *nt;while(1){system("cls");//清屏函数t=time(NULL);nt=localtime(&t);strftime(str,50,"%Y-%m-%d %H:%M:%S “,nt);printf("现在时刻:%s\n",str);}getch();return 0;}然后运行程序,就可以实现电子时钟了,时间不断刷新,秒数递增,时间随之递增。

51单片机数码管显示时钟(C语言)

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语言电子钟(已加入调时、闹铃、整点报时功能)效果图:程序如下://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设置闹铃时间。

电子钟设计c语言设计

电子钟设计c语言设计

电子钟设计c语言设计电子钟是一种使用数字或者模拟显示时间的时钟。

它通常使用数字显示屏或者液晶屏来显示时间。

电子钟的优势在于与传统机械钟相比,它更加准确、可靠、精准和方便。

通过使用c语言来设计电子钟可以使它更加智能化和强大。

我们知道,c语言是一种通用的高级编程语言,它非常适合用于系统编程和应用程序开发。

电子钟的设计需要运用c语言的数据结构、算法、指针和其他通用编程技术。

设计一个可靠的电子钟需要考虑到准确显示时间、时区调整、闹钟功能、定时器和更多的功能。

在设计电子钟时,我们首先需要考虑到选择合适的开发平台和硬件选型。

例如,我们可以使用Arduino或者Raspberry Pi 等开发板来设计电子钟。

这些开发板既能提供强大的计算能力,又可以提供足够的GPIO引脚和通信接口。

同时,我们还需要选择合适的时钟模块,例如DS1307、DS3231和DS1302等。

接下来,我们可以考虑设计程序框架。

设计程序框架需要考虑到用户需求,从而使程序有条不紊地进行。

我们可以设计菜单选项来满足用户需求,例如时钟显示、日期显示、温度显示等等。

此外,还可以考虑添加一些有趣的功能,例如给予经度和纬度计算日出日落时间以及天气预报等。

电子钟的时间显示通常使用RTC模块与单片机进行通信。

RTC模块可以提供秒、分、时、日、月、年等时间数据。

我们需要从RTC模块读取这些数据,并将它们转换成格式化的字符串进行显示。

我们还需要考虑到时区的调整,以便在不同时区下准确显示时间。

闹钟功能是电子钟的一个重要特性。

我们可以设计界面来设置闹钟时间和日期。

当闹钟响起时,电子钟可以触发警报并发出声音或声音和振动提醒。

我们还可以增加关闭闹钟的选项,以便用户可以在闹钟响起时快速关闭它。

另一个特色功能是定时器,它可以用来进行倒计时或计时操作。

我们可以使用按钮或者旋转编码器来设置定时器时间。

定时器可以在倒计时或计时完成时发出警报来通知用户,以便执行相应的操作。

最后,我们需要考虑到电子钟的可扩展性和灵活性。

单片机C语言电子钟显示年月日星期及时间(带注释)

单片机C语言电子钟显示年月日星期及时间(带注释)

#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]=" 2011-12-30 SA T";uchar code table1[]=" 23:59:55 ";uchar code week1[][3]={"MON","TUE","WEN","THU","FRI","SA T","SUN"}; /*uchar code week2[]="TUE";uchar code week3[]="WEN";uchar code week4[]="THU";uchar code week5[]="FRI";uchar code week6[]="SA T";uchar code week7[]="SUN"; */uchar count,shi,fen,miao,dnum,year,month,day,week,a=5;sbit rs=P2^0; //数据命令sbit rw=P2^1; //读写sbit en=P2^2; //使能sbit d1=P3^1; //独立键盘sbit d2=P3^2;sbit d3=P3^3;sbit d4=P3^4;void delay(uchar z) //延时{uint x,y;for(x=110;x>0;x--)for(y=z;z>0;z--);}void write_com(uchar com) //写指令{rs=0;rw=0;en=0;P0=com;delay(5);en=1;delay(5);en=0;}void write_date(uchar date) //写数据{rs=1;rw=0;en=0;P0=date;delay(5);en=1;delay(5);en=0;}void write_weekday (uchar a){uchar x;write_com(0x80+13);for(x=0;x<3;x++){write_date(week1[a][x]);}}void weekday(uint i){write_weekday(i%7);}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); //0x30代表的数字是0,+shi表示shi的数字write_date(0x30+ge); //ge的数字}void write_ymd(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add); //指向要写的地址write_date(0x30+shi); //0x30代表的数字是0,+shi表示shi的数字write_date(0x30+ge); //ge的数字}void unit(){uchar num;en=0;write_com(0x38); //显示write_com(0x0c); //光标不显示write_com(0x06); //指针加1,整屏不移动write_com(0x01); //清屏write_com(0x80); //指针指向0x80for(num=0;num<16;num++) //第一行显示table数组{write_date(table[num]);delay(20);}write_com(0x80+0x40);for(num=0;num<16;num++) //第二行显示table1数组{write_date(table1[num]);delay(20);}TMOD=0X01;TH0=(65536-50000)/256; //开启中断TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;shi=23;fen=59;miao=55;year=11;month=12;day=30;}void jishu() //计数{if(count==20){count=0;miao++; //秒加if(miao==60){miao=0;fen++; //分加if(fen==60){fen=0;shi++;if(shi==24){shi=0;day++;a++;weekday(a);//时加}write_sfm(3,shi);write_ymd(9,day);if(day==31){day=0x01;write_ymd(9,day);month++;write_ymd(6,month);if(month==13){month=0x01;write_ymd(6,month);year++;write_ymd(3,year);}}}write_sfm(6,fen);}write_sfm(9,miao);}}void change(){d4=0;if(d1==0) //移光标{delay(10);if(d1==0){while(!d1);dnum++;if(dnum==1){TR0=0;write_com(0x0f);write_com(0x80+0x40+10);}if(dnum==2){write_com(0x80+0x40+7);}if(dnum==3){write_com(0x80+0x40+4);}if(dnum==4){write_com(0x80+10);}if(dnum==5){write_com(0x80+7);}if(dnum==6){write_com(0x80+4);}if(dnum==7){dnum=0;TR0=1;write_com(0x0c);}}}if(d2==0) //加数据{delay(10);if(d2==0){while(!d2);if(dnum==1){miao++;if(miao==60)miao=0;write_sfm(9,miao); //顺序不能换write_com(0x80+0x40+10); //顺序不能换}if(dnum==2){fen++;if(fen==60)fen=0;write_sfm(6,fen);write_com(0x80+0x40+7);}if(dnum==3){shi++;if(shi==24){shi=0;}write_sfm(3,shi);write_com(0x80+0x40+4);}if(dnum==4){day++;a++;weekday(a);if(day==31)day=1;write_ymd(9,day);write_com(0x80+10);}if(dnum==5){month++;if(month==13)month=1;write_ymd(6,month);write_com(0x80+7);}if(dnum==6){year++;write_ymd(3,year%100);write_com(0x80+4);}}}if(d3==0) //减数据{delay(10);if(d3==0){while(!d3);if(dnum==1){miao--;if(miao==-1)miao=59;write_sfm(9,miao);write_com(0x80+0x40+10);}if(dnum==2){fen--;if(fen==-1)fen=59;write_sfm(6,fen);write_com(0x80+0x40+7);}if(dnum==3){shi--;if(shi==-1)shi=23;write_sfm(3,shi);write_com(0x80+0x40+4);}if(dnum==4){day--;a--;weekday(a);if(day==0)day=30;write_ymd(9,day);write_com(0x80+10);}if(dnum==5){month--;if(month==0)month=12;write_ymd(6,month);write_com(0x80+7);}if(dnum==6){year--;write_ymd(3,year%100);write_com(0x80+4);}}}}void main(){unit();while(1){jishu();change();}}void timer0()interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;}#include<reg52.h>#define uchar unsigned char //宏定义#define uint unsigned int //宏定义sbit rs=P3^5; //液晶数据/指令选择端:1-数据,0-指令sbit lcden=P3^4; //液晶使能控制端:1-有效,0-无效sbit shift_key=P3^2;//位置移动键sbit up_key=P3^3;//增加键uchar temp=0;//定义定时器溢出计数变量,每隔50ms产生1次溢出,temp加1uint year=2011;//定义年变量并赋初值2011年uchar month=06,day=01,week;//定义月、日、星期变量,并赋初值5月23日uchar hour=23,minute=59,second=58;//定义时、分、秒变量,并赋初值12时00分00秒uchar code week_string[7][4]={"MON","TUE","WED","THU","FRI","SA T","SUN"};//定义星期英文缩写表uchar data month_day[12]={31,0,31,30,31,30,31,31,30,31,30,31};//定义每月天数表/*--定时计数器T0及中断初始化函数--*/void init(void){TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;//16位计数初值除以256得到高8位初值TL0=(65536-50000)%256;//16位计数初值除以256的余数得到低8位初值EA=1;//开总中断ET0=1;//开启定时器0中断EX0=1;//开启外部中断,外部中断用于调整时间PT0=1;//将定时器0中断设置高优先级,调整时间期不停止计时TR0=1;//启动定时器0}/*----------1ms延时函数----------*/void delay(uint n){uint i,j;for(i=n;i>0;i--)for(j=114;j>0;j--);}/*-------LCD1602写指令函数-----*/void LCD1602_write_com(uchar com){rs=0;//rs=0,置指令输入状态P0=com;//输出指令码delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*-------LCD1602写数据函数-----*/void LCD1602_write_dat(uchar dat){rs=1;//rs=1,置数据输入状态P0=dat; //输出待显示字符的字符码(ASCII码)delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*********************公历平年的2月只有28天,公历闰年的2月有29天。

用c语言实现钟表

用c语言实现钟表
要使用 C 语言编写一个简单的钟表程序,你可以按照以下步骤进行:
1. 引入所需的头文件:你需要引入一些头文件来实现程序的功能,例如 stdio.h、stdlib.h、time.h 等。
2. 定义程序的数据结构:你可以定义一个结构体来表示钟表的时间,包括时、分、秒等字段。
3. 获取当前时间:使用 time 函数获取当前系统时间,并将其转换为时、分、秒等字段。
localTime->tm_sec);
22.
23.
// 暂停一秒钟
Байду номын сангаас
24.
sleep(1);
25. }
26.
27. return 0;
28. }
29. 这个程序会不断获取当前系统时间,并输出格式为"时:分:秒"的钟表界面。程序会每 秒钟更新一次时间,并在终端上显示。你可以根据需要进行适当的修改和扩展,例
time_t currentTime = time(NULL);
17.
struct tm *localTime = localtime(&currentTime);
18.
19.
// 输出钟表界面
20.
system("clear"); // 清屏(适用于 Linux 和 Mac)
21.
printf("%02d:%02d:%02d\n", localTime->tm_hour, localTime->tm_min,
7. 下面是一个简单的 C 语言实现钟表的代码示例:
8. c 复制代码
9. #include <stdio.h>
10. #include <stdlib.h>

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];

C语言实现电子时钟程序

C语言实现电子时钟程序

C语⾔实现电⼦时钟程序本⽂实例为⼤家分享了C语⾔实现电⼦时钟程序的具体代码,供⼤家参考,具体内容如下Qt ⾥⾯运⾏#include<windows.h>#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <time.h>typedef struct{int x;int y;}Point;time_t now;struct tm *pt, t1, t2;int printpoint(Point p){Point p1;p1.x = p.x + 2; p1.y = p.y + 4;gotoxy(p1.x, p1.y); printf("%c%c", 2, 2);gotoxy(p1.x, p1.y + 1); printf("%c%c", 2, 2);p1.y += 4;gotoxy(p1.x, p1.y); printf("%c%c", 2, 2);gotoxy(p1.x, p1.y + 1); printf("%c%c", 2, 2);return 0;}int print0(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);elseprintf("%c%4s%c", 2, " ", 2);}return 0;}int print1(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);printf("%5s%c", " ", 2);}return 0;}int print2(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else if (i>0 && i<6)printf("%5s%c", " ", 2);elseprintf("%c", 2);}return 0;}int print3(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);elseprintf("%5s%c", " ", 2);}return 0;}int print4(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i<6) printf("%c%4s%c", 2, " ", 2);else if (i == 6)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else printf("%5s%c", " ", 2);}return 0;}int print5(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else if (i>0 && i<6)printf("%c", 2);elseprintf("%5s%c", " ", 2);}return 0;}int print6(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else if (i>0 && i<6)printf("%c", 2);elseprintf("%c%4s%c", 2, " ", 2);}return 0;}int print7(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0) printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2); else printf("%5s%c", " ", 2);}return 0;}int print8(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else printf("%c%4s%c", 2, " ", 2);}return 0;}int print9(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2); else if (i>0 && i<6)printf("%c%4s%c", 2, " ", 2);elseprintf("%5s%c", " ", 2);}return 0;}int clear(Point p){int i = 0;for (; i<13; i++)gotoxy(p.x, p.y + i); printf("%16s", " ");return 0;}int printtime(Point p, int n){int a, b;Point pp;a = n / 10,b = n % 10;pp.x = p.x + 8, pp.y = p.y;switch (a){case 0: print0(p); break;case 1: print1(p); break;case 2: print2(p); break;case 3: print3(p); break;case 4: print4(p); break;case 5: print5(p); break;}switch (b){case 0: print0(pp); break;case 1: print1(pp); break;case 2: print2(pp); break;case 3: print3(pp); break;case 4: print4(pp); break;case 5: print5(pp); break;case 6: print6(pp); break;case 7: print7(pp); break;case 8: print8(pp); break;case 9: print9(pp); break;}return 0;}int main(){Point phour, pmin, psec, point1, point2;phour.x = 9, pmin.x = 32, psec.x = 55;phour.y = pmin.y = psec.y = 7;point1.x = 25, point2.x = 49;point1.y = point2.y = 7;clrscr();textbackground(YELLOW); /* 设置背景颜⾊*/ textcolor(RED); /* 设置数字显⽰颜⾊*/now = time(0);pt = localtime(&now);t1 = *pt;printtime(phour, t1.tm_hour);printpoint(point1);printtime(pmin, t1.tm_min);printpoint(point2);printtime(psec, t1.tm_sec);while (1){now = time(0);pt = localtime(&now);t2 = *pt;if (t2.tm_sec != t1.tm_sec){t1 = t2;clrscr();printtime(phour, t1.tm_hour);printpoint(point1);printtime(pmin, t1.tm_min);printpoint(point2);printtime(psec, t1.tm_sec);}if (bioskey(1) == 0) continue;else exit(0);}return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

单片机电子时钟完整程序

单片机电子时钟完整程序

/*2键手动奏乐,3键储存报警时间,报警时间到奏乐1键修改秒的时间,4键修改分的时间,8键修改小时12键启动定时器开始计数*/#include <reg52.h>#include <absacc.h>//#include "SST89x5x4.h"#define uint unsigned int#define uchar unsigned charuchar scounter=20;uchar flag=0;uchar i;#define a8255 XBYTE[0x7F00] //8255端口地址定义control 7-LED#define b8255 XBYTE[0x7F01] //send a~g#define c8255 XBYTE[0x7F02] //#define con8255 XBYTE[0x7F03]//unsigned char code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e}; //共阴数码管显示编码unsigned char code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};ucharsecond=0,second_h=0,second_l=0,minute=0,minute_l=0,minute_h=0,hour=0,hour_h=0,hour_l=0; bit dp=0;unsigned char key_down=0;unsigned char key_value=0;unsigned char key_count=0;/////////////////////////////////////////////////sbit POUT = P3^0; //扬声器控制引脚//sbit POUT = P0^0; //扬声器控制引脚#define Clk 0x070000unsigned char data val_H; //计数器高字节unsigned char data val_L; //计数器低字节unsigned char data music_i; //计数器低字节unsigned int val;uchar Save_Second=61,Save_Minute=61,Save_Hour=25,Save_Flag=0,music_flag=0;//频率表unsigned int code freq_list[] = {371,495,495,495,624,556,495,556,624,495,495,624,742,833,833,833,742,624,624,495,556,495,556,624,495,416,416,371,495,833,742,624,624,495,556,495,556,833,742,624,624,742,833,990,742,624,624,495,556,495,556,624,495,416,416,371,495,0};//时间表unsigned char code time_list[]= {4, 6, 2, 4, 4, 6, 2, 4, 4, 6,2, 4, 4,12, 1, 3, 6, 2, 4, 4,6, 2, 4, 4, 6, 2, 4, 4,12, 4,6, 2, 4, 4, 6, 2, 4, 4, 6, 2,4, 4,12, 4, 6, 2, 4, 4, 6, 2,4, 4, 6, 2, 4, 4,12};void initTimer1(){TMOD|=0X10;TH1 = val_H; //重新装入计数值TL1 = val_L;EA=1;ET1=1;TR1=1;}void stopmusic(){TMOD&=0X01;EA=1;ET1=0;TR1=0;music_i=0;}void Delay_Music(unsigned char cnt) //单位延时{unsigned char i;unsigned int j;for(i=0; i<cnt; i++){for(j=0; j<0x3600; j++);}}void music(){val = Clk/(freq_list[music_i]);val = 0xFFFF - val; //计算计数值val_H = (val>>8)&0xff;val_L = val&0xff;Delay_Music(time_list[music_i]);music_i++;if(music_i==58){music_i=0;music_flag=0;}}void t1_isr() interrupt 3 using 2 //定时器1中断处理程序{POUT = ~POUT; //产生方波TH1 = val_H; //重新装入计数值TL1 = val_L;}void SaveTimer(){Save_Second=second;Save_Minute=minute;Save_Hour=hour;}/////////////////////////////////////////////////void display_value(){b[1]=second/10;b[0]=second%10;b[3]=minute/10;b[2]=minute%10;b[5]=hour/10;b[4]=hour%10;}void delay(uint i,uint j,uint k){for(;i>0;i--)for(;j>0;j--)for(;k>0;k--);}void initTimer0()TMOD|=0X01;TH0=(65536-50000)/256; //timer 50ms TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void CloseTimer(){EA=0;ET0=0;TR0=0;}void timer0(void) interrupt 1 using 1{TH0=(65536-50000)/256; //timer 50ms TL0=(65536-50000)%256;scounter--;if(scounter==0){flag=1; //timer 1s scounter=20;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==12){hour=0;}}}}}void init8255(){con8255=0x81;c8255=0x0ff;////////////////////////////////////////////////void display() //显示函数{unsigned char i, j = 0xDF;display_value(); //get display valuefor(i=0; i<6; i++){a8255 = 0xFF;b8255 = table[b[i]]; //查表输出显示a8255 = j;delay(1,2,200);j = (j>>1)|(j<<7);}}//////////////////////////////////////////////void keyscan() //按键扫描函数{unsigned char cc;a8255 = 0x00; //X1~X4置0cc = c8255; //得到Y1~Y4的值key_down = (~cc) & 0x0f;}/////////////////////////////////////////////////void getkey() //得到按键值{unsigned char value;unsigned char i, j = 0xFE;for(i=0; i<4; i++){a8255 = j;value = c8255; //read 8255 c portif(!(value & 0x01)) //行1{key_value = i + 1;return;}if(!(value & 0x02)) //行2{key_value = i + 4;return;}if(!(value & 0x04)) //行3{key_value = i + 8;return;}if(!(value & 0x08)) //行4{key_value = i + 12;return;}j <<= 1;}}void main(){initTimer0();init8255();key_count = 5;while(1){display(); //显示keyscan(); //按键扫描if(key_down) //判是否有键按下{delay(1000,1000,2000);keyscan();if(key_down){getkey(); //得到按键值key_down=0;}}/////////////////////////////////////////////modify time value,include second/minute/hourif(key_value){if(key_value==1) //modify second {key_value=0;CloseTimer();second++;if(second==60) second=0;}else if(key_value==4) //modify minute {key_value=0;CloseTimer();minute++;if(minute==60) minute=0;}else if(key_value==8) //modify hour {key_value=0;CloseTimer();hour++;if(hour==24) hour=0;}else if(key_value==12) //start timer{key_value=0;initTimer0();Save_Flag=1;}else if(key_value==2) //save value{music_flag=1;key_value=0;}else if(key_value==3) //save value{SaveTimer();Save_Flag=0;music_flag=0;}}if(Save_Flag==1){if((Save_Hour==hour)&&(Save_Minute==minute)&&(Save_Second==second)) {Save_Flag=0;music_flag=1;}}////////////////////////////////////////////按键模拟报警音乐if(music_flag) //start Music{initTimer1();music();}else{stopmusic();POUT=0;}}}。

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

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按下以下。

基于单片机C语言电子时钟完整版(闹钟,整点报时)

基于单片机C语言电子时钟完整版(闹钟,整点报时)

《单片机技术》课程设计说明书数字电子钟系、部:电气与信息工程学院学生姓名:指导教师:职称专业:班级:完成时间:2013-06-07摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用ATMEL公司的AT89S52单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEU5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词电子钟;AT89S52;硬件设计;软件设计ABSTRACTClock is widely used in life, and a simple digital clock is more welcomed by people. So to design a simple digital electronic clock is necessary.The system use a single chip AT89S52 of ATMEL’s as its core to control The crystal oscillator clock,using of E-12MHZ is connected with the microcontroller AT89S52, through the software programming method to achieve a 24-hour cycle, and eight 7-segment LED digital tube (two four in one digital tube) displays hours, minutes and seconds requirements, and in the time course of a timing function, when the time arrived ahead of scheduled time to buzz a good timekeeping. The clock has four buttons KEY1, KEY2, KEY3,KEY4 and KEY5 key, and make the appropriate action can be achieved when the school, timing, reset. With a time display, alarm clock settings, timer function, corrective action. Accurate travel time, display and intuitive, precision, stability, and so on. With a high application value.Key words Electronic clock;;AT89S52;Hardware Design;Software Design目录1设计课题任务、功能要求说明及方案介绍 (1)1.1设计课题任务 (1)1.2功能要求说明 (1)1.3设计总体方案介绍及原理说明 (1)2设计课题硬件系统的设计 (2)2.1设计课题硬件系统各模块功能简要介绍 (2)2.2设计课题电路原理图、PCB图、元器件布局图 (2)2.3设计课题元器件清单 (5)3设计课题软件系统的设计 (6)3.1设计课题使用单片机资源的情况 (6)3.2设计课题软件系统各模块功能简要介绍 (6)3.3设计课题软件系统程序流程框图 (6)3.4设计课题软件系统程序清单 (10)4设计结论、仿真结果、误差分析、教学建议 (21)4.1设计课题的设计结论及使用说明 (21)4.2设计课题的仿真结果 (21)4.3设计课题的误差分析 (22)4.4设计体会 (22)4.5教学建议 (22)结束语 (23)参考文献 (24)致谢 (25)附录 (26)1 设计课题任务、功能要求说明及方案介绍1.1 设计课题任务设计一个具有特定功能的电子钟。

单片机c 语言编程时钟及闹钟程序

单片机c 语言编程时钟及闹钟程序

一·功能1、计时功能,数码管显示数值从00:00:00--23:59:59循环替换,且周期时间与实际时间吻合。

2、定时闹钟功能,按下“定时”键后,可以设定所需要的任意时间,定时完成后,当到达设定时间后,蜂鸣器发声。

3、调整时间功能,根据此项功能可将时钟调至正确的时间。

4、查看定时功能,当设定完成后可以查看上次定时的时间,且能在此基础上进行重新定时。

二·按键说明设定键:按一次开始设定时间,并将设定过程显示在数码管上。

若未按此键,则其他按键无效。

设定过程中,再按一次此键,定时结束,数码管显示返回时钟。

当第一次按下设定键时,显示值为00:00:00,在此基础上调节定时时间。

第一次设定完成后,以后再按设定键,显示初值则为上次定时的时间。

确定键:在定时过程中按下此键,则保留当前设定的时间为定时时间。

若定时过程未按此键,定时无效。

向上键:按下此键,使得当前设定值在现有数值上加一,当加至满位时,当前值变为零。

向下键:按下此键,使得当前设定值在现有数值上减一,当减至零时,当前值变为满位减一。

向左键:按下此键,使得设定值移向左边一位,若已经在最左边,则移至最右边。

向右键:按下此键,使得设定值移向右边一位,若已经在最右边,则移至最左边。

三·具体操作演示(一)·定时及查看定时演示1.仿真开始。

如图:2、按键如图:3、按下设定键,开始设定时间,如图:4、如图所示,当前设定时位。

按向上键,使数值加一。

5、按下向右键,设定位移至分位。

6、按下向下键,使数字减一。

7、按确定键,确定当前设定的时间。

再按设定键,退出定时,开始时钟显示。

8、设定完成后按设定键,显示前次设定值,可在此基础上重新设定,也可直接再按设定键推出。

9、当时钟运行到设定时间时,蜂鸣器发声。

(二)·调整时间演示1、计时开始。

2、按照定时的方法开始设定时间,使其显示20:10:09。

3、调整到正确时间后,按下确定键不放,同时再按一下设定键,将目前设定值送入时钟,使其开始从设定值计时。

51单片机电子时钟(C语言)

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); //等待按键放开}}。

单片机C语言 电子时钟程序[1]

单片机C语言   电子时钟程序[1]

单片机C语言电子时钟程序[1]单片机c语言-电子时钟程序[1]#include#defineuintunsignedint#defineucharunsignedcharunsignedcharkey2;bitding =1;unsignedchargetkey(void);uchara,n=0,shi,fen,miao;voiddelay01s(void);ucharled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};ucharled1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//存有小数点的voidinit();//函数声明voiddelay(unsignedcharz);//函数声明voiddisplay();//函数声明//函数声明voidmain()//函数声明{p1=0xfe;//对p1口赋初值init();//函数调用while(1){//函数调用key2=getkey();switch(key2){case1:shi++;if(shi==24){shi=0;}break;case2:fen++;if(fen==60){fen=0;}break;case3:if(fen!=0)fen--;if(fen==24){fen=0;}break;case4:ding=~ding;default:break;}display();//函数调用}}voidinit(){tmod=0x01;//定时器工作方式选择和赋初值th0=(65536-50000)/256;tl0=(65536-50000)%6;ea=1;//开总中断et0=1;//开定时器中断tr0=1;//启动定时器}voidtimer0()interrupt1//中断服务程序{if(ding==1){th0=(65536-50000)/256;//中断时间50mstl0=(65536-50000)%6;//定时器重新赋初值a++;if(a==10){n=~n;}if(a==20){n=~n;a=0;p1=p1<<1|p1>>7;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}}}}}}voiddisplay()//表明程序{p0=led[shi/10];p2=((p2&0x0f)|0x70);delay(4);if(n==0){p0=led[shi];}else{p0=led1[shi];}p2=((p2&0x0f)|0xb0);delay(4);p0=led[fen/10];p2=((p2&0x0f)|0xd0);delay(4);p0=led[fen];p2=((p2&0x0f)|0xe0);delay(4);}/**********获得键值子程序**********************/unsignedcharbool;//bool是否松键的标志unsignedchargetkey(void){unsignedchartemp,key=0;p2=(p2&0xff)|0x0f;if((p2&0xff)!=((p2&0xff)|0x0f))//有键按下{//delay01s();if(((p2&0xff)!=((p2&0xff)|0x0f))&&(bool==0))//有键按下{temp=~(p2|0xf0);if(temp==1)key=1;elseif(temp==2)key=2;elseif(temp==4)key=3;elseif(temp==8)key=4;bool=1;}}if(((p2&0xff)==((p2&0xff)|0x0f))&&(bool==1)){bool=0;}returnkey;//回到1~16键值}/********延时程序******/voiddelay01s(void){unsignedcharj,k;for(j=5;j>0;j--)//198{for(k=15;k>0;k--)//248{;}}}voiddelay(unsignedcharz){unsignedchari,j,k;for(i=z;i>0;i--)for(j=25;j>0;j--)for(k=20;k>0;k--);} //定义变量。

超级电子时钟程序(52单片机C语言)

超级电子时钟程序(52单片机C语言)

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcd_light=P1^0;sbit lcd_rs=P1^1;sbit lcd_rw=P1^2;sbit lcd_en=P1^3;sbit beep=P3^6;sbit DS18B20=P3^7;sbit SCLK=P3^3;sbit SDA=P3^4;sbit RST=P3^5;sbit SW1=P1^4;sbit SW2=P1^5;sbit SW3=P1^6;sbit SW4=P1^7;bitAMPM,music,light,clock_changing=1,clock1=1,clock2=1,clock3=1,forever1=1,forever2=1,forev er3=1,same=1,mode;uchar i,j,num,key,ring=1,timer,tian,light_continue,led,lsd1=0xfe;uchar code table1[]="20 / /";uchar code table2[]="Ring";uchar code table3[]="readyrunstopMode";uchar code table4[]="Good morning,sir";uchar code table5[]="Have a good day!";uchar write_add[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //年、星期、月、日、时、分、秒uchar read_add[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; //年、星期、月、日、时、分、秒uchar time[]={11,2,4,5,22,23,55}; //年、星期、月、日、时、分、秒uchar clock_time1[]={11,2,4,5,22,23,38}; //年、星期、月、日、时、分、秒uchar clock_time2[]={11,2,4,5,22,23,38}; //年、星期、月、日、时、分、秒uchar clock_time3[]={11,2,4,5,22,23,38}; //年、星期、月、日、时、分、秒uchar s,f,m,dian; //时、分、秒、小数点uchar *ptime[7]; //年、星期、月、日、时、分、秒void delay1(){;;}void delay2(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void di(){if(music==0){beep=0;delay2(50);beep=1;}}void running_led1(){P2=lsd1;}void running_led2(){switch(num){case 1:P2=0x00;break;case 25:P2=0xc0;break;case 27:P2=0x60;break;case 29:P2=0x30;break;case 31:P2=0x18;break;case 33:P2=0x0c;break;case 35:P2=0x06;break;case 37:P2=0x03;break;}}void running_led3(){switch(num){case 1:P2=0x7e;break;case 2:P2=0xbd;break;case 3:P2=0xdb;break;case 4:P2=0xe7;if(same==0){if(music==0)di();else{music=0;di();music=1;}} break;case 5:P2=0xe7;if(same==0){if(music==0)di();else{music=0;di();music=1;}} break;case 6:P2=0xdb;break;case 7:P2=0xbd;break;}}uchar how_many_days(uchar year,uchar month){uchar tian;if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==1 2))tian=31;else if(month==2){if(((year+2000)%4==0)&&((year+2000)%100!=0)||((year+2000)%400==0))tian=29;elsetian=28;}elsetian=30;return(tian);}void week_scan(){uchar year,month=1,day=1,week,tian;if(*ptime[0]<10){year=0;week=6;}else if((*ptime[0]>=10)&&(*ptime[0]<20)){year=10;week=5;}else if((*ptime[0]>=20)&&(*ptime[0]<30)){year=20;week=3;}else if((*ptime[0]>=30)&&(*ptime[0]<40)){year=30;week=2;}else if((*ptime[0]>=40)&&(*ptime[0]<50)){year=40;week=7;}else if((*ptime[0]>=50)&&(*ptime[0]<60)){year=50;week=6;}else if((*ptime[0]>=60)&&(*ptime[0]<70)){year=60;week=4;}else if((*ptime[0]>=70)&&(*ptime[0]<80)){year=70;week=3;}else if((*ptime[0]>=80)&&(*ptime[0]<90)){year=80;week=1;}else if(*ptime[0]>=90){year=90;week=7;}while((*ptime[0]!=year)||(*ptime[2]!=month)||(*ptime[3]!=day)) {day++;week++;if(week>=8)week=1;tian=how_many_days(year,month);if(day>tian){day=1;month++;if(month>12){month=1;year++;}}}*ptime[1]=week;}//液晶写命令写数据程序void write_com(uchar com){lcd_rs=0;delay2(1);P0=com;lcd_en=1;delay2(1);lcd_en=0;}void write_dat(uchar dat){lcd_rs=1;delay2(1);P0=dat;lcd_en=1;delay2(1);lcd_en=0;}void init_lcd1602(){uchar i;lcd_rw=0;lcd_en=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80+1);for(i=0;i<8;i++)write_dat(table1[i]);write_com(0x80+0x40+3);write_dat(':');write_com(0x80+0x40+6);write_dat(':'); }//DS1302读写程序void write_DS1302_byte(uchar dat) {uchar i;for(i=0;i<8;i++){SCLK=0;SDA=dat&0x01;SCLK=1;dat=dat>>1;}}void write_DS1302(uchar add,uchar dat) {RST=0;SCLK=0;RST=1;delay1();write_DS1302_byte(add);write_DS1302_byte(dat);RST=0;delay1();RST=1;SCLK=1;}uchar read_DS1302(uchar add){uchar i,dat;RST=0;SCLK=0;delay1();RST=1;delay1();write_DS1302_byte(add);for(i=0;i<8;i++){dat=dat>>1;SCLK=0;if(SDA)dat=dat|0x80;SCLK=1;}RST=0;delay1();RST=1;SCLK=1;return(dat);}void dat_to_BCD(){uchar i,j;for(i=0;i<7;i++){j=time[i]/10;time[i]=time[i]%10;time[i]=time[i]+j*16;}}void BCD_to_dat(){uchar i,j;for(i=0;i<7;i++){j=time[i]/16;time[i]=time[i]%16;time[i]=time[i]+j*10;}}void set_time_to_DS1302(){uchar i;dat_to_BCD();write_DS1302(0x8e,0x00);for(i=0;i<7;i++)write_DS1302(write_add[i],time[i]);write_DS1302(0x8e,0x80);}void get_time_from_Ds1302(){uchar i;for(i=0;i<7;i++)time[i]=read_DS1302(read_add[i]);BCD_to_dat();}void write_nyr(uchar add,uchar dat){uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+add);write_dat(0x30+shi);write_dat(0x30+ge);}void write_sfm(uchar add,uchar dat){uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+0x40+add);write_dat(0x30+shi);write_dat(0x30+ge);}void write_week(){write_com(0x80+13);switch(*ptime[1]){case 1:write_dat('M');write_dat('O');write_dat('N');break;case 2:write_dat('T');write_dat('U');write_dat('E');break;case 3:write_dat('W');write_dat('E');write_dat('D');break;case 4:write_dat('T');write_dat('H');write_dat('U');break;case 5:write_dat('F');write_dat('R');write_dat('I');break;case 6:write_dat('S');write_dat('A');write_dat('T');break;case 7:write_dat('S');write_dat('U');write_dat('N');break;}}//DS18B20读写程序void init_DS18B20(){uint i;DS18B20=1;delay1();DS18B20=0;for(i=0;i<70;i++);//延时563微秒DS18B20=1;for(i=0;i<60;i++);//延时483微秒}bit read_temp_byte(){uint i;bit dat;DS18B20=1;delay1();DS18B20=0;delay1();DS18B20=1;delay1();dat=DS18B20;for(i=0;i<4;i++);//延时35微秒return(dat);}uchar read_temp(){uchar i,j,dat;for(i=0;i<8;i++){j=read_temp_byte();dat=(j<<7)|(dat>>1);}return(dat);}void write_DS18B20(uchar dat){uint i;uchar j;bit byte;for(j=0;j<8;j++){byte=dat&0x01;dat=dat>>1;if(byte){DS18B20=0;i++;i++;i++;i++;//延时16微秒DS18B20=1;for(i=0;i<5;i++);//延时43微秒}else{DS18B20=0;for(i=0;i<7;i++);//延时59微秒DS18B20=1;}}}void temp_change(){init_DS18B20();delay2(1);write_DS18B20(0xcc);//写跳过读ROM指令write_DS18B20(0x44);//写温度转换指令}uint get_temp(){uchar a,b;uint temp;//注意要是无符号整形变量8位float f_temp;init_DS18B20();delay2(1);write_DS18B20(0xcc);write_DS18B20(0xbe);a=read_temp();b=read_temp();temp=b;temp=temp<<8;temp=temp|a;f_temp=temp*0.0625;temp=f_temp*10+0.5;return(temp);}//显示程序void display_temp(){uchar shi,ge,dian;uint t;//注意要是无符号整形变量8位temp_change();t=get_temp();shi=t/100;ge=t%100/10;dian=t%100%10;write_com(0x80+0x40+11);write_dat(0x30+shi);write_dat(0x30+ge);write_dat('.');write_dat(0x30+dian);write_dat('C');}void renew_nyr(){write_nyr(3,*ptime[0]);write_week();write_nyr(6,*ptime[2]);write_nyr(9,*ptime[3]);}void write_xiaoshi(){write_com(0x80+0x40);if(AMPM==0){write_dat(' ');write_sfm(1,*ptime[4]);}else{if(*ptime[4]>=12){write_dat('P');if(*ptime[4]==12)write_sfm(1,12);elsewrite_sfm(1,*ptime[4]-12);}else{write_dat('A');write_sfm(1,*ptime[4]);}}}void renew_sfm(){write_xiaoshi();write_sfm(4,*ptime[5]);write_sfm(7,*ptime[6]);}void renew_time(){renew_nyr();renew_sfm();}void Is_it_time_to_ring(){if(clock1==0){for(i=0;((time[i]==clock_time1[i])&&(i<7));i++);if(i>=7){same=0;led=2;if(forever1==1)clock1=1;else{clock_time1[3]=clock_time1[3]+1;clock_time1[1]=clock_time1[1]+1;if(clock_time1[1]>=8)clock_time1[1]=1;tian=how_many_days(clock_time1[0],clock_time1[2]);if(clock_time1[3]>tian){clock_time1[3]=1;clock_time1[2]=clock_time1[2]+1;if(clock_time1[2]>12){clock_time1[2]=1;clock_time1[0]=clock_time1[0]+1;if(clock_time1[0]==100)clock_time1[0]=0;}}}write_com(0x80+0x40+11);for(i=0;i<4;i++)write_dat(table2[i]);write_dat('1');}}if(clock2==0){for(i=0;((time[i]==clock_time2[i])&&(i<7));i++);if(i>=7){same=0;led=2;if(forever2==1)clock2=1;else{clock_time2[3]=clock_time2[3]+1;clock_time2[1]=clock_time2[1]+1;if(clock_time2[1]>=8)clock_time2[1]=1;tian=how_many_days(clock_time2[0],clock_time2[2]);if(clock_time2[3]>tian){clock_time2[3]=1;clock_time2[2]=clock_time2[2]+1;if(clock_time2[2]>12){clock_time2[2]=1;clock_time2[0]=clock_time2[0]+1;if(clock_time2[0]==100)clock_time2[0]=0;}}}write_com(0x80+0x40+11);for(i=0;i<4;i++)write_dat(table2[i]);write_dat('2');}}if(clock3==0){for(i=0;((time[i]==clock_time3[i])&&(i<7));i++);if(i>=7){same=0;led=2;if(forever3==1)clock3=1;else{clock_time3[3]=clock_time3[3]+1;clock_time3[1]=clock_time3[1]+1;if(clock_time3[1]>=8)clock_time3[1]=1;tian=how_many_days(clock_time3[0],clock_time3[2]);if(clock_time3[3]>tian){clock_time3[3]=1;clock_time3[2]=clock_time3[2]+1;if(clock_time3[2]>12){clock_time3[2]=1;clock_time3[0]=clock_time3[0]+1;if(clock_time3[0]==100)clock_time3[0]=0;}}}write_com(0x80+0x40+11);for(i=0;i<4;i++)write_dat(table2[i]);write_dat('3');}}}void display_time(){if((led!=3)||(light==0)){if((led==0)||((light==0)&&(lcd_light==0))||(clock1==0)||(clock2==0)||(clock3==0)){i=time[6];get_time_from_Ds1302();if(i!=time[6]){if(led==0)lsd1=_cror_(lsd1,1);if((light==0)&&(lcd_light==0)){light_continue++;if(light_continue==5)lcd_light=1;}j++;if(j>=6)j=1;}}switch(led){case 1:num++;if(num>=38)num=1; break;case 2:num++;if(num>=8)num=1; break;}}get_time_from_Ds1302();for(i=0;i<7;i++)ptime[i]=&time[i];if(same==1)renew_time();else delay2(60);}//键盘扫描程序void SW1_scan(){if(SW1==0){if((key==0)&&(clock_changing==1)){delay2(300);if(SW1!=0){di();AMPM=~AMPM;display_time();}elsedelay2(700);}elsedelay2(20);if(SW1==0){di();key++;if(clock_changing==0){switch(ring){case 1:clock1=1;break;case 2:clock2=1;break;case 3:clock3=1;break;}}while(!SW1);}}}void SW4_scan(){uchar i;if(SW4==0){if((key==0)||(clock_changing==0)){delay2(300);if(SW4!=0){di();switch(ring){case 1: for(i=0;i<7;i++)ptime[i]=&clock_time1[i];break;case 2: for(i=0;i<7;i++)ptime[i]=&clock_time2[i];break;case 3: for(i=0;i<7;i++)ptime[i]=&clock_time3[i];break;}clock_changing=~clock_changing;if(clock_changing==0){renew_time();write_com(0x80+0x40+11);for(i=0;i<4;i++)write_dat(table2[i]);switch(ring){case 1: write_dat('1');case 2: write_dat('2');case 3: write_dat('3');}}else{switch(ring){case 1:clock1=~clock1;if(key==0)forever1=1;break;case 2:clock2=~clock2;if(key==0)forever2=1;break;case 3:clock3=~clock3;if(key==0)forever3=1;break;}if((forever1==1)&&(forever2==1)&&(forever3==1)){write_com(0x80);write_dat(' ');}key=0;}}else{delay2(700);if(SW4==0){if(clock_changing==0){di();key=0;clock_changing=1;write_com(0x01);write_com(0x80);for(i=0;i<16;i++)write_dat(table4[i]);write_com(0x80+0x40);for(i=0;i<16;i++)write_dat(table5[i]);switch(ring){case 1:clock1=0;forever1=0;break;case 2:clock2=0;forever2=0;break;case 3:clock3=0;forever3=0;break;}while(!SW4);init_lcd1602();}else{music=~music;di();write_com(0x80+0x40+11);write_dat(' ');write_dat(' ');write_dat('O');if(music==0){write_dat('N');write_dat(' ');}else{write_dat('F');write_dat('F');}}while(!SW4);}}}if(key!=0){ delay2(20);if(SW4==0){di();key=0;write_com(0x0c);set_time_to_DS1302();display_time();while(!SW4);}}}}void renew_timer_time(){write_sfm(0,s);write_sfm(3,f);write_sfm(6,m);write_sfm(9,dian);}void choose_rings(){uchar i;switch(ring){case 1: for(i=0;i<7;i++)ptime[i]=&clock_time1[i];break;case 2: for(i=0;i<7;i++)ptime[i]=&clock_time2[i];break;case 3: for(i=0;i<7;i++)ptime[i]=&clock_time3[i];break;}renew_time();write_com(0x80+0x40+15);switch(ring){case 1: write_dat('1');case 2: write_dat('2');case 3: write_dat('3');}}void timer_and_led(){uchar i;if(timer==0){delay2(300);if(SW2){di();num=0;led++;if(led==3)P2=0xff;if(led>=4)led=0;}else{delay2(700);if(SW2==0){di();timer++;s=f=m=dian=0;mode=0;write_com(0x01);write_com(0x80);for(i=12;i<16;i++)write_dat(table3[i]);write_dat(':');write_dat('1');write_com(0x80+0x40+2);write_dat(':');write_com(0x80+0x40+5);write_dat(':');write_com(0x80+0x40+8);write_dat('.');write_com(0x80+0x40+11);for(i=0;i<5;i++)write_dat(table3[i]);renew_timer_time();while(!SW2);delay2(10);while(!SW2);}}}else{timer++;if(timer==2){di();write_com(0x80+0x40+11);write_dat(' ');write_dat(' ');for(i=5;i<8;i++)write_dat(table3[i]);while(!SW2);TR0=1;delay2(10);while(!SW2);}if(timer==3){TR0=0;di();if(mode==1)timer=1;write_com(0x80+0x40+11);write_dat(' ');for(i=8;i<12;i++)write_dat(table3[i]);while(!SW2);delay2(10);while(!SW2);}if(timer>=4){i=255;di();while((!SW2)&&(i>0)){i--;delay2(5);}if(i==0){di();timer=0;write_com(0x01);init_lcd1602();display_time();display_temp();while(!SW2);}else{timer=1;s=f=m=dian=0;renew_timer_time();write_com(0x80+0x40+11);for(i=0;i<5;i++)write_dat(table3[i]);}}}}void change_timer(){if(SW4==0){TR0=0;di();mode=~mode;write_com(0x80+5);if(mode==0)write_dat('1');else write_dat('2');timer=1;s=f=m=dian=0;renew_timer_time();write_com(0x80+0x40+11);for(i=0;i<5;i++)write_dat(table3[i]);while(!SW4);delay2(10);while(!SW4);}}void SW2_scan(){if(SW2==0){if(key==0){if(clock_changing==1)timer_and_led();else{delay2(20);if(SW2==0){di();ring++;if(ring>=4)ring=1;choose_rings();}while(!SW2);}}else{delay2(20);if(SW2==0){di();switch(key){case 1: *ptime[0]=*ptime[0]+10;if(*ptime[0]>99)*ptime[0]=0;write_nyr(3,*ptime[0]);if(*ptime[2]==2){tian=how_many_days(*ptime[0],*ptime[2]);if(*ptime[3]>tian){*ptime[3]=tian;write_nyr(9,*ptime[3]);}}week_scan();write_week(); break;case 2: *ptime[0]=*ptime[0]+1;if(*ptime[0]>99)*ptime[0]=0;write_nyr(3,*ptime[0]);if(*ptime[2]==2){tian=how_many_days(*ptime[0],*ptime[2]);if(*ptime[3]>tian){*ptime[3]=tian;write_nyr(9,*ptime[3]);}}week_scan();write_week(); break;case 3: *ptime[2]=*ptime[2]+10;if(*ptime[2]>12)*ptime[2]=1;write_nyr(6,*ptime[2]);week_scan();write_week(); break;case 4: *ptime[2]=*ptime[2]+1;if(*ptime[2]>12)*ptime[2]=1;write_nyr(6,*ptime[2]);if(*ptime[2]==2){tian=how_many_days(*ptime[0],*ptime[2]);if(*ptime[3]>tian){*ptime[3]=tian;write_nyr(9,*ptime[3]);}}week_scan();write_week(); break;case 5: *ptime[3]=*ptime[3]+10;tian=how_many_days(*ptime[0],*ptime[2]);if(*ptime[3]>tian)*ptime[3]=1;write_nyr(9,*ptime[3]);week_scan();write_week(); break;case 6: *ptime[3]=*ptime[3]+1;tian=how_many_days(*ptime[0],*ptime[2]);if(*ptime[3]>tian)*ptime[3]=1;write_nyr(9,*ptime[3]);week_scan();write_week(); break;case 7: *ptime[4]=*ptime[4]+10;if(*ptime[4]>=24)*ptime[4]=0;write_xiaoshi(); break;case 8: *ptime[4]=*ptime[4]+1;if(*ptime[4]>=24)*ptime[4]=0;write_xiaoshi(); break;case 9: *ptime[5]=*ptime[5]+10;if(*ptime[5]>=60)*ptime[5]=0;write_sfm(4,*ptime[5]); break;case 10:*ptime[5]=*ptime[5]+1;if(*ptime[5]>=60)*ptime[5]=0;write_sfm(4,*ptime[5]); break;case 11:*ptime[6]=*ptime[6]+10;if(*ptime[6]>=60)*ptime[6]=0;write_sfm(7,*ptime[6]); break;case 12:*ptime[6]=*ptime[6]+1;if(*ptime[6]>=60)*ptime[6]=0;write_sfm(7,*ptime[6]); break;}while(!SW2);}}}}void normal_or_save(){delay2(300);if(SW3){di();lcd_light=0;light_continue=0;}else{delay2(700);if(SW3==0){di();light=~light;if(light==0)lcd_light=1;elselcd_light=0;while(!SW3);}}}void SW3_scan(){if(SW3==0){if(key==0){if(clock_changing==1)normal_or_save();else{delay2(20);if(SW3==0){di();if(ring==1)ring=3;else ring--;choose_rings();}while(!SW3);}}else{delay2(20);if(SW3==0){di();switch(key){case 1: if(*ptime[0]>=10)*ptime[0]=*ptime[0]-10;else*ptime[0]=99;write_nyr(3,*ptime[0]);if(*ptime[2]==2){tian=how_many_days(*ptime[0],*ptime[2]);if(*ptime[3]>tian){*ptime[3]=tian;write_nyr(9,*ptime[3]);}}week_scan();write_week(); break;case 2: if(*ptime[0]>=1)*ptime[0]=*ptime[0]-1;else*ptime[0]=99;write_nyr(3,*ptime[0]);if(*ptime[2]==2){tian=how_many_days(*ptime[0],*ptime[2]);if(*ptime[3]>tian){*ptime[3]=tian;write_nyr(9,*ptime[3]);}}week_scan();write_week(); break;case 3: if(*ptime[2]>=11)*ptime[2]=*ptime[2]-10;else*ptime[2]=12;write_nyr(6,*ptime[2]);if(*ptime[2]==2){tian=how_many_days(*ptime[0],*ptime[2]);if(*ptime[3]>tian){*ptime[3]=tian;write_nyr(9,*ptime[3]);}}week_scan();write_week(); break;case 4: if(*ptime[2]>=2)*ptime[2]=*ptime[2]-1;else*ptime[2]=12;write_nyr(6,*ptime[2]);if(*ptime[2]==2){tian=how_many_days(*ptime[0],*ptime[2]);if(*ptime[3]>tian){*ptime[3]=tian;write_nyr(9,*ptime[3]);}}week_scan();write_week(); break;case 5: if(*ptime[3]>=11)*ptime[3]=*ptime[3]-10;else{tian=how_many_days(*ptime[0],*ptime[2]);*ptime[3]=tian;}write_nyr(9,*ptime[3]);week_scan();write_week(); break;case 6: if(*ptime[3]>=2)*ptime[3]=*ptime[3]-1;else{tian=how_many_days(*ptime[0],*ptime[2]);*ptime[3]=tian;}write_nyr(9,*ptime[3]);week_scan();write_week(); break;case 7: if(*ptime[4]>=10)*ptime[4]=*ptime[4]-10;else*ptime[4]=23;write_xiaoshi(); break;case 8: if(*ptime[4]>=1)*ptime[4]=*ptime[4]-1;else*ptime[4]=23;write_xiaoshi(); break;case 9: if(*ptime[5]>=10)*ptime[5]=*ptime[5]-10;else*ptime[5]=59;write_sfm(4,*ptime[5]); break;case 10:if(*ptime[5]>=1)*ptime[5]=*ptime[5]-1;else*ptime[5]=59;write_sfm(4,*ptime[5]); break;case 11:if(*ptime[6]>=10)*ptime[6]=*ptime[6]-10;else*ptime[6]=59;write_sfm(7,*ptime[6]); break;case 12:if(*ptime[6]>=1)*ptime[6]=*ptime[6]-1;else*ptime[6]=59;write_sfm(7,*ptime[6]); break;}while(!SW3);}}}}void keyscan(){if(same==1){if(timer==0){SW1_scan();SW4_scan();if(key!=0){switch(key){case 1: write_com(0x80+3);write_com(0x0f); break;case 2: write_com(0x80+4); break;case 3: write_com(0x80+6); break;case 4: write_com(0x80+7); break;case 5: write_com(0x80+9); break;case 6: write_com(0x80+10); break;case 7: write_com(0x80+0x40+1); break;case 8: write_com(0x80+0x40+2); break;case 9: write_com(0x80+0x40+4); break;case 10:write_com(0x80+0x40+5); break;case 11:write_com(0x80+0x40+7); break;case 12:write_com(0x80+0x40+8); break;case 13:if(clock_changing==1){key=0;write_com(0x0c);set_time_to_DS1302();display_time();}else key=1; break;}}}SW2_scan();SW3_scan();if(timer!=0)change_timer();}else{if((SW1==0)||(SW2==0)||(SW3==0)||(SW4==0)){delay2(20);if((SW1==0)||(SW2==0)||(SW3==0)||(SW4==0)){same=1;led=0;while((!SW1)||(!SW2)||(!SW3)||(!SW4));}}}}void main(){init_lcd1602();TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;//set_time_to_DS1302();while(1){keyscan();if((key==0)&&(clock_changing==1)&&(timer==0)){display_time();if(same==1){write_com(0x80+0x40+11);if((clock1==1)&&(clock2==1)&&(clock3==1))display_temp();else{switch(j){case 1: if(clock1==0){if(forever1==0){write_com(0x80);write_dat('*');}write_com(0x80+0x40+11);for(i=0;i<4;i++)write_dat(table2[i]);write_dat('1');}else{write_com(0x80);write_dat(' ');display_temp();} break;case 2: if(clock2==0){if(forever2==0){write_com(0x80);write_dat('*');}write_com(0x80+0x40+11);for(i=0;i<4;i++)write_dat(table2[i]);write_dat('2');}else{write_com(0x80);write_dat(' ');display_temp();} break;case 3: if(clock3==0){if(forever3==0){write_com(0x80);write_dat('*');}write_com(0x80+0x40+11);for(i=0;i<4;i++)write_dat(table2[i]);write_dat('3');}else{write_com(0x80);write_dat(' ');display_temp();} break;case 4: write_com(0x80);write_dat(' ');display_temp();break;case 5: display_temp();break;}}Is_it_time_to_ring();}if(led!=3){switch(led){case 0:running_led1();break;case 1:running_led2();break;case 2:running_led3();break;}}}}}void T0_timer() interrupt 1//中断函数{TR0=0;TH0=(65536-10000)/256;TL0=(65536-10000)%256;TR0=1;dian++;if(dian>=100){dian=0;m++;if(m>=60){m=0;f++;if(f>=60){f=0;s++;if(s>=24)TR0=0;write_sfm(0,s);}write_sfm(3,f);}write_sfm(6,m);}write_sfm(9,dian);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Display(hour_switch | minute_switch | second_switch | ON_BAR);//显示时分秒和分隔符
ClockBeep(); //整点报时
}
ห้องสมุดไป่ตู้ }
}
void Init(void)
TL0 = (65536 - INTERRUPT_TIME * 1000) % 256;
ET0 = 1; //允许定时器0开启
EA = 1; //全局中断开启
//位选码,控制位选
//如若总线直连更为简单,使用译码器节约接口
unsigned char code bit_select[]={0xe3,0xe7,0xeb,0xef,0xf3,0xf7,0xfb,0xff};
//段选码,8位共阴极数码管的段选都连到P0口
//各个数码管为并联关系
unsigned char code segment_select[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
P0 = segment_select[CLEAR]; //清空数码管段选
TR0 = 0; //停止定时器0
reset = 0; //初始化各个变量
unsigned int time_count;//中断中的计数器
unsigned int beep_time = 0; //定义蜂鸣器时间变量
bit reset, start, beep_flag;//复位、开始、蜂鸣器的标志位
//初始化函数
void Init(void);
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};//0~F,清空,最后一位为分隔符
unsigned char hour_switch, minute_switch, second_switch;//小时、分钟、秒的显示开关
unsigned char hour[2], minute[2], second[2];//小时、分钟、秒的数组
//设定新值函数
void SetNewValue(void);
//键盘扫描函数
unsigned char KeyboardScan(void);
//显示函数
void Display(unsigned char control_byte);
//值修正函数,用于修正非法输入
void ReviseValue(unsigned char control_byte);
start = 1;
TR0 = 1; //开定时中断
}
//扫描矩阵键盘
unsigned char KeyboardScan(void)
{
unsigned char return_val = NULL_KEY;
unsigned char temp;
for(i = 0; (i < 2) && (start == 0);)
{
temp = KeyboardScan();
if(temp == START_KEY)//按下的是开始键
{
start = 1;
//进位函数
void CarryValue(void);
//整点报时函数
void ClockBeep(void);
//简易延时函数
void DelayXms(unsigned int x);
void main(void)
{
unsigned char temp_key = 0;//定义临时变量
for(i = 0; (i < 2) && (start == 0);) //如果有按开始直接退出按键扫描
{
temp = KeyboardScan();
if(temp == START_KEY)
{
start = 1;
#define BAR 17 //分隔符代码的数组坐标
#define INTERRUPT_TIME 10 //每次中断时间,单位毫秒
#define BEEP_DURA 200 //蜂鸣器响时长,单位毫秒
sbit beep = P1^5; //定义蜂鸣器控制
++i;
}
Display(hour_switch | minute_switch | second_switch);
}
ReviseValue(REVISE_HOUR | REVISE_MINU); //修正小时和分钟
void SetNewValue(void)
{
unsigned char temp, i;
temp = i = 0;
hour_switch = HOUR_DIS;//开启小时显示
minute_switch = MINU_DIS;//开启分钟显示
second_switch = SECO_DIS;//开启秒显示
//如果蜂鸣器响则不接收按键,原因是扫描键盘和蜂鸣器有冲突
//如若蜂鸣器与键盘不是同一IO口,可忽略此句
if(!beep && start)
return return_val;
}
else if(temp == RESET_KEY)//按下的是复位键
{
reset = 1;
}
else if(temp != NULL_KEY)//按下的是数字键
{
start = 0;
time_count = 0;
beep = 1; //beep置1为蜂鸣器不响
beep_flag = 0;
hour_switch = minute_switch = second_switch = OFF_DIS;//清空数码管位选
#define ON_BAR 0x24 //分隔符显示控制码
#define OFF_DIS 0x00 //关闭数码管显示
#define START_KEY 11 //开始键代码
#define RESET_KEY 12 //复位键代码
#define NULL_KEY 13 //空按键代码
else if(temp == RESET_KEY)
{
reset = 1;
}
else if(temp != NULL_KEY)
{
second[i] = temp;
{
int i = 0;
TMOD = 0x01; //设定定时器模式为定时器0模式1
TH0 = (65536 - INTERRUPT_TIME * 1000) / 256; //计10k个数,为10ms
if(temp_key == RESET_KEY) //如果按键是复位
{
reset = 1;
}
CarryValue(); //进位
for(i = 0; i < 2; ++i) //初始化时间数组
{
hour[i] = BAR;
minute[i] = BAR;
second[i] = BAR;
}
}
*/
#include <reg52.h>
#include <intrins.h>
#define HOUR_DIS 0xC0 //小时显示控制码
#define MINU_DIS 0x18 //分钟显示控制码
#define SECO_DIS 0x03 //秒显示控制码
/*
作者:twtyypmb123
转载请注明出处,谢谢
数码管时钟,整点响铃
24小时制,8位数码管显示格式为HH-MM-SS
本程序使用普中HC6800 V3.0开发板,其他板子大同小异
P0口接8为数码管的段选
P1口接3*4矩阵键盘P1^0为空,只是用了前7个引脚
P2口的2、3、4引脚通过138译码器连接数码管的电源端
while(1)
{
Init(); //初始化
SetNewValue(); //设定一个新时间
while(reset == 0) //检查复位标志
{
temp_key = KeyboardScan(); //接收按键
}
else if(temp == RESET_KEY)
{
reset = 1;
}
else if(temp != NULL_KEY)
{
minute[i] = temp;
for(i = 0; (i < 2) && (start == 0);)
{
temp = KeyboardScan();
if(temp == START_KEY)
{
start = 1;
}
#define REVISE_HOUR 0x04 //修正小时代码
#define REVISE_MINU 0X02 //修正分钟代码
#define REVISE_SECO 0X01 //修正秒代码
#define CLEAR 16 //清除数码管段选代码的数组坐标
hour[i] = temp;
++i;
}
Display(hour_switch | minute_switch | second_switch);//显示时分秒
}
ReviseValue(REVISE_HOUR); //修正小时
相关文档
最新文档