痛苦的蓝桥杯之旅,被无限圈钱后,或者决定写自己的博客,一个是帮助自己在明年圈钱的路上更进一步,另一个是与你分享进步。
二、题目展示
三、 代码展示
一、矩阵键盘key.c
#include "key.h" #include "delay.h" #include "temp.h" #include "timer.h" unsigned char key_sign=0; unsigned char mode_dis=0; extern int temp_set; unsigned char mode_cfg=0;//0 温度 1 时间 unsigned char K13_mode=0; /*******矩阵键盘*******/ //行 sbit L1 = P4^4; sbit L2 = P4^2; sbit L3 = P3^5; sbit L4 = P3^4; // sbit H1 = P3^0; sbit H2 = P3^1; sbit H3 = P3^2; sbit H4 = P3^3; void key_scan() { L1=L2=L3=L4=H1=H2=H4=1;H3=0; if(L1==0) {Delay100us();if(L1==0)key_sign=5;while(!L1);}//s5 if(L2==0) {Delay100us();if(L2==0)key_sign=9;while(!L2);}//s9 if(L3==0) { Delay100us(); if(L3==0) { key_sign=13; mode_cfg^=1; } while(!L3);}//s13 if(L4==0) { Delay100us(); if(L4==0) { key_sign=17; } while(!L4) { K13_mode=1; } }//s17 L1=L2=L3=L4=H1=H2=H3=1;H4=0; if(L1==0) {Delay100us();if(L1==0)key_sign=4;while(!L1);}//s4 if(L2==0) {Delay100us();if(L2==0)key_sign=8;while(!L2);}//s8 if(L3==0) { Delay100us(); if(L3==0) { key_sign=12; mode_dis=mode_dis 1; if(mode_dis>=3) { mode_dis=0; } } while(!L3); } //s12 if(L4==0) {Delay100us();if(L4==0)key_sign=16;while(!L4);}//s16 if(key_sign==17&&mode_dis==2) { key_sign=0; temp_set=temp_set-1; if(temp_set<=10) { temp_set=10; } } if(key_sign==16) { key_sign=0; temp_set=temp_set 1; if(temp_set>=99) { temp_set=99; } } }
二、ds18b20温度传感器temp.c
#include "temp.h" int temp; int temp_set=23; int temp_int; int temp_float; float temp_all; extern unsigned char smgBuffer[10]; extern unsigned char font[10]; void read_temp() { int tp; int tl,th; init_ds18b20(); Write_DS18B20(0xcc);//跳过ROM Write_DS18B20(0x44) init_ds18b20(); Write_DS18B20(0xcc);//跳过ROM Write_DS18B20(0xbe);//读取温度 tl=Read_DS18B20(); th=Read_DS18B20(); tp=th<<8|tl; temp=(tp>>2)*25; temp_int=((temp/1000)*10 (temp/100)); temp_float=(temp/10)*10 (temp); } void temp_dis() { smgBuffer[0]=0xc1;// 0011 1110 smgBuffer[1]=font[1]; smgBuffer[2]=0xff; smgBuffer[3]=0xff; smgBuffer[4]=0xff; smgBuffer[5]=font[temp/1000]; smgBuffer[6]=font[temp/100]&0x7f; smgBuffer[7]=font[temp_float/10]; // smgBuffer[6]=font[temp_float]; } void temp_set_dis() { smgBuffer[0]=0xc1;// 0011 1110 smgBuffer[1]=font[3]; smgBuffer[2]=0xff; smgBuffer[3]=0xff; smgBuffer[4]=0xff; smgBuffer[5]=0xff; smgBuffer[6]=font[temp_set/10]; smgBuffer[7]=font[temp_set]; }
三、DS1302时钟timer.c
#include "timer.h" unsigned char code time_write_addr[8]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e}; unsigned char code time_read_addr[8]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,0x8f}; unsigned char time[3]={0x43,0x59,0x23}; //miao fen shi extern unsigned char smgBuffer[10]; extern unsigned char font[10]; void time_read() { unsigned char i=3; while(i--) { time[i]=Read_Ds1302_Byte(time_read_addr[i]); } } void time_write() { unsigned char i=3; Write_Ds1302_Byte(0x8E,0x00) while(i--) { Write_Ds1302_Byte(time_write_addr[i],time[i]); } Write_Ds1302_Byte(0x8E,0x80) } void time_shi_dis() { smgBuffer[0]=0xc1;//11 smgBuffer[1]=font[2]; smgBuffer[2]=0xff; smgBuffer[3]=font[time[2]>>4]; smgBuffer[4]=font[time[2]&0x0f]; smgBuffer[5]=0xbf;//1011 1111 smgBuffer[6]=font[time[1]>>4]; smgBuffer[7]=font[time[1]&0x0f]; } void time_fen_dis() { smgBuffer[0]=0xc1; smgBuffer[1]=font[2]; smgBuffer[2]=0xff; smgBuffer[3]=font[time[1]>>4]; smgBuffer[4]=font[time[1]&0x0f]; smgBuffer[5]=0xbf;//1011 1111 smgBuffer[6]=font[(time[0]>>4)&0x07]; smgBuffer[7]=font[time[0]&0x0F]; }
四、LED灯led.c
因为博主喜欢在这里使用bdata电影中寻址操作led,所以经常这样.c文件将混合一些定时器中断函数。例如,由于调查的重点是矩阵键盘的松开和响应,这里的博客作者更喜欢这个while判断方法,然后直接用中断来打断这里while循环操作,主函数while循环只放矩阵键盘。将其他工作交给定时器中断,以中断循环操作。
#include "sys.h" #include "ds1302.h" #include "delay.h" #include "key.h" #include "buffer.h" #include "led.h" #include "temp.h" #include "timer.h" unsigned char bdata led=0,out=0; sbit L1=led^0; sbit L2=led^1; sbit L3=led^2; sbit L4=led^3; sbit L5=led^4; sbit L6=led^5; sbit L7=led^6; sbit L8=led^7; sbit relay=out^4; sbit buzz=out^6; // int L1_timing=0; int relay_tiing=0;
int L3_timing=0;
int L3_mode=0;
//
extern unsigned char time[3];
//
extern unsigned char mode_dis;
extern unsigned char mode_cfg;
//
extern int temp_set;
extern int temp_int;
//
extern unsigned char K13_mode;
extern unsigned char key_sign;
//
void led_dis()
{
P2&=0x1f;
P0=~led;
P2|=Y4;
P2&=0x1f;
}
//
void led_init()
{
P2&=0x1f;
P0=0xff;
P2|=Y4;
P2&=0x1f;
}
void out_init()
{
P2&=0x1f;
P0=0x00;
P2|=Y5;
P2&=0x1f;
}
void out_dis()
{
P2&=0x1f;
P0=out;
P2|=Y5;
P2&=0x1f;
}
//
void mode_dis_set()
{
//mode_dis
if(mode_dis==0)
{
temp_dis();
}
if(mode_dis==1&&K13_mode==0)
{
time_shi_dis();
}
if(K13_mode==1&&mode_dis==1)
{
time_fen_dis();
K13_mode=0;
}
if(mode_dis==2)
{
temp_set_dis();
}
//mode_dis
//LED_1
if(time[0]==0x00&&time[1]==0x00)
{
L1_timing=5000;
}
//mode_cfg0&&LED2&&relay_temp
if(mode_cfg==0)
{
L2=1;
if(temp_int>=temp_set)
{
relay=1;
}
else
{
relay=0;
}
}
if(mode_cfg==1)
{
L2=0;
}
//mode_cfg0
//mode_cfg1
if(mode_cfg==1)
{
if(time[0]==0x00&&time[1]==0x00)
{
relay_timing=5000;
}
}
//mode_cfg1
}
//
void T0_irq() interrupt 1
{
if(L1_timing)
{
L1=1;
L1_timing--;
}
if(L1_timing==0)
{
L1=0;
}
if(mode_cfg==1)
{
if(relay_timing)
{
relay=1;
L1_timing--;
}
if(relay_timing==0)
{
relay=0;
}
}
if(relay==1)
{
L3_mode=100;
if(L3_timing)
{
L3_timing--;
}
else if(L3_mode)
{
L3_timing=L3_mode;
L3=~L3;
}
}
if(relay==0)
{
L3=0;
}
}
void T1_iqr() interrupt 3
{
time_read();
led_dis();
out_dis();
buffer_dis();
read_temp();
mode_dis_set();
}
四、总结
这套题目难度适中,没有明显难点,属于中规中矩的一套赛题,唯一难度就在于矩阵键盘的松开响应问题。
这边我放个链接(资料里也有)