51 数字时钟 89C52 单片机C语言程序
基于51系列AT89C52单片机课程设计-电子时钟

目录第一章﹑设计背景 (2)第二章﹑设计方案 (4)2.1. 设计内容 (4)第三章﹑电子时钟 (5)3.1.电子时钟简介 (5)3.2.电子时钟的基本特点 (5)3.3.电子时钟的原理 (5)第四章﹑AT89C52简介 (6)第五章﹑系统软件程序设计 (10)5.1.主程序 (10)5.2.数码管显示模块 (10)5.3.定时器/计数器T0中断服务程序 (10)5. 4.按键处理模块 (11)5.5.汇编语言程序 (13)第六章﹑系统硬件电路的设计 (18)第七章﹑课程设计总结 (21)参考文献 (22)附录 (23)摘要设计背景:1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。
数字电子钟一般由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路等组成。
秒信号是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。
将秒信号送入秒计数器,它是六十进制计数器。
每累计六十秒发出一个“分脉冲”信号,这个信号作为“分计数器”的时钟脉冲。
“分计数器”也是六十进制计数器,它每累计六十分钟,发出一个“时脉冲”信号,此信号将被送到“时计数器”。
“时计数器”采用二十四进制计数器,可以实现一天二十四小时的累计。
译码显示电路将“时”、“分”、“秒”计数器的输出状态经七段显示译码器译码,通过六位LED显示器显示出来。
校时电路是用来对“时”、“分”、“秒”显示数字进行校对调整的。
在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力这里采用应用广泛的AT89C52作为时钟控制芯片,利用单片机内部的定时/计数器T0 实现软时钟的目的。
首先将T0设定工作于定时方式,对机器周期计数形成基准时间(50ms),然后用另一个定时/计数器T1对基准时间计数形成秒,妙计60次形成分,分计60形成小时,小时计到12。
89C51时钟设计 程序

实时时钟实验 #include <REG51.H> #define uchar unsigned char #define uint unsigned int uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f}; uchar code WEEK_SEG7[8]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x 7f,}; uchar ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar deda,sec,min,hour,week=1; uchar cnt; /*****************************************************/
CS18-3 简易万年历实例 #include <REG51.H> #define uchar unsigned char uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code WEEK_SEG7[8]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,}; uchar ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar deda,sec,min,hour,week=1; uchar cnt; /*************************************************/ void init(void) { TMOD=0x11; TH0=-(50000/256); TL0=-(50000%256); ET0=1; TR0=1; TH1=-(1000/256); TL1=-(1000%256); ET1=1; TR1=1; EA=1; }
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设置闹铃时间。
数字时钟_89C52_单片机C语言程序

