蓝桥杯第八届初赛试题————电子钟

代码部分(已实现题目要求全部功能)
#include<stc15f2k60s2.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
sbit DQ = P1^4;
uchar tab[]={0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xFF,0XBF,0xc6};
char shijian[]={50,59,23,0,0,0,0};
uchar cishu=0;
uchar yi,er,san,si,wu,liu,qi,ba;
uchar wendu=0;
uchar time_set=0;
uchar alarm_set=0;
bit shizhong_shezhi=1;
bit alarm_shezhi=0;
bit shizhong_xianshi=0;
bit jieshu=0;
char alarm_shi=0,alarm_fen=0,alarm_miao=0;
uint num=0;
void allint();
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void Delayms(uint ms);
void keyscan();
void Write_Ds1302_Byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void DS1302_Init();
void DS1302_Get();
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
uchar DS18B20_Get();
void Timer0Init(void);
void main()
{
allint();
DS1302_Init();
while(1)
{
keyscan();
DS1302_Get();
Timer0Init();
if((shijian[2]alarm_shi)&&(shijian[1]alarm_fen)&&(shijian[0]alarm_miao))
{
ET0=1;
}
if(jieshu
1)
{
ET0=0;
P2=0X80;P0=0XFF;
jieshu=0;
}
if((shizhong_shezhi
1)&&(alarm_shezhi
0))
{
alarm_set=0;
if(time_set0)
{
yi=shijian[2]/10;er=shijian[2]%10;san=11;si=shijian[1]/10;wu=shijian[1]%10;liu=11;qi=shijian[0]/10;ba=shijian[0]%10;
}
else if(time_set
1)
{
if(shijian[0]%20)
{
yi=10;er=10;;san=11;si=shijian[1]/10;wu=shijian[1]%10;liu=11;qi=shijian[0]/10;ba=shijian[0]%10;
}
else if(shijian[0]%2
1)
{
yi=shijian[2]/10;er=shijian[2]%10;san=11;si=shijian[1]/10;wu=shijian[1]%10;liu=11;qi=shijian[0]/10;ba=shijian[0]%10;
}
}
else if(time_set2)
{
if(shijian[0]%2
0)
{
yi=shijian[2]/10;er=shijian[2]%10;san=11;si=10;wu=10;liu=11;qi=shijian[0]/10;ba=shijian[0]%10;
}
else if(shijian[0]%21)
{
yi=shijian[2]/10;er=shijian[2]%10;san=11;si=shijian[1]/10;wu=shijian[1]%10;liu=11;qi=shijian[0]/10;ba=shijian[0]%10;
}
}
else if(time_set
3)
{
if(shijian[0]%20)
{
yi=shijian[2]/10;er=shijian[2]%10;san=11;si=shijian[1]/10;wu=shijian[1]%10;liu=11;qi=10;ba=10;
}
else if(shijian[0]%2
1)
{
yi=shijian[2]/10;er=shijian[2]%10;san=11;si=shijian[1]/10;wu=shijian[1]%10;liu=11;qi=shijian[0]/10;ba=shijian[0]%10;
}
}
}
else if((shizhong_shezhi0)&&(alarm_shezhi1))
{
time_set=0;
if(alarm_set0)
{
yi=shijian[2]/10;er=shijian[2]%10;san=11;si=shijian[1]/10;wu=shijian[1]%10;liu=11;qi=shijian[0]/10;ba=shijian[0]%10;
}
else if(alarm_set
1)
{
if(shijian[0]%20)
{
yi=alarm_shi/10;er=alarm_shi%10;san=11;si=alarm_fen/10;wu=alarm_fen%10;liu=11;qi=alarm_miao/10;ba=alarm_miao%10;
}
else if(shijian[0]%2
1)
{
yi=10;er=10;san=11;si=alarm_fen/10;wu=alarm_fen%10;liu=11;qi=alarm_miao/10;ba=alarm_miao%10;
}
}
else if(alarm_set2)
{
if(shijian[0]%2
0)
{
yi=alarm_shi/10;er=alarm_shi%10;san=11;si=alarm_fen/10;wu=alarm_fen%10;liu=11;qi=alarm_miao/10;ba=alarm_miao%10;
}
else if(shijian[0]%21)
{
yi=alarm_shi/10;er=alarm_shi/10;san=11;si=10;wu=10;liu=11;qi=alarm_miao/10;ba=alarm_miao%10;
}
}
else if(alarm_set
3)
{
if(shijian[0]%20)
{
yi=alarm_shi/10;er=alarm_shi%10;san=11;si=alarm_fen/10;wu=alarm_fen%10;liu=11;qi=alarm_miao/10;ba=alarm_miao%10;
}
else if(shijian[0]%2
1)
{
yi=alarm_shi/10;er=alarm_shi/10;san=11;si=alarm_fen/10;wu=alarm_fen%10;liu=11;qi=10;ba=10;
}
}
}
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
}
void allint()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
}
void display1(uchar yi,uchar er)
{
P2=0XC0;P0=0X01;P2=0XE0;P0=tab[yi];Delayms(1);
P2=0XC0;P0=0X02;P2=0XE0;P0=tab[er];Delayms(1);
}
void display2(uchar san,uchar si)
{
P2=0XC0;P0=0X04;P2=0XE0;P0=tab[san];Delayms(1);
P2=0XC0;P0=0X08;P2=0XE0;P0=tab[si];Delayms(1);
}
void display3(uchar wu,uchar liu)
{
P2=0XC0;P0=0X10;P2=0XE0;P0=tab[wu];Delayms(1);
P2=0XC0;P0=0X20;P2=0XE0;P0=tab[liu];Delayms(1);
}
void display4(uchar qi,uchar ba)
{
P2=0XC0;P0=0X40;P2=0XE0;P0=tab[qi];Delayms(1);
P2=0XC0;P0=0X80;P2=0XE0;P0=tab[ba];Delayms(1);
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
}
void Delayms(uint ms) //@11.0592MHz
{
unsigned char i, j;
uint n;
for(n=0;n<ms;n++)
{
nop();
nop();
nop();
i = 11;
j = 190;
do
{
while (–j);
} while (–i);
}
}
void keyscan()
{
if(P300)
{
Delayms(5);
if(P30
0)
{
ET0=0;
if(time_set0) {time_set=1;shizhong_shezhi=1;alarm_shezhi=0;shizhong_xianshi=1;}
else if(time_set
1) {time_set=2;shizhong_shezhi=1;alarm_shezhi=0;shizhong_xianshi=1;}
else if(time_set2) {time_set=3;shizhong_shezhi=1;alarm_shezhi=0;shizhong_xianshi=1;}
else if(time_set
3) {time_set=0;shizhong_shezhi=1;alarm_shezhi=0;shizhong_xianshi=0;}
}
while(!P30);
}
else if(P310)
{
Delayms(5);
if(P31
0)
{
ET0=0;
if(alarm_set0) {alarm_set=1;shizhong_shezhi=0;alarm_shezhi=1;shizhong_xianshi=1;}
else if(alarm_set
1){alarm_set=2;shizhong_shezhi=0;alarm_shezhi=1;shizhong_xianshi=1;}
else if(alarm_set2){alarm_set=3;shizhong_shezhi=0;alarm_shezhi=1;shizhong_xianshi=1;}
else if(alarm_set
3){alarm_set=0;shizhong_shezhi=0;alarm_shezhi=1;shizhong_xianshi=0;}
}
while(!P31);
}
else if(P320)
{
Delayms(5);
if(P32
0)
{
ET0=0;
if(time_set1){shijian[2]++;if(shijian[2]24) shijian[2]=0;DS1302_Init();}
else if(time_set
2){shijian[1]++;if(shijian[1]60) shijian[1]=0;DS1302_Init();}
else if(time_set
3){shijian[0]++;if(shijian[0]60) shijian[0]=0;DS1302_Init();}
else if(alarm_set
1){alarm_shi++;if(alarm_shi
24)alarm_shi=0;}
else if(alarm_set2){alarm_fen++;if(alarm_fen60)alarm_fen=0;}
else if(alarm_set3){alarm_miao++;if(alarm_miao60)alarm_miao=0;}
}
while(!P32);
}
else if(P330)
{
Delayms(5);
if(P33
0)
{
ET0=0;
if(shizhong_xianshi1)
{
if(time_set
1){shijian[2]–;if(shijian[2]<0) shijian[2]=23;DS1302_Init();}
else if(time_set2){shijian[1]–;if(shijian[1]<0) shijian[1]=59;DS1302_Init();}
else if(time_set
3){shijian[0]–;if(shijian[0]<0) shijian[0]=59;DS1302_Init();}
else if(alarm_set1){alarm_shi–;if(alarm_shi<0)alarm_shi=23;}
else if(alarm_set
2){alarm_fen–;if(alarm_fen<0)alarm_fen=59;}
else if(alarm_set3){alarm_miao–;if(alarm_miao<0)alarm_miao=59;}
}
else if(shizhong_xianshi
0)
{
while(!P33)
{
wendu=DS18B20_Get();
yi=10;er=10;san=10;si=10;wu=10;liu=wendu/10;qi=wendu%10;ba=12;
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
}
}
while(!P33);
}
}
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}

