笔者是参加第十三届蓝桥杯单片机15组的第二批成员,此次赛题是在4.9日拿到赛题时候第一时间练习并调试得到最终的模板。有不妥之处还望斧正,相互进步相互学习哈。
目录
前言
赛题感受
代码驱动
这是刚刚过去的第十三届第一场嵌入式的省赛,模拟比赛的时候,拿到赛题,就发现相较于上一年难了一些。在编程的初期还是有很多的bug,但也都一一化解,最终得到了完美的答案。
在刚拿到赛题之时,首先脑中首先想到要用的是什么模块,先将所需要的模块整理出来,确定可以很好的使用,之后再开始研究赛题。
问题1.LED与数码管乱串问题
问题2.调节下载晶振的频率影响数码管显示温度
问题3.LED闪烁与继电器等其他的模块有机结合
据我的感受,只要大家能够耐心一步一步思考,能够排查出自己出现bug的原因,一定能够实现完美运行的。
主文件下:
#include "Key16.h"
#include "smg.h"
#include "ds1302.h"
#include "onewire.h"
void allinit(void)
{
P2=P2&0x1f|0x80;
P0=0xff;
P2=P2&0x1f|0xa0;
P0=0x00;
}
bit bit_5,bit_6;
u16 DS18B20_temp;
void control(void);
void Led_Port(void);
void Mode_Change(void);
void main()
{
allinit();
DS1302_init();
Timer1Init();
DS18B20_temp=(char)DS18B20Read();
delay_ms(800);
while(1)
{
Key_Prc();
control();
Led_Port();
DS1302_read();
Mode_Change();
Display1(zero,one);
Display2(two,three);
Display3(four,five);
Display4(six,seven);
}
}
void control(void){
DS18B20_temp=(char)DS18B20Read();
if(bit_1==0){
P2=0x80,P0=0xff,P0&=0xfd,P2=0x80;
if(DS18B20_temp>=Temp_Para){
P2=0xa0,P0=0x00,P0|=0x10,P2=0xa0;bit_3=1;
}
else if(DS18B20_temp=26)six=16;
seven=DS18B20_temp/100%10;
}
else if(Mode_flag==1&&bit_2==0){
zero=15,one=2,two=11,three=DS1302_time[2]/10,
four=DS1302_time[2]%10,five=10,
six=DS1302_time[1]/10,
seven=DS1302_time[1]%10;
}
else if(Mode_flag==2){
zero=15,one=3,two=11,three=11,four=11,five=11,
six=Temp_Para/10,seven=Temp_Para%10;
}
if(bit_2==1){
zero=15,one=2,two=11,three=DS1302_time[1]/10,
four=DS1302_time[1]%10,
five=10,
six=DS1302_time[0]/10,
seven=DS1302_time[0]%10;
}
}
完整版矩阵按键:
#include "Key16.h"
#include "smg.h"
#include "ds1302.h"
u8 Key_value,Key_flag,Key,Key_Down,Key_Up,Key_old;
u16 Key_temp;
u8 Mode_flag;
bit bit_1,bit_2,bit_3,bit_4;
u8 Temp_Para=23,bit_time;
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x18; //设置定时初值
TH1 = 0xFC; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA=1;
ET1=1;
}
u8 Key_Read(void)
{
P44=0,P42=1,P35=1,P34=1,P3|=0x0f;
Key_temp=P3;
P44=1,P42=0,P35=1,P34=1,P3|=0x0f;
Key_temp=(Key_temp<<4)|(P3&0x0f);
P44=1,P42=1,P35=0,P34=1,P3|=0x0f;
Key_temp=(Key_temp<<4)|(P3&0x0f);
P44=1,P42=1,P35=1,P34=0,P3|=0x0f;
Key_temp=(Key_temp<<4)|(P3&0x0f);
switch(~Key_temp){
case 0x8000: Key_value=4;break;
case 0x4000: Key_value=5;break;
case 0x2000: Key_value=6;break;
case 0x1000: Key_value=7;break;
case 0x0800: Key_value=8;break;
case 0x0400: Key_value=9;break;
case 0x0200: Key_value=10;break;
case 0x0100: Key_value=11;break;
case 0x0080: Key_value=12;break;
case 0x0040: Key_value=13;break;
case 0x0020: Key_value=14;break;
case 0x0010: Key_value=15;break;
case 0x0008: Key_value=16;break;
case 0x0004: Key_value=17;break;
case 0x0002: Key_value=18;break;
case 0x0001: Key_value=19;break;
default :Key_value=0;
}
return (Key_value);
}
void Key_Prc(void){
if(Key_flag) return;
Key_flag=1;
Key=Key_Read();
Key_Down=Key&(Key^Key_old);
Key_Up=~Key&(Key^Key_old);
Key_old=Key;
if(Key_Down){
switch(Key){
case 12:if(++Mode_flag==3)Mode_flag=0;break;
case 13:bit_1=~bit_1;break;
case 16:if(Mode_flag==2){
if(++Temp_Para>99)Temp_Para=99;
}break;
case 17:if(Mode_flag==2){
if(--Temp_Para<10)Temp_Para=10;
}
else if(Mode_flag==1)bit_2=1;break;
}
}
if(Key_Up){
switch(Key_Up){
case 17:if(Mode_flag==1){
bit_2=0;
zero=15,one=2,two=11,three=DS1302_time[2]/10,
four=DS1302_time[2]%10,
five=10,
six=DS1302_time[1]/10,
seven=DS1302_time[1]%10;
}
}
}
}
void Timer1() interrupt 3{
if(++Key_flag==10) Key_flag=0;
if(bit_3==1){
bit_time++;
if(bit_time==100)bit_4=1;
else if(bit_time==200){bit_4=0;bit_time=0;}
}
}
数码管代码如下:
#include "smg.h"
unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0xbf,0xff,0xc6,0x8c,0x88,0xc1,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf};//0-9
unsigned char smgwei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 zero,one,two,three,four,five,six,seven;
void Display1(zero,one)
{
P2=0xc0,P0=smgwei[0];
P2=0xff,P0=smgduan[zero];
delay_ms(1);
P2=0xc0,P0=smgwei[1];
P2=0xff,P0=smgduan[one];
delay_ms(1);
P2=0xc0,P0=0xff;
P2=0xff,P0=0xff;
}
void Display2(two,three)
{
P2=0xc0,P0=smgwei[2];
P2=0xff,P0=smgduan[two];
delay_ms(1);
P2=0xc0,P0=smgwei[3];
P2=0xff,P0=smgduan[three];
delay_ms(1);
P2=0xc0,P0=0xff;
P2=0xff,P0=0xff;
}
void Display3(four,five)
{
P2=0xc0,P0=smgwei[4];
P2=0xff,P0=smgduan[four];
delay_ms(1);
P2=0xc0,P0=smgwei[5];
P2=0xff,P0=smgduan[five];
delay_ms(1);
P2=0xc0,P0=0xff;
P2=0xff,P0=0xff;
}
void Display4(six,seven)
{
P2=0xc0,P0=smgwei[6];
P2=0xff,P0=smgduan[six];
delay_ms(1);
P2=0xc0,P0=smgwei[7];
P2=0xff,P0=smgduan[seven];
delay_ms(1);
P2=0xc0,P0=0xff;
P2=0xff,P0=0xff;
}