uchar MON[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
uchar A;
uchar BIN=0; /* 【BIN】作为倒计时开始的标志 */
TH0 = (65536 - 10000) / 256; /*给定计时器高位赋予 初值=15536/256*/
TL0 = (65536 - 10000) % 256; /*给定计时器低位赋予 初值=15536%256 */
ET0 = 1; /*打开定时器外部终断0允许 ET1是中断器1的开关*/
P2 = C[4];
Delay(1);
P0 = Code[Msec%10]; /*第五位的数字显示【分】的【个】位 */
P2 = C[5];
Delay(1);
Delay(1);
P0 = 0x40; /*第六位符号【-】的显示 */
P2 = C[6];
Delay(1);
P2 = C[2];
Delay(1);
if(x/50==0)
P0 = 0x40; /*第三位符号【-】的显示 */
else
P0 = 0x00;
P2 = C[3];
Delay(1);
P0 = Code[min/10]; /*第四位的数字的显示【分】的【十】位 */
uchar month=7;
uchar month2;
uchar day=19;
uchar set1 = 1; /* set1=1 是调节 时分秒 set1=2时时调节 年月日 set=3时事调节闹钟 */
AT8951单片机带闹钟数字时钟 C语言编程

{
delay(10);
//延时去抖
if(K2==0)
//加键按下
{
if(hour<23) hour++;
else hour=0;
}
while(!K2);
//等待按键释放
}
if(K3==0) {
delay(10); if(K3==0) {
if(hour> 0) hour--; else hour=23; } while(!K3); } } break;
}break; case 1:
{ if(S_flag==1) { a[0]=led[hour/10]; a[1]=led[hour%10]; } else {
a[0]=led[11]; a[1]=led[11]; } a[2]=led[10]; a[3]=led[minute/10]; a[4]=led[minute%10]; a[5]=led[10]; a[6]=led[second/10]; a[7]=led[second%10]; }break; case 2: { a[0]=led[hour/10]; a[1]=led[hour%10]; a[2]=led[10]; if(S_flag==1) { a[3]=led[minute/10]; a[4]=led[minute%10]; } else { a[3]=led[11]; a[4]=led[11]; } a[5]=led[10]; a[6]=led[second/10]; a[7]=led[second%10]; }break; case 3: { if(S_flag==1) { a[0]=led[hour1/10]; a[1]=led[hour1%10]; } else { a[0]=led[11]; a[1]=led[11]; } a[2]=led[10]; a[3]=led[minute1/10]; a[4]=led[minute1%10];
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=P1A0; //second 调整定义sbit P1_仁P1A1;//minite 调整定义sbit P1_2二PM2; //hour 调整定义sbitP1_5=P1A5; //整点报时sbit P1_3=P1A3; //闹铃功能,调整时间sbit P1_6=P1A6; //调整时sbit P1_7=P1A7; //调整分sbit P1_4=P1A4; //关闭闹铃/* 函数声明*/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;PO=dispcode[seco nde%10];/秒个位delay(1);P2=0XFD;P0=dispcode[seco nde/10];〃秒十位delay(1);P2=0XFB;P0=dispcode[10];// 间隔符-delay(1);P2=0XF7;P0=dispcode[mi nite%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_仁=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设置闹铃时间。
基于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单片机电子时钟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语言代码

circle1=circle/10;
chaishu(circle1);
while(1)
{
display(e,d,c,b,a);
}
}
else
{
TH0=(65536-50000)/256;//50毫秒
TL0=(65536-50000)%256;//装入定时器0初值
circle=0;
c=d1/100;////////c=5*
c1=d1%100;///////c1=35
b=c1/10;/////////b=3*
b1=c1%10;////////b1=5
a=b1;////////////a=5*
}
void display(uint wan,uint qian,uint bai,uint shi,uint ge)
void T0_time() interrupt 1///////定时/计数器0的溢出中断对应的中断序号为"1"
{
TH0=(65536-50000)/256;//50毫秒
TL0=(65536-50000)%256;//装入定时器0初值
time++;
}
/////////////////////////////////////////////定时中断函数内容///////////////////////////////////////
{
case 0xeb:
{
num=7;
count=count+1;
}//如果=0xed那么num设定为4
break;//跳出switch
case 0xdb:
{
num=8;
基于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);}}。
89C52单片机时钟显示C语言程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit rs=P3^5;sbit lcden=P3^4;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;sbit rd=P3^7;sbit rw=P3^6;uchar count,s1num;char miao,fen,shi;uchar code table[]=" 2011-5-23 MON";uchar code table1[]=" 00:00:00";void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){ rs=0;P0=com;lcden=0;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1;P0=date;lcden=0;delay(5);lcden=1;delay(5);lcden=0;}void write_sfm(uchar add,uchar date)//写时分秒函数{uchar shi,ge;shi=date/10;//分解一个2位数的十位和个位ge=date%10;write_com(0x80+0x40+add);//设置显示位置write_date(0x30+shi);//送去液晶显示十位write_date(0x30+ge); //送去液晶显示个位}void init()//初始化函数{uchar num;dula=0;wela=0;lcden=1;fen=0;miao=0;shi=0;count=0;s1num=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<12;num++){write_date(table1[num]);delay(5);}TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void keyscan()//按键扫描函数{rd=0;if(s1==0){delay(5);if(s1==0)//确认功能键被按下{ s1num++;//功能键按下次数记录while(!s1);//释放确认if(s1num==1)//第一次被按下时{TR0=0; //关闭定时器write_com(0x80+0x40+10);//光标定位到秒位置write_com(0x0f); //光标开始闪烁}if(s1num==2)//第二次按下光标闪烁定位到分钟位置{write_com(0x80+0x40+7);}if(s1num==3)//第三次按下光标闪烁定位到小时位置{write_com(0x80+0x40+4);}if(s1num==4)//第四次按下{s1num=0;//记录按键数清零write_com(0x0c);//取消光标闪烁TR0=1; //启动定时器使时钟开始走}}}if(s1num!=0)//只有功能键被按下后,增加和减小键才有效{if(s2==0){delay(5);if(s2==0)//增加键确认被按下{while(!s2);//按键释放if(s1num==1)//若功能键第一次按下{miao++; //则调整秒加1if(miao==60)//若满60后将清零miao=0;write_sfm(10,miao);//每调节一次送液晶显示一下write_com(0x80+0x40+10);//显示位置重新回到调节处}if(s1num==2)//若功能键第二次按下{fen++;//则调整分钟加1if(fen==60)//若满60后将清零fen=0;write_sfm(7,fen);//每调节一次送液晶显示一下write_com(0x80+0x40+7);//显示位置重新回到调节处}if(s1num==3)//若功能键第三次按下{shi++;//则调整小时加1if(shi==24)//若满24后将清零shi=0;write_sfm(4,shi);;//每调节一次送液晶显示一下write_com(0x80+0x40+4);//显示位置重新回到调节处}}}if(s3==0){delay(5);if(s3==0)//确认减小键被按下{while(!s3);//按键释放if(s1num==1)//若功能键第一次按下{miao--;//则调整秒减1if(miao==-1)//若减到负数则将其重新设置为59miao=59;write_sfm(10,miao);//每调节一次送液晶显示一下write_com(0x80+0x40+10);//显示位置重新回到调节处}if(s1num==2)//若功能键第二次按下{fen--;//则调整分钟减1if(fen==-1)//若减到负数则将其重新设置为59fen=59;write_sfm(7,fen);//每调节一次送液晶显示一下write_com(0x80+0x40+7);//显示位置重新回到调节处}if(s1num==3)//若功能键第二次按下{shi--;//则调整小时减1if(shi==-1)//若减到负数则将其重新设置为23shi=23;write_sfm(4,shi);//每调节一次送液晶显示一下write_com(0x80+0x40+4);//显示位置重新回到调节处}}}}}void main(){rw=0;init();while(1){keyscan();}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==18){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}write_sfm(4,shi);}write_sfm(7,fen);}write_sfm(10,miao);}}。
STC89c52单片机 计算器C语言程序

