一、前言:
这届赛题我认为是非常简单的一届赛题,看来第一场的难度普遍是低于第二场的难度,本届赛题没有什么难度。闲话少数直接上。已经将所有的资料0积分上传,题目在资料里有,需要的自取
二、题目
三、 代码展示
因为文章篇幅原因,这里不展示全部代码,所有资料都已经0积分上传。
一、矩阵键盘key.c
#include "key.h"
#include "delay.h"
//
unsigned char key_sign=0;
unsigned char mode_dis=0;
unsigned char mode_set=0;
unsigned char temp_tb=25;
extern unsigned char temp_set;
//
sbit H1=P3^0;
sbit H2=P3^1;
sbit H3=P3^2;
sbit H4=P3^3;
//
sbit L1=P4^4;
sbit L2=P4^2;
sbit L3=P3^4;
sbit L4=P3^5;
//
void key_scan()
{
H1=H2=H3=L1=L2=L3=L4=1;H4=0;
if(L1==0)
{
Delay100us();
if(L1==0)
{
key_sign=4;
}
while(!L1);
}
if(L2==0)
{
Delay100us();
if(L2==0)
{
key_sign=8;
}
while(!L2);
}
H1=H2=H4=L1=L2=L3=L4=1;H3=0;
if(L1==0)
{
Delay100us();
if(L1==0)
{
key_sign=5;
}
while(!L1);
}
if(L2==0)
{
Delay100us();
if(L2==0)
{
key_sign=9;
}
while(!L2);
}
//
if(key_sign==4)
{
key_sign=0;
mode_dis=mode_dis+1;
if(mode_dis>=3)
{
mode_dis=0;
}
}
if(key_sign==8&&mode_dis==1)
{
key_sign=0;
temp_tb=temp_tb-1;
}
if(key_sign==9&&mode_dis==1)
{
key_sign=0;
temp_tb=temp_tb+1;
}
if(key_sign==5)
{
key_sign=0;
mode_set^=1;
}
if(mode_dis!=1)
{
temp_set=temp_tb;
}
//
}
二、ds18b20温度传感器
#include "temp.h"
extern unsigned char smgBuffer[10];
extern unsigned char font[10];
int temp;
int temp_int;
unsigned char temp_set=25;
extern unsigned char temp_tb;
void read_temp()
{
int tp;
int tl,th;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
tl= Read_DS18B20();
th= Read_DS18B20();
tp=th<<8|tl;
temp=(tp>>2)*25;
temp_int=(temp/1000&10)*10+(temp/100%10);
}
void temp_dis()
{
smgBuffer[0]=0xc6;//1100 0110
smgBuffer[1]=0xff;
smgBuffer[2]=0xff;
smgBuffer[3]=0xff;
smgBuffer[4]=font[temp/1000%10];
smgBuffer[5]=font[temp/100%10]&0x7f;
smgBuffer[6]=font[temp/10%10];
smgBuffer[7]=font[temp%10];
}
void temp_set_dis()
{
smgBuffer[0]=0x8c;//1000 1100
smgBuffer[1]=0xff;
smgBuffer[2]=0xff;
smgBuffer[3]=0xff;
smgBuffer[4]=0xff;
smgBuffer[5]=0xff;
smgBuffer[6]=font[temp_tb/10];
smgBuffer[7]=font[temp_tb%10];
}
三、LED.C
因为博主这边喜欢用bdata片内寻址来操作led,所以经常这个.c文件会混入一些定时器中断的函数,比如这次因为考察的重点是矩阵键盘松开及响应,这边博主又比较喜欢这种while判断的方式,之后这边便直接使用中断来打断while循环的操作,主函数while循环只放矩阵键盘。其他的工作交给定时器中断来打断循环操作。
#include "led.h"
#include "delay.h"
#include "buffer.h"
#include "delay.h"
#include "key.h"
#include "onewire.h"
#include "iic.h"
#include "temp.h"
#include "adda.h"
#include "timing.h"
//
extern unsigned char key_sign;
//
extern unsigned char mode_dis;
extern unsigned char mode_set;
//
extern unsigned char temp_set;
extern int temp_int;
extern int temp;
//
extern long int dianya;
//
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;
//
extern unsigned char key_sign;
//
void led_init()
{
P2&=0x1f;
P0=0xff;
P2|=Y4;
P2&=0x1f;
}
void led_dis()
{
P2&=0x1f;
P0=~led;
P2|=Y4;
P2&=0x1f;
}
void out_dis()
{
P2&=0x1f;
P0=out;
P2|=Y5;
P2&=0x1f;
}
void mode_define()
{
//
if(mode_dis==0)
{
temp_dis();
L2=1;
L3=0;
L4=0;
}
if(mode_dis==1)
{
temp_set_dis();
L2=0;
L3=1;
L4=0;
}
if(mode_dis==2)
{
dac_dis();
L2=0;
L3=0;
L4=1;
}
//
if(mode_set==0)
{
L1=1;
if(temp_int>=temp_set)
{
dianya=500;
}
if(temp_int<temp_set)
{
dianya=0;
}
}
if(mode_set==1)
{
L1=0;
if(temp<=2000)
{
dianya=100;
}
if(temp>=4000)
{
dianya=400;
}
if(temp>2000&&temp<4000)
{
dianya=100+(0.15*(temp-2000));
}
}
}
void T0_irq() interrupt 1
{
DAC();
buffer_dis();
led_dis();
out_dis();
mode_define();
read_temp();
}
四、ADDA.C
这部分主要是写ADC和DAC的
#include "adda.h"
extern unsigned char smgBuffer[10];
extern unsigned char font[10];
unsigned long int dianya=0;
unsigned int dianweiqi;
void DAC()
{
unsigned char d;
d=dianya*(255/500);
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(d);
IIC_WaitAck();
IIC_Stop();
}
void ADC()
{
unsigned char a;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x43);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
IIC_RecByte();
IIC_SendAck(0);
a=IIC_RecByte();
dianweiqi=a*(500/255);
IIC_SendAck(1);
IIC_Stop();
}
void dac_dis()
{
smgBuffer[0]=0x88;//1000 1000
smgBuffer[1]=0xff;
smgBuffer[2]=0xff;
smgBuffer[3]=0xff;
smgBuffer[4]=0xff;
smgBuffer[5]=font[dianya/100%10]&0x7f;
smgBuffer[6]=font[dianya/10%10];
smgBuffer[7]=font[dianya%10];
}
五、main.c
#include "led.h"
#include "delay.h"
#include "buffer.h"
#include "delay.h"
#include "key.h"
#include "onewire.h"
#include "iic.h"
#include "temp.h"
#include "adda.h"
#include "timing.h"
void main()
{
Timer0Init();
buffer_init();
led_init();
while(1)
{
key_scan();
}
}
四、总结
这套题目难度适中,没有明显难点,属于中规中矩的一套赛题.
五、大家关心的客观题
这边我放个链接
这边分享一个我在csdn找到的宝贵博主的博客这边直接分享给大家
最新 2021年 第十二届 蓝桥杯 单片机设计与开发 省赛 客观试题 个人答案_davies*的博客-CSDN博客_第十二届蓝桥杯单片机省赛真题