距离蓝桥杯省赛还有10天,要抓紧练习了,不知道是这一届简单还是自己厉害了的原因,用了一天就做出来了,还是叫大佬帮了一个小忙,时间也不少,还能再做几届。
废话不多说,先看原题
MAIN.C
#include<reg51.h>
#include<onewire.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sfr AUXR = 0x8e;
sfr T2H = 0xD6;
sfr T2L = 0xD7;
sfr IE2 = 0xAF;
sbit R1=P3^0;//第一排初始化(如果跳线帽模式是BTN,则只有最左侧一列能用)
sbit R2=P3^1;//第二排初始化
sbit R3=P3^2;//第三排初始化
sbit R4=P3^3;//第四排初始化
sbit DQ = P1^4;
0 1 2 3 4 5 6 7 8 9 - 全灭
unsigned char code shuzi[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xbf,0xff};
/// A b C d E F H L P U n
unsigned char code zimu[]={0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xc7,0x8c,0xc1,0xc8};
0 1 2 3 4 5 6 7
unsigned char code weizhi[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00};
// 1 2 3 4 5 6 7 8 灭
unsigned char ledweizhi[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
int temp;
uchar shi;
uchar ge;
int temp2;
unsigned char count_c=0;
unsigned char second=50;
unsigned char minute=59;
unsigned char hour=23;
uchar count_b=0;
//时钟设置
uchar hour_p;
uchar minute_p;
uchar second_p;
//闹钟设置
uchar hour_n=0;
uchar minute_n=0;
uchar second_n=0;
uchar mode_smg=0;
uchar mode_f=0;
uchar mode_e;
//闹钟计数
uchar count_a;
uchar mode_alarm=0;
uchar alarm_num=0;
void Scan_S7();
void alarm();
void shumaguan_shuzi();
void delay_ms(int ms)
{
int q,w;
for(q = 0;q<ms;q++){
for(w=845;w>0;w--);
}
}
void shumaguan_shuzi(uchar a,uchar b)
{
delay_ms(1);
P2=(P2&0X1f)|0xC0;P0=weizhi[a];
P2=(P2&0X1f)|0xE0;P0=shuzi[b];
delay_ms(1);
}
//数码管字母显示
void shumaguan_zimu(uchar a,uchar b)
{
delay_ms(1);
P2=(P2&0X1f)|0xC0;P0=weizhi[a];
P2=(P2&0X1f)|0xE0;P0=zimu[b];
delay_ms(1);
}
void ledlight(uchar x)
{
P2=(P2&0X1f)|0x80;
P0=ledweizhi[x];
}
void Init_Keys()
{
R1=R2=R3=R4=1;
}
void cls_buzz(void)
{
P2 = (P2&0x1F|0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
void Init_timer0()
{
TMOD = 0x01;
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Service_timer0() interrupt 1//定时器0
{
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
count_c++;
if(count_c == 20)
{
second++;
count_c = 0;
}
if(second == 60)
{
minute++;
second=0;
}
if(minute==60)
{
hour++;
minute=0;
if(hour==24) hour=0;
}
}
void Timer1(void) //定时模式
{
TMOD &= 0x0F;
TL1 = (65535-1000)%256;
TH1 = (65535-1000)/256;
TF1 = 0;
TR1 = 0;
ET1 = 1;
}
void Timer1_Service() interrupt 3//定时器1的定时模式
{
count_a++;
if(count_a==200)
{
count_a=0;
alarm_num++;
if(mode_alarm==0)
{
mode_alarm=1;
}
else if(mode_alarm==1)
{
mode_alarm=0;
}
}
}
void led_blink()
{
if(mode_alarm==1)
{
ledlight(0);
}
if(mode_alarm==0)
{
P2=0x80;
P0=0xff;
}
if(R1==0||R2==0||R3==0||R4==0)
{
P2=0x80;
P0=0x00;
TR1=0;
count_a=0;
alarm_num=0;
mode_alarm=0;
}
if(alarm_num==25)
{
TR1=0;
count_a=0;
alarm_num=0;
mode_alarm=0;
}
}
void Timer2(void)
{
T2H = (65535-50000)/256;
T2L = (65535-50000)%256;
EA = 1;
IE2 |=0x04;
AUXR|=0x10;
}
void Timer2_Service() interrupt 12//定时器2的定时模式
{
count_b++;
if(count_b==20)
{
count_b=0;
if(mode_smg==0)
{
mode_smg=1;
}
else if(mode_smg==1)
{
mode_smg=0;
}
}
}
void display_clock()
{
shumaguan_shuzi(0,hour/10);
shumaguan_shuzi(1,hour%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute/10);
shumaguan_shuzi(4,minute%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second/10);
shumaguan_shuzi(7,second%10);
alarm();
led_blink();
while(R4==0)
{
shumaguan_shuzi(5,shi);
shumaguan_shuzi(6,ge);
shumaguan_zimu(7,2);
}
}
void hour_blink()
{
mode_e=1;
if(mode_f==1)
{
if(mode_smg==1)
{
shumaguan_shuzi(0,hour_p/10);
shumaguan_shuzi(1,hour_p%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute_p/10);
shumaguan_shuzi(4,minute_p%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second_p/10);
shumaguan_shuzi(7,second_p%10);
}
if(mode_smg==0)
{
shumaguan_shuzi(0,11);
shumaguan_shuzi(1,11);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute_p/10);
shumaguan_shuzi(4,minute_p%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second_p/10);
shumaguan_shuzi(7,second_p%10);
}
}
if(mode_f==2)
{
if(mode_smg==1)
{
shumaguan_shuzi(0,hour_n/10);
shumaguan_shuzi(1,hour_n%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute_n/10);
shumaguan_shuzi(4,minute_n%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second_n/10);
shumaguan_shuzi(7,second_n%10);
}
if(mode_smg==0)
{
shumaguan_shuzi(0,11);
shumaguan_shuzi(1,11);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute_n/10);
shumaguan_shuzi(4,minute_n%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second_n/10);
shumaguan_shuzi(7,second_n%10);
}
}
}
void minute_blink()
{
mode_e=2;
if(mode_f==1)
{
if(mode_smg==1)
{
shumaguan_shuzi(0,hour_p/10);
shumaguan_shuzi(1,hour_p%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute_p/10);
shumaguan_shuzi(4,minute_p%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second_p/10);
shumaguan_shuzi(7,second_p%10);
}
if(mode_smg==0)
{
shumaguan_shuzi(0,hour_p/10);
shumaguan_shuzi(1,hour_p%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,11);
shumaguan_shuzi(4,11);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second_p/10);
shumaguan_shuzi(7,second_p%10);
}
}
if(mode_f==2)
{
if(mode_smg==1)
{
shumaguan_shuzi(0,hour_n/10);
shumaguan_shuzi(1,hour_n%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute_n/10);
shumaguan_shuzi(4,minute_n%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second_n/10);
shumaguan_shuzi(7,second_n%10);
}
if(mode_smg==0)
{
shumaguan_shuzi(0,hour_n/10);
shumaguan_shuzi(1,hour_n%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,11);
shumaguan_shuzi(4,11);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second_n/10);
shumaguan_shuzi(7,second_n%10);
}
}
}
void second_blink()
{
mode_e=3;
if(mode_f==1)
{
if(mode_smg==1)
{
shumaguan_shuzi(0,hour_p/10);
shumaguan_shuzi(1,hour_p%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute_p/10);
shumaguan_shuzi(4,minute_p%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second_p/10);
shumaguan_shuzi(7,second_p%10);
}
if(mode_smg==0)
{
shumaguan_shuzi(0,hour_p/10);
shumaguan_shuzi(1,hour_p%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute_p/10);
shumaguan_shuzi(4,minute_p%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,11);
shumaguan_shuzi(7,11);
}
}
if(mode_f==2)
{
if(mode_smg==1)
{
shumaguan_shuzi(0,hour_n/10);
shumaguan_shuzi(1,hour_n%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute_n/10);
shumaguan_shuzi(4,minute_n%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,second_n/10);
shumaguan_shuzi(7,second_n%10);
}
if(mode_smg==0)
{
shumaguan_shuzi(0,hour_n/10);
shumaguan_shuzi(1,hour_n%10);
shumaguan_shuzi(2,10);
shumaguan_shuzi(3,minute_n/10);
shumaguan_shuzi(4,minute_n%10);
shumaguan_shuzi(5,10);
shumaguan_shuzi(6,11);
shumaguan_shuzi(7,11);
}
}
}
void temperature_get()
{
uchar high,low;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=((high<<4)|(low>>4));//不带小数点
//temp2=low&0x0f*100/16;//取小数点两位
shi=temp%100/10;
ge=temp%10;
}
void display_temp()
{
while(R4==0)
{
shumaguan_shuzi(5,shi);
shumaguan_shuzi(6,ge);
shumaguan_zimu(7,2);
}
}
void alarm()
{
if(hour==hour_n&&minute==minute_n&&second==second_n)
{
P2=(P2&0X1f)|0x80;
P0=0xff;
TR1=1;
}
}
void Scan_S5()
{
if(mode_f==1)
{
if(R3==0)
{
while(R3==0);
if(mode_e==1)
{
hour_p++;
if(hour_p==24) {hour_p=0;}
}
else if(mode_e==2)
{
minute_p++;
if(minute_p==60) {minute_p=0;}
}
else if(mode_e==3)
{
second_p++;
if(second_p==60) {second_p=0;}
}
}
}
if(mode_f==2)
{
if(R3==0)
{
while(R3==0);
if(mode_e==1)
{
hour_n++;
if(hour_n==24) {hour_n=0;}
}
else if(mode_e==2)
{
minute_n++;
if(minute_n==60) {minute_n=0;}
}
else if(mode_e==3)
{
second_n++;
if(second_n==60) {second_n=0;}
}
}
}
}
void Scan_S4()
{
if(mode_f==1)
{
if(R4==0)
{
while(R4==0);
if(mode_e==1)
{
hour_p--;
if(hour_p==0) {hour_p=24;}
}
else if(mode_e==2)
{
minute_p--;
if(minute_p==0) {minute_p=60;}
}
else if(mode_e==3)
{
second_p--;
if(second_p==0) {second_p=60;}
}
}
}
if(mode_f==2)
{
if(R4==0)
{
while(R4==0);
if(mode_e==1)
{
hour_n--;
if(hour_n==0) {hour_n=24;}
}
else if(mode_e==2)
{
minute_n--;
if(minute_n==0) {minute_n=60;}
}
else if(mode_e==3)
{
second_n--;
if(second_n==0) {second_n=60;}
}
}
}
}
void Scan_S6()
{
mode_f=2;
if(R2==0)
{
while(R2==0);
hour_n=hour;
minute_n=minute;
second_n=second;
Timer2();
while(1)
{
hour_blink();
Scan_S5();
Scan_S4();
if(R2==0)
{
while(R2==0) minute_blink();
while(1)
{
minute_blink();
Scan_S5();
Scan_S4();
if(R2==0)
{
while(R2==0)second_blink();
while(1)
{
second_blink();
Scan_S5();
Scan_S4();
if(R2==0)
{
while(R2==0)
{
display_clock();
}
while(1)
{
display_clock();
Scan_S6();
Scan_S7();
}
}
}
}
}
}
}
}
}
void Scan_S7()
{
uchar mode_s7=0;
mode_f=1;
if(R1==0)
{
while(R1==0);
mode_s7++;
hour_p=hour;
minute_p=minute;
second_p=second;
Timer2();
while(1)
{
hour_blink();
Scan_S5();
Scan_S4();
if(R1==0)
{
while(R1==0) minute_blink();
while(1)
{
minute_blink();
Scan_S5();
Scan_S4();
if(R1==0)
{
while(R1==0)second_blink();
while(1)
{
second_blink();
Scan_S5();
Scan_S4();
if(R1==0)
{
while(R1==0)
{
display_clock();
hour=hour_p;
minute=minute_p;
second=second_p;
}
while(1)
{
display_clock();
Scan_S7();
Scan_S6();
}
}
}
}
}
}
}
}
}
void main()
{
Timer1();
Init_Keys();
Init_timer0();
cls_buzz();
while(1)
{
Scan_S6();
Scan_S7();
display_clock();
temperature_get();
display_temp();
}
}
设计思路,就是在做1s间隔的闪烁的时候,需要用到定时器,在做闹钟的触发响应时,也要用到定时器,考到定时器较多,我就定时器学得不好,但是总体来说还是很简单的