STC89c52单片机计算器C语言程序STC89C52单片机计算器C语言程序下面是STC89C52单片机计算器的C语言程序,适用于P2位选P0段选时钟12MHZ。
程序代码如下:includedefine uchar unsigned chardefine uint unsigned intuchar Led[17] = {0x3f。
0x06.0x5b。
0x4f。
0x66.0x6d。
0x7d。
0x07.0x7f。
0x6f。
0x77.0x7c。
0x39.0x5e。
0x79.0x71.0x00};long float Number[]={0,0,0,0};uchar A[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};long int D[] = {0,0,0,0,0,0,0,0};uchar code C[] = {0x0.0xFE。
0xFD。
0xFB。
0xF7.0xEF。
0xDF。
0xBF。
0x7F};uchar k=16;uchar b;long float Out_put;uchar e=0;uchar g=0;uchar L=0;uchar g1=0;uchar g2=0;uchar g3=0;uchar g4=0;char j=-1;uchar m=0;uchar n=0;uchar x=0;程序中包含了头文件和宏定义,以及数码管段选、数码管显示位控制寄存器、数码管显示内容寄存器、数码管位选、按键控制变量等各种变量。
其中,Led数组存储了数码管的段选值,Number数组存储了数字,A数组存储了数码管的位选值,D数组存储了数码管的显示内容,C数组存储了数码管的位选值,k、b、Out_put、e、g、L、g1、g2、g3、g4、j、m、n、x 等变量用于按键控制和运算。
代码中没有明显的格式错误,可以直接使用。
下面是已经修改过的文章:uchar xo = 0./*控制开始计数小数点的变量*/long int result;void Delay(uint o) {uint i。
51单片机c语言入门和89S52资料

51单片机C语言学习杂记学习单片机实在不是件易事,一来要购买高价格的编程器,仿真器,二来要学习编程语言,还有众多种类的单片机选择真是件让人头痛的事。
在众多单片机中51架构的芯片风行很久,学习资料也相对很多,是初学的较好的选择之一。
51的编程语言常用的有二种,一种是汇编语言,一种是C语言。
汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而C语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,而且C语言还可以嵌入汇编来解决高时效性的代码编写问题。
对于开发周期来说,中大型的软件编写用C语言的开发周期通常要小于汇编语言很多。
综合以上C语言的优点,我在学习时选择了C语言。
以后的教程也只是我在学习过程中的一些学习笔记和随笔,在这里加以整理和修改,希望和大家一起分享,一起交流,一起学习,一起进步。
*注:可以肯定的说这个教程只是为初学或入门者准备的,笔者本人也只是菜鸟一只,有望各位大侠高手指点错误提出建议。
明浩2003-3-30pnzwzw@第一课建立您的第一个C项目使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。
KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。
KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。
51_52单片机(89c52)数码管时钟程序

P0=0xfe;wx();P0=table[ssg];dx();delay(1);P0=0xff;dx();
}
if(set1==3)//显示闹钟定时
{
P0=0x7f;wx();P0=table[nhhs];dx();delay(1);P0=0xff;dx();
P0=0xfb;wx();P0=0xbf;dx();delay(1);P0=0xff;dx();
P0=0xfd;wx();P0=table[nsss];dx();delay(1);P0=0xff;dx();
P0=0xfe;wx();P0=table[nssg];dx();delay(1);P0=0xff;dx();
//52单片机程序
/************************************************************/
/*数码管时钟89c52 */
/************************************************************/
/*程序可调时间,可设闹钟,数码管共阳驱动。*/
//加一函数
uchar incone(uchar n)
{
if(k3==0)
{
delay(20);
if(k3==0)
{
n++;
while(!k3);
}
}
return(n);
}
/************************************************************/
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)。
数字时钟89C52 单片机C语言程序STC89C52|/************** 【数字时钟】****************//****【功能】1、时间显示2、秒表3、闹钟4、日期显示都可以设置****/#include <reg52.h> /*包含器件配置文件*/#define uchar unsigned char /*宏定义字符型数据整型数据*/#define uint unsigned intuchar code H[] = {0x0f, 0x07, 0x0b, 0x0d, 0x0e}; /*按键【P3】端口断码用于按键*/ char Code[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,0x7d, 0x07, 0x7f, 0x6f}; /*显示【0 1 2 3 4 5 6 7 8 9】数字的数码管的段码*/ uchar code C[] = {0x0, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};/*列扫描控制LED1位2位3位4位5位6位7位8位*/uchar MON[]={0,31,28,31,30,31,30,31,31,30,31,30,31};uchar A;uchar BIN=0; /* 【BIN】作为倒计时开始的标志*/uchar hour = 0; /* 定义[时][分][秒] */uchar min = 0;uchar sec = 0;uint shi=12;uint fen=30;uchar Mmin=0;uchar Msec=30;uchar M0=0;uchar m=0;uchar year=9;uchar month=7;uchar month2;uchar day=19;uchar set1 = 1; /* set1=1 是调节时分秒set1=2时时调节年月日set=3时事调节闹钟*/uchar set2 = 1; /* set2=1时是调节【时】位set2=2时事调节【分】位*/uint x = 0; /* x 每【0.01s】自加一*/void Delay(uint k);void Timer0() /*定时器T0 5mS初始化*/{TMOD = 0x01; /*设置*定时器0**计数方式一* (每12个时钟脉冲计数一次)或IT0=1 第二种计数方式*/TH0 = (65536 - 10000) / 256; /*给定计时器高位赋予初值=15536/256*/TL0 = (65536 - 10000) % 256; /*给定计时器低位赋予初值=15536%256 */ET0 = 1; /*打开定时器外部终断0允许ET1是中断器1的开关*/EA = 1; /*打开总中断允许*/TR0 = 1;}void T0_srv(void) interrupt 1 /*5mS定时中断服务函数秒分时的值*/{TH0 = (65536 - 10000) / 256; /*给定计时器高位赋予初值=15536/256*/TL0 = (65536 - 10000) % 256; /*给定计时器低位赋予初值=15536%256 */x++;if(x==100){sec++;x=0; /*没每一秒【sec】加一*/if(sec==60){min++;sec=0;if(min==60) /*每一分钟【min】加一*/{min = 0;hour++;if(hour==24){hour = 0; /*每一小时【hour】加一*/day++;if(year%4==0) /*是否闰年的判断*/MON[2]=29;else MON[2]=28;if(day==MON[month]){day=0;month++;}}}}}if(BIN==1){if(Mmin!=0||Msec!=0){M0 = 100-x;if(M0==100){ if(Mmin>0){Msec--;if(Msec==0){Msec=60;Mmin-- ;}if(Msec==0) {Mmin=0;Msec=0;M0=0;} }if(Mmin==0){if(Msec!=0)Msec--;if(Msec==0){Msec=0;M0=0;}}}}if(Mmin==0&&Msec==0){M0=0;}} /*秒表分秒M0的赋值*/}void Scan_key() /*按键扫描函数【Scan_key()】*/{P3=H[0];if(P3!=H[0]){Delay(1);if(P3==H[4]){set1++;if(set1>4) set1 = 1;er1: if(P3==H[4]) goto er1; /*按下键后未释放,在此等候*/ }Delay(1);if(P3==H[3]){set2++;if(set2>3) set2 = 1;er2: if(P3==H[3]) goto er2; /*按下键后未释放,在此等候*/ }Delay(1);if(P3==H[1]){BIN++;if(BIN>1) BIN=0;er3: if(P3==H[1]) goto er3; /*按下键后未释放,在此等候*/ }}}void Time_show() /*时间的显示变量为【时】【分】【秒】*/ {P0 = Code[hour/10]; /*第一位数字显示【时】的【十】位*/ P2 = C[1];Delay(1);P0 = Code[hour%10]; /*第二位数字显示【时】的【个】位*/P2 = C[2];Delay(1);if(x/50==0)P0 = 0x40; /*第三位符号【-】的显示*/elseP0 = 0x00;P2 = C[3];Delay(1);P0 = Code[min/10]; /*第四位的数字的显示【分】的【十】位*/P2 = C[4];Delay(1);P0 = Code[min%10]; /*第五位的数字显示【分】的【个】位*/P2 = C[5];Delay(1);Delay(1);if(x/50==0)P0 = 0x40; /*第六位符号【-】的显示*/elseP0 = 0x00;P2 = C[6];Delay(1);P0 = Code[sec/10]; /*第七位数字的显示【秒】的【十】位显示*/P2 = C[7];Delay(1);P0 = Code[sec%10]; /*第八位数字的显示【秒】的【个】位显示*/ P2 = C[8];Delay(1);}void Year_show(){P0 = Code[year/10]; /*第一位数字显示【年】的【十】位*/P2 = C[1];Delay(1);P0 = Code[year%10]; /*第二位数字显示【年】的【个】位*/P2 = C[2];Delay(1);P0 = 0x40; /*第三位符号【-】的显示*/P2 = C[3];Delay(1);P0 = Code[month/10]; /*第四位的数字的显示【月】的【十】位*/P2 = C[4];Delay(1);P0 = Code[month%10]; /*第五位的数字显示【月】的【个】位*/P2 = C[5];Delay(1);Delay(1);P0 = 0x40; /*第六位符号【-】的显示*/P2 = C[6];Delay(1);P0 = Code[day/10]; /*第七位数字的显示【天】的【十】位显示*/P2 = C[7];Delay(1);P0 = Code[day%10]; /*第八位数字的显示【天】的【个】位显示*/ P2 = C[8];Delay(1);}void Clock_show(){P0 = Code[shi/10]; /*第一位数字显示【时】的【十】位*/P2 = C[4];Delay(1);P0 = Code[shi%10]; /*第二位数字显示【时】的【个】位*/P2 = C[5];Delay(1);P0 = 0x40; /*第三位符号【-】的显示*/P2 = C[6];Delay(1);P0 = Code[fen/10]; /*第四位的数字的显示【分】的【十】位*/ P2 = C[7];Delay(1);P0 = Code[fen%10]; /*第五位的数字显示【分】的【个】位*/P2 = C[8];Delay(1);}void Miao_show() /*时间的显示变量为【时】【分】【秒】*/ {P0 = Code[Mmin/10]; /*第一位数字显示【时】的【十】位*/P2 = C[1];Delay(1);P0 = Code[Mmin%10]; /*第二位数字显示【时】的【个】位*/P2 = C[2];Delay(1);P0 = 0x40; /*第三位符号【-】的显示*/P2 = C[3];Delay(1);P0 = Code[Msec/10]; /*第四位的数字的显示【分】的【十】位*/ P2 = C[4];Delay(1);P0 = Code[Msec%10]; /*第五位的数字显示【分】的【个】位*/P2 = C[5];Delay(1);Delay(1);P0 = 0x40; /*第六位符号【-】的显示*/P2 = C[6];Delay(1);P0 = Code[M0/10]; /*第七位数字的显示【秒】的【十】位显示*/P2 = C[7];Delay(1);P0 = Code[M0%10]; /*第八位数字的显示【秒】的【个】位显示*/ P2 = C[8];Delay(1);}void Time_set() /*调整时间的函数time_set() */{Scan_key();if(set1==1){if(set2==1) /*当set1=1 set2=1时位时的设置*/{if(P3==H[2]) hour++; /*按一下第三行的键hour 就加一*/Delay(1);if(hour>24) hour=0;while(P3==H[2]); /*按键未释放,在此等候*/}if(set2==2) /*当set1=1 set2=1时位时的设置*/{if(P3==H[2]) min++; /*按一下第三行的键hour 就加一*/Delay(1);if(min>60){ min=0; hour++;}while(P3==H[2]); /*按键未释放,在此等候*/}}}void Year_set() /*调整时间的函数time_set() */{Scan_key();if(set1==2){if(set2==1) /*当set1=1 set2=1时位时的设置*/{if(P3==H[2]) year++; /*按一下第三行的键hour 就加一*/ Delay(1);if(year>100) year=0;while(P3==H[2]);}if(set2==2) /*当set1=1 set2=1时位时的设置*/{if(P3==H[2]) month++; /*按一下第三行的键hour 就加一*/ Delay(1);if(month>12){ month=0; year++;}while(P3==H[2]);}if(set2==3){if(P3==H[2]) day++; /*按一下第三行的键hour 就加一*/ Delay(1);if(day>MON[month]){ day=0; month++;}while(P3==H[2]); /*按键未释放,在此等候*/}}}Clock_set(){Scan_key();if(set1==3){if(set2==1) /*当set1=1 set2=1时位时的设置*/{if(P3==H[2]) shi++; /*按一下第三行的键hour 就加一*/ Delay(1);if(shi>24) shi=0;while(P3==H[2]); /*按键未释放,在此等候*/}if(set2==2) /*当set1=1 set2=1时位时的设置*/{if(P3==H[2]) fen++; /*按一下第三行的键hour 就加一*/ Delay(1);if(fen>60){ fen=0; shi++;}while(P3==H[2]); /*按键未释放,在此等候*/}}}void Miao_set() /*调整时间的函数time_set() */{Scan_key();if(set1==4){if(set2==1) /*当set1=1 set2=1时位时的设置*/{if(P3==H[2]) Mmin++; /*按一下第三行的键hour 就加一*/ Delay(1);if(Mmin>24) Mmin=0;while(P3==H[2]); /*按键未释放,在此等候*/}if(set2==2) /*当set1=1 set2=1时位时的设置*/{if(P3==H[2]) Msec++; /*按一下第三行的键hour 就加一*/ Delay(1);if(Msec>60){ Msec=0; Mmin++;}while(P3==H[2]); /*按键未释放,在此等候*/ }}}void Clock(){if((hour==shi)&&(min==fen)){P1=0x00;}if(min>fen){P1=0xff;}}void Delay(uint k) /*延时函数delay() 的定义*/ {uint i,j;for(i = 0; i < k; i++){for(j = 0; j < 121; j++){;}}}void main() /*主函数*/{Timer0();while(1){if(set1==1){Time_show();Time_set();}if(set1==2){Year_show();Year_set();}if(set1==3){Clock_show();Clock_set();}Clock();if(set1==4){Miao_show();Miao_set();if(Mmin==0&&Msec==0){A=sec;P1=0x00;if(sec==A-1)P1=0xff;}}if(set1!=4){P1=0xff;}}}。