代码部分(能实现题目要求的功能,但不太完善,等到二刷的时候对其进行完善)
#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,0xbf,0xff};
uchar shijian[]={50,59,23,0,0,0,0};
uchar time_interval=1;
uchar t_flag=0;
bit xianshi=0;
bit caiji=0;
bit fuhao_set=0;
bit led_flag=0;
uint num=0,num1=0;
uchar k=0;
uchar wendu[10];
uchar wendu_num=0;
uchar yi,er,san,si,wu,liu,qi,ba;
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 Write_Ds1302_Byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void keyscan();
void DS1302_init();
void DS1302_Get();
void Write_DS18B20(unsigned char dat);
void Delay_OneWire(unsigned int t);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
uchar DS18B20_Get();
void Timer0Init(void);
void Timer1Init(void);
void main()
{
allint();
Timer0Init();
Timer1Init();
DS1302_init();
while(1)
{
keyscan();
if(xianshi==0)
{
yi=11;er=11;san=11;si=11;wu=11;liu=10;qi=time_interval/10;ba=time_interval%10;
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
else if(xianshi==1)
{
DS1302_Get();
if(caiji==0)
{
yi=shijian[2]/10;er=shijian[2]%10;si=shijian[1]/10;wu=shijian[1]%10;qi=shijian[0]/10;ba=shijian[0]%10;
// display1(yi,er);
// display2(san,si);
// display3(wu,liu);
// display4(qi,ba);
}
else if(caiji1)
{
if(wendu_num0)
{
yi=10;er=wendu_num/10;san=wendu_num%10;si=11;wu=11;liu=10;qi=wendu[0]/10;ba=wendu[0]%10;
}
else if(wendu_num1)
{
EA=0;ET1=0;
P2=0X80;P0=0XFF;
yi=10;er=wendu_num/10;san=wendu_num%10;si=11;wu=11;liu=10;qi=wendu[1]/10;ba=wendu[1]%10;
}
else if(wendu_num2)
{
yi=10;er=wendu_num/10;san=wendu_num%10;si=11;wu=11;liu=10;qi=wendu[2]/10;ba=wendu[2]%10;
}
else if(wendu_num3)
{
yi=10;er=wendu_num/10;san=wendu_num%10;si=11;wu=11;liu=10;qi=wendu[3]/10;ba=wendu[3]%10;
}
else if(wendu_num4)
{
yi=10;er=wendu_num/10;san=wendu_num%10;si=11;wu=11;liu=10;qi=wendu[4]/10;ba=wendu[4]%10;
}
else if(wendu_num==5)
{
yi=10;er=wendu_num/10;san=wendu_num%10;si=11;wu=11;liu=10;qi=wendu[5]/10;ba=wendu[5]%10;
}
else if(wendu_num==6)
{
yi=10;er=wendu_num/10;san=wendu_num%10;si=11;wu=11;liu=10;qi=wendu[6]/10;ba=wendu[6]%10;
}
else if(wendu_num==7)
{
yi=10;er=wendu_num/10;san=wendu_num%10;si=11;wu=11;liu=10;qi=wendu[7]/10;ba=wendu[7]%10;
}
else if(wendu_num==8)
{
yi=10;er=wendu_num/10;san=wendu_num%10;si=11;wu=11;liu=10;qi=wendu[8]/10;ba=wendu[8]%10;
}
else if(wendu_num==9)
{
yi=10;er=wendu_num/10;san=wendu_num%10;si=11;wu=11;liu=10;qi=wendu[9]/10;ba=wendu[9]%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=0X80;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(P300)
{
xianshi=0;
caiji=0;
}
while(!P30);
}
else if(P310)
{
Delayms(5);
if(P310)
{
if(caiji1)
{
wendu_num++;
if(wendu_num10) wendu_num=0;
}
}
while(!P31);
}
else if(P320)
{
Delayms(5);
if(P320)
{
if(xianshi0){xianshi=1;EA=1;ET0=1;ET1=1;}
else if(xianshi1) xianshi=0;
}
while(!P32);
}
else if(P330)
{
Delayms(5);
if(P330)
{
if(xianshi0)
{
P2=0X80;P0=0XFF;
if(t_flag0)
{
t_flag++;
time_interval=5;
}
else if(t_flag1)
{
t_flag++;
time_interval=30;
}
else if(t_flag2)
{
t_flag++;
time_interval=60;
}
else if(t_flag==3)
{
t_flag=0;
time_interval=1;
}
}
}
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 i,add;
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 i,add;
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 low,high,temp;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
low=low>>4;
high=high<<4;
temp=low|high;
return temp;
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer0() interrupt 1
{
num++;
if(numtime_interval*1000-1)
{
num=0;
wendu[k]=DS18B20_Get();
k++;
if(k10)
{
caiji=1;
k=0;
ET0=0;
}
}
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xCD; //设置定时初值
TH1 = 0xD4; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
void Timer1() interrupt 3
{
num1++;
if(num1999)
{
num1=0;
if(xianshi1)
{
if(fuhao_set0)
{
san=10;liu=10;
fuhao_set=1;
}
else if(fuhao_set1)
{
san=11;liu=11;
fuhao_set=0;
}
if(caiji1)
{
if(led_flag0)
{
led_flag=1;
P2=0X80;P0=0XFE;
}
else if(led_flag==1)
{
led_flag=0;
P2=0X80;P0=0XFF;
}
}
}
}
}
注:和之前的问题一样黄色部分省略了双等号。
小结:这一届赛题明显比前几届赛题容易,注意按键之间的逻辑关系即可。