
keil uvision4这个软件编写一个电子时钟,可以用中断调时,可以有闹钟功
keiluvision4这个软件编写一个电子时钟,可以用中断调时,可以有闹钟功能,S52的单片机,急用...
keil uvision4这个软件编写一个电子时钟,可以用中断调时,可以有闹钟功能,S52的单片机,急用
展开
展开全部
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define START 0 //开始
#define SETTIME 1 //设置时间
#define SETCLOCK 2 //设置闹钟时间
#define DATE 3 //年月日
#define DAOJISHI 4 //倒计时
sbit adrd=P3^7; //IO口定义
sbit adwr=P3^6;
sbit diola=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
sbit dawr=P3^6;
sbit beep=P2^3;
sbit hongwai=P3^2;
uint num;
uchar sec;
uchar min;
uchar hour; //时 分 秒
uchar j,k;
uchar a,b;
uchar set_hour;
uchar set_min;
uchar set_sec; //闹钟设置的时 分 秒
uchar dao_hour;
uchar dao_min;
uchar dao_sec; //倒计时的时 分 秒
uint nian;
uchar yue;
uchar ri; //年 月 日
uchar qiehuan; //第一个键按下计数,值不同,按后面三个键有不同的动作
uchar TIANSHU; //每个月的天数,会根据年月的不同而不同
uchar djskaishi;
uchar HWflag;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管编码0--9
//函数声明
void VarInit(void);
void display(uchar,uchar,uchar);
void TimerInit(void);
void delay(unsigned char i);
void delay10ms(void);
void delayhw(void);
void KeyBord(void);
void NeiRongQieHuan(void);
void ShiFenMiaoPanduan(void);
void DatePanduan(void);
void Hongwai(void);
//延时程序
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
//用于按键延时消抖的函数
void delay10ms(void)
{
for(a=225;a>0;a--)
for(b=225;b>0;b--);
}
//红外延时
void delayhw(void)
{
uchar a,b;
for(a=90;a>0;a--)
for(b=90;b>0;b--);
}
//主函数
int main()
{
VarInit();
TimerInit();
while(1)
{
DatePanduan();
// Hongwai();
ShiFenMiaoPanduan();
KeyBord();
NeiRongQieHuan();
}
return 0;
}
void VarInit(void)
{
num = 0;
sec = 0;
min = 0;
hour = 0;
beep = 1;
qiehuan = 0;
set_hour = 1;
set_min = 1;
set_sec = 1;
dao_hour = 0;
dao_min = 30;
dao_sec = 0; //倒计时初值
nian = 2011;
yue = 6;
ri = 9;
TIANSHU = 30; //月份的初始值为6月
djskaishi = 0;
HWflag = 1;
}
void TimerInit(void)
{
EA=1; //开总中断
ET1=1;
TMOD=0x01; //选择计数器工作方式,选为方式1,16位计数器
TH1=0x4C; //装入高八位数
TL1=0x00; //低八位
TR1=1; //计数器开始工作
}
void time1() interrupt 3 using 1
{
TH1=0x4C;
TL1=0x00;
if(qiehuan == 0)
{
num++;
}
}
void display(uchar hour,uchar min,uchar sec) //显示程序
{
uchar wei_1;
uchar wei_2;
wei_1 = hour/10; //显示小时
wei_2 = hour%10;
dula=0;
P0=table[wei_1];
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(3);
dula=0;
P0=table[wei_2];
dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(3);
wei_1 = min/10;
wei_2 = min%10;
dula=0;
P0=table[wei_1]; //显示分钟
dula=1;
dula=0;
wela=0;
P0=0x7b;
wela=1;
wela=0;
delay(3);
dula=0;
P0=table[wei_2];
dula=1;
dula=0;
wela=0;
P0=0x77;
wela=1;
wela=0;
delay(3);
wei_1 = sec/10;
wei_2 = sec%10;
dula=0;
P0=table[wei_1]; //显示秒
dula=1;
dula=0;
wela=0;
P0=0x6f;
wela=1;
wela=0;
delay(3);
dula=0;
P0=table[wei_2];
dula=1;
dula=0;
wela=0;
P0=0x5f;
wela=1;
wela=0;
delay(3);
}
void KeyBord(void)
{
unsigned char temp;
P3=0xfe; //第一行有按键按下
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay10ms();
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: //第一个键按下
qiehuan++;
if(qiehuan >= 5)
{
qiehuan = 0;
}
break;
case 0xde: //第二个键按下
if(SETTIME == qiehuan)
{
hour++;
}
if(SETCLOCK == qiehuan)
{
set_hour++;
}
if(DATE == qiehuan)
{
nian++;
}
if(DAOJISHI == qiehuan)
{
dao_hour++;
if(dao_hour>=24)
{
dao_hour = 0;
}
}
break;
case 0xbe: //第三个
if(SETTIME == qiehuan)
{
min++;
}
if(SETCLOCK == qiehuan)
{
set_min++;
}
if(DATE == qiehuan)
{
yue++;
if(yue>=13)
{
yue = 1;
nian++;
}
}
if(DAOJISHI == qiehuan)
{
dao_min++;
if(dao_min>=60)
{
dao_min = 0;
}
}
break;
case 0x7e: //第四个
if(SETTIME == qiehuan)
{
sec++;
}
if(SETCLOCK == qiehuan)
{
set_sec++;
}
if(DATE == qiehuan)
{
ri++;
if(ri>=(TIANSHU+1))
{
ri = 1;
yue++;
}
}
if(DAOJISHI == qiehuan)
{
dao_sec++;
if(dao_sec>=60)
{
dao_sec = 0;
}
}
break;
}
}
}
P3=0xfd; //第二行有按键按下
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay10ms();
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: //第一个键按下
djskaishi = 1;
break;
case 0xdd: //第二个键按下
AJflag++;
if(AJflag >= 2)
{
AJflag = 0;
}
break;
}
}
}
}
//监测红外发射函数
void HongWai(void)
{
if(hongwai == 0)
{
delayhw();
if(hongwai == 0)
{
HWflag++;
if(HWflag >= 2)
{
HWflag = 0;
}
}
}
}
void ShiFenMiaoPanduan(void)
{
if(djskaishi == 0)
{
if(num==160)
{
num=0;
sec++;
}
if(60==sec)
{
sec = 0;
min++;
}
if(60==min)
{
min = 0;
hour++;
}
if(24==hour)
{
hour = 0;
}
if(60==set_sec)
{
set_sec = 0;
}
if(60==set_min)
{
set_min = 0;
}
if(24==set_hour)
{
set_hour = 0;
}
Hongwai();
if((hour==set_hour)&&(min==set_min)) //时间是否与闹钟时间一致
{
if(HWflag==0)
{
beep = 1;
}
if(HWflag == 1)
{
beep = 0; //响
}
}
else
{
beep = 1; //否,不响
}
}
if(djskaishi == 1)
{
if(num==160)
{
num=0;
dao_sec--;
}
if(0==sec)
{
dao_sec = 59;
dao_min--;
}
if(0==min)
{
dao_min = 59;
dao_hour--;
}
if(0==hour)
{
dao_hour = 23;
}
if((0==dao_hour)&&(0==dao_min)&&(0==dao_sec)) //时间是否为0
{
beep = 0; //是,蜂鸣器响
}
else
{
beep = 1; //否,不响
}
}
}
//年月日算法
void DatePanduan(void)
{
switch(yue)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: TIANSHU = 31;
break;
case 4:
case 6:
case 9:
case 11: TIANSHU = 30;
break;
case 2:
if((((nian%4)==0&&(nian%100)!=0))||(nian%100)==0&&(nian%400)==0)
{
TIANSHU = 29;
}
else
{
TIANSHU = 28;
}
break;
}
}
void NeiRongQieHuan(void)
{
if(qiehuan == SETTIME)
{
display(hour,min,sec);
}
if(qiehuan == SETCLOCK)
{
display(set_hour,set_min,set_sec);
}
if(qiehuan == DATE)
{
display((uchar)(nian-2000), yue, ri);
}
if(qiehuan == DAOJISHI)
{
display(dao_hour,dao_min,dao_sec);
}
if(qiehuan == START)
{
display(hour,min,sec);
}
#define uint unsigned int
#define uchar unsigned char
#define START 0 //开始
#define SETTIME 1 //设置时间
#define SETCLOCK 2 //设置闹钟时间
#define DATE 3 //年月日
#define DAOJISHI 4 //倒计时
sbit adrd=P3^7; //IO口定义
sbit adwr=P3^6;
sbit diola=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
sbit dawr=P3^6;
sbit beep=P2^3;
sbit hongwai=P3^2;
uint num;
uchar sec;
uchar min;
uchar hour; //时 分 秒
uchar j,k;
uchar a,b;
uchar set_hour;
uchar set_min;
uchar set_sec; //闹钟设置的时 分 秒
uchar dao_hour;
uchar dao_min;
uchar dao_sec; //倒计时的时 分 秒
uint nian;
uchar yue;
uchar ri; //年 月 日
uchar qiehuan; //第一个键按下计数,值不同,按后面三个键有不同的动作
uchar TIANSHU; //每个月的天数,会根据年月的不同而不同
uchar djskaishi;
uchar HWflag;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管编码0--9
//函数声明
void VarInit(void);
void display(uchar,uchar,uchar);
void TimerInit(void);
void delay(unsigned char i);
void delay10ms(void);
void delayhw(void);
void KeyBord(void);
void NeiRongQieHuan(void);
void ShiFenMiaoPanduan(void);
void DatePanduan(void);
void Hongwai(void);
//延时程序
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
//用于按键延时消抖的函数
void delay10ms(void)
{
for(a=225;a>0;a--)
for(b=225;b>0;b--);
}
//红外延时
void delayhw(void)
{
uchar a,b;
for(a=90;a>0;a--)
for(b=90;b>0;b--);
}
//主函数
int main()
{
VarInit();
TimerInit();
while(1)
{
DatePanduan();
// Hongwai();
ShiFenMiaoPanduan();
KeyBord();
NeiRongQieHuan();
}
return 0;
}
void VarInit(void)
{
num = 0;
sec = 0;
min = 0;
hour = 0;
beep = 1;
qiehuan = 0;
set_hour = 1;
set_min = 1;
set_sec = 1;
dao_hour = 0;
dao_min = 30;
dao_sec = 0; //倒计时初值
nian = 2011;
yue = 6;
ri = 9;
TIANSHU = 30; //月份的初始值为6月
djskaishi = 0;
HWflag = 1;
}
void TimerInit(void)
{
EA=1; //开总中断
ET1=1;
TMOD=0x01; //选择计数器工作方式,选为方式1,16位计数器
TH1=0x4C; //装入高八位数
TL1=0x00; //低八位
TR1=1; //计数器开始工作
}
void time1() interrupt 3 using 1
{
TH1=0x4C;
TL1=0x00;
if(qiehuan == 0)
{
num++;
}
}
void display(uchar hour,uchar min,uchar sec) //显示程序
{
uchar wei_1;
uchar wei_2;
wei_1 = hour/10; //显示小时
wei_2 = hour%10;
dula=0;
P0=table[wei_1];
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(3);
dula=0;
P0=table[wei_2];
dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(3);
wei_1 = min/10;
wei_2 = min%10;
dula=0;
P0=table[wei_1]; //显示分钟
dula=1;
dula=0;
wela=0;
P0=0x7b;
wela=1;
wela=0;
delay(3);
dula=0;
P0=table[wei_2];
dula=1;
dula=0;
wela=0;
P0=0x77;
wela=1;
wela=0;
delay(3);
wei_1 = sec/10;
wei_2 = sec%10;
dula=0;
P0=table[wei_1]; //显示秒
dula=1;
dula=0;
wela=0;
P0=0x6f;
wela=1;
wela=0;
delay(3);
dula=0;
P0=table[wei_2];
dula=1;
dula=0;
wela=0;
P0=0x5f;
wela=1;
wela=0;
delay(3);
}
void KeyBord(void)
{
unsigned char temp;
P3=0xfe; //第一行有按键按下
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay10ms();
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: //第一个键按下
qiehuan++;
if(qiehuan >= 5)
{
qiehuan = 0;
}
break;
case 0xde: //第二个键按下
if(SETTIME == qiehuan)
{
hour++;
}
if(SETCLOCK == qiehuan)
{
set_hour++;
}
if(DATE == qiehuan)
{
nian++;
}
if(DAOJISHI == qiehuan)
{
dao_hour++;
if(dao_hour>=24)
{
dao_hour = 0;
}
}
break;
case 0xbe: //第三个
if(SETTIME == qiehuan)
{
min++;
}
if(SETCLOCK == qiehuan)
{
set_min++;
}
if(DATE == qiehuan)
{
yue++;
if(yue>=13)
{
yue = 1;
nian++;
}
}
if(DAOJISHI == qiehuan)
{
dao_min++;
if(dao_min>=60)
{
dao_min = 0;
}
}
break;
case 0x7e: //第四个
if(SETTIME == qiehuan)
{
sec++;
}
if(SETCLOCK == qiehuan)
{
set_sec++;
}
if(DATE == qiehuan)
{
ri++;
if(ri>=(TIANSHU+1))
{
ri = 1;
yue++;
}
}
if(DAOJISHI == qiehuan)
{
dao_sec++;
if(dao_sec>=60)
{
dao_sec = 0;
}
}
break;
}
}
}
P3=0xfd; //第二行有按键按下
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay10ms();
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: //第一个键按下
djskaishi = 1;
break;
case 0xdd: //第二个键按下
AJflag++;
if(AJflag >= 2)
{
AJflag = 0;
}
break;
}
}
}
}
//监测红外发射函数
void HongWai(void)
{
if(hongwai == 0)
{
delayhw();
if(hongwai == 0)
{
HWflag++;
if(HWflag >= 2)
{
HWflag = 0;
}
}
}
}
void ShiFenMiaoPanduan(void)
{
if(djskaishi == 0)
{
if(num==160)
{
num=0;
sec++;
}
if(60==sec)
{
sec = 0;
min++;
}
if(60==min)
{
min = 0;
hour++;
}
if(24==hour)
{
hour = 0;
}
if(60==set_sec)
{
set_sec = 0;
}
if(60==set_min)
{
set_min = 0;
}
if(24==set_hour)
{
set_hour = 0;
}
Hongwai();
if((hour==set_hour)&&(min==set_min)) //时间是否与闹钟时间一致
{
if(HWflag==0)
{
beep = 1;
}
if(HWflag == 1)
{
beep = 0; //响
}
}
else
{
beep = 1; //否,不响
}
}
if(djskaishi == 1)
{
if(num==160)
{
num=0;
dao_sec--;
}
if(0==sec)
{
dao_sec = 59;
dao_min--;
}
if(0==min)
{
dao_min = 59;
dao_hour--;
}
if(0==hour)
{
dao_hour = 23;
}
if((0==dao_hour)&&(0==dao_min)&&(0==dao_sec)) //时间是否为0
{
beep = 0; //是,蜂鸣器响
}
else
{
beep = 1; //否,不响
}
}
}
//年月日算法
void DatePanduan(void)
{
switch(yue)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: TIANSHU = 31;
break;
case 4:
case 6:
case 9:
case 11: TIANSHU = 30;
break;
case 2:
if((((nian%4)==0&&(nian%100)!=0))||(nian%100)==0&&(nian%400)==0)
{
TIANSHU = 29;
}
else
{
TIANSHU = 28;
}
break;
}
}
void NeiRongQieHuan(void)
{
if(qiehuan == SETTIME)
{
display(hour,min,sec);
}
if(qiehuan == SETCLOCK)
{
display(set_hour,set_min,set_sec);
}
if(qiehuan == DATE)
{
display((uchar)(nian-2000), yue, ri);
}
if(qiehuan == DAOJISHI)
{
display(dao_hour,dao_min,dao_sec);
}
if(qiehuan == START)
{
display(hour,min,sec);
}
追问
可以在AT89S52实验箱里面运行吗?

2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询