void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
nop();
SCK=0;
nop();
RST=1;
nop();
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(((dat/10)<<4)|(dat%10));
RST=0;
}

unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
uchar high,low;
RST=0;
nop();
SCK=0;
nop();
RST=1;
nop();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0;
nop();
RST=0;
SCK=0;
nop();
SCK=1;
nop();
SDA=0;
nop();
SDA=1;
nop();
high=temp/16;
low=temp%16;
temp=high*10+low;
return (temp);
}
void DS1302_Init()
{
uchar add,i;
add=0x80;
Write_Ds1302(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_Ds1302(add,shijian[i]);
add=add+2;
}
Write_Ds1302(0x8e,0x80);
}
void DS1302_Get()
{
uchar add,i;
add=0x81;
Write_Ds1302(0x8e,0x00);
for(i=0;i<7;i++)
{
shijian[i]=Read_Ds1302 (add);
add=add+2;
}
Write_Ds1302(0x8e,0x80);
}
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
while(t–);
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(50);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(50);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;

for(i=0;i<8;i++)
{
	DQ = 0;
	dat >>= 1;
	DQ = 1;
	if(DQ)
	{
		dat |= 0x80;
	}	    
	Delay_OneWire(50);
}
return dat;

}

//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;

DQ = 1;
Delay_OneWire(120);
DQ = 0;
Delay_OneWire(800);
DQ = 1;
Delay_OneWire(100); 
initflag = DQ;     
Delay_OneWire(50);

return initflag;

}

uchar DS18B20_Get()
{
uchar temp1,temp2,temp;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);

init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
temp1=Read_DS18B20();              //注意先取出低八位
temp2=Read_DS18B20();
temp1=temp1>>4;
temp2=temp2<<4;
temp=temp1|temp2;
return temp;

}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1;
}
void Timer0() interrupt 1
{
num++;
if(num199)
{
P2=0X80;P0=0XFE;
cishu++;
}
else if(num
399)
{
num=0;
cishu++;
P2=0X80;P0=0XFF;
}
if(cishu>=25)
{
jieshu=1;
cishu=0;
}
}
小结:在写这届赛题时我犯了眼高手低的毛病,在一开始就把程序框架搞得很复杂设置了很多判断变量,其实很多变量的功能可以复用,因此我一开始写的很麻烦把自己都绕了进去,然后对其中的一些判定条件进行修改,减少了判定条件的使用,使程序更加简洁直观。在写温度那个部分时,犯了一个错误接受温度那里是先接收低8位再接收高八位,结果我搞反了造成了错误。其他部分在往年赛题里都有体现,不会对做题人员产生大的干扰。
注:黄色部分依旧是省略了等号,复制时注意即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值