【蓝桥杯】第十一届单片机省赛
蓝桥杯省赛
题目
代码参考
#include "reg52.h"
#include "iic.h"
#include "onewire.h"
typedef unsigned char uint8;
typedef unsigned int uint32;
#define LED_Channel 4
#define BEEP_DELAY_Channel 5
#define COM_Channel 6
#define SMG_Channel 7
sfr P4 = 0xc0;
sfr AUXR = 0x8e;
//数码管编码
uint8 code TAB[19] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f,0x8c};
//带小数点
uint8 code Dot_TAB[16]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e} ;
//独立按键 J5:23
sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;
sbit S7 = P3^0;
uint8 node = 0;
uint32 temp;
uint8 tmax = 30;
uint8 tmin = 20;
uint8 tmode = 1;
uint8 pretmax = 30;
uint8 pretmin = 20;
uint8 errflag = 0;
void Delay(uint32 ms);
void InitHC138(uint8 Channel);
void Init_System(void);
void Display_Bit(uint8 pos,uint8 date);
void Display_All(uint8 date);
void Display(uint8 node);
void Key_Scan(void);
void Read_Temp(void);
void SMG_Delay(uint32 t);
void DAC(uint8 date);
void DAC_Hander(void);
void main()
{
Init_System();
while(1)
{
if(node == 0)
Read_Temp();
Key_Scan();
Display(node);
DAC_Hander();
}
}
void DAC_Hander(void)
{
P0 = 0xff;
if(temp>tmax)
{
DAC(255*4/5);
P0&=0xfe;//L1
}
else if(temp<tmin)
{
DAC(255*2/5);
P0&=0xfb;//L3
}
else if(temp<=tmax&&temp>=tmin)
{
DAC(255*3/5);
P0&=0xfd;//L2
}
if(node==0)
InitHC138(LED_Channel);
if(errflag == 1)
{
P0&=0xf7;//L4
}
InitHC138(0);
}
void Delay(uint32 ms)
{
uint32 x,y;
for(x=0;x<ms;x++)
for(y=846;y>0;y--){}
}
void InitHC138(uint8 Channel)
{
switch(Channel)
{
case 4:P2 = (P2 & 0x1f) | 0x80;break;
case 5:P2 = (P2 & 0x1f) | 0xa0;break;
case 6:P2 = (P2 & 0x1f) | 0xc0;break;
case 7:P2 = (P2 & 0x1f) | 0xe0;break;
default:P2 &= 0x1f;
}
}
void Init_System(void)
{
InitHC138(BEEP_DELAY_Channel);
P0 = 0x00;
InitHC138(LED_Channel);
P0 = 0xff;
InitHC138(0);
}
void Display_Bit(uint8 pos,uint8 date)
{
InitHC138(COM_Channel);
P0 = 0x01<<pos;
InitHC138(SMG_Channel);
P0 = date;
InitHC138(0);
}
void Display_All(uint8 date)
{
InitHC138(COM_Channel);
P0 = 0xff;
InitHC138(SMG_Channel);
P0 = date;
InitHC138(0);
}
void Display(uint8 node)
{
switch(node)
{
case 0:
Display_Bit(0,TAB[12]),Delay(1);
Display_Bit(1,0xff),Delay(1);
Display_Bit(2,0xff),Delay(1);
Display_Bit(3,0xff),Delay(1);
Display_Bit(4,0xff),Delay(1);
Display_Bit(5,0xff),Delay(1);
Display_Bit(6,TAB[temp/10]),Delay(1);
Display_Bit(7,TAB[temp%10]),Delay(1);
Display_All(0xff);
break;
case 1:
Display_Bit(0,TAB[18]),Delay(1);
Display_Bit(1,0xff),Delay(1);
Display_Bit(2,0xff),Delay(1);
Display_Bit(3,TAB[tmax/10]),Delay(1);
Display_Bit(4,TAB[tmax%10]),Delay(1);
Display_Bit(5,0xff),Delay(1);
Display_Bit(6,TAB[tmin/10]),Delay(1);
Display_Bit(7,TAB[tmin%10]),Delay(1);
Display_All(0xff);
break;
default:Display_All(0xff);
}
}
void SMG_Delay(uint32 t)
{
while(t--)
{
Display(node);
}
}
void Key_Scan(void)
{
if(S4==0)
{
Delay(10);
if(S4==0)
{
++node;
if(node>=2)
node = 0;
if(node)
{
pretmax = tmax;
pretmin = tmin;
tmode = 1;
}
else
{
if(tmax<tmin)
{
tmax = pretmax;
tmin = pretmin;
errflag = 1;
}
else
errflag = 0;
}
while(S4==0);
}
}
if(S5==0)
{
Delay(10);
if(S5==0)
{
++tmode;
if(tmode>=2)
tmode = 0;
while(S5==0);
}
}
if(S6==0)
{
Delay(10);
if(S6==0)
{
switch(tmode)
{
case 0:
if(tmax<99)
++tmax;
break;
case 1:
if(tmin<99)
++tmin;
break;
}
while(S6==0);
}
}
if(S7==0)
{
Delay(10);
if(S7==0)
{
switch(tmode)
{
case 0:
if(tmax>0)
--tmax;
break;
case 1:
if(tmin>0)
--tmin;
break;
}
while(S7==0);
}
}
}
//初始化,跳过rom,操作
//前5位是符号位,后4位是小数位,小数存放在LSB(低位先读),//0.0625*10
void Read_Temp(void)
{
uint8 LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc); //跳过ROM指令
Write_DS18B20(0x44); //开始温度转换
SMG_Delay(50);
//可用 Delay_OneWire(200); // 延时一段时间
init_ds18b20();
Write_DS18B20(0xcc); //跳过ROM指令
Write_DS18B20(0xbe); //读取高速暂存器
LSB =Read_DS18B20(); //读取第一个字节
MSB =Read_DS18B20(); //读取第二字节
temp = (MSB<<8)|LSB;
//包含小数 ,如果不包含小数,直接将temp右移4位即可
if((temp & 0xf800)== 0x0000) //判断高五位符号位是否为0 ,即是否为证书
{
temp = temp>>4;
// temp = temp * 10;
// temp = temp + (LSB & 0x0f)*0.625 ;//0.0625*10
}
}
void DAC(uint8 date) // 输入值需要转换
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(date);
IIC_WaitAck();
IIC_Stop();
}
总结
效果差不多,具体对不对还没细看。