【蓝桥杯】第十届单片机省赛
蓝桥杯省赛
题目
代码参考
#include "reg52.h"
#include "iic.h"
typedef unsigned char uint8;
typedef unsigned int uint32;
#define LED_Channel 4
#define BEEP_RELAY_Channel 5
#define COM_Channel 6
#define SMG_Channel 7
uint8 code TAB[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e,0xc1};
sfr P4 = 0xc0;
sfr AUXR = 0x8e;
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
uint8 L1 = 0;
uint8 L2 = 0;
uint8 L3 = 0;
uint8 L4 = 0;
uint8 L5 = 0;
uint8 node = 0;
uint8 mode = 0;
uint32 Frequence = 0;
uint32 Voltage = 0;
uint32 Temp_Voltage = 0;
uint32 cnt_f = 0;
uint32 cnt50ms = 0;
uint8 DAC_Flag = 0;
uint8 LED_Flag = 1;
uint8 SMG_Flag = 1;
void Init_System(void);
void InitHC138(uint8 Channel);
void Delay(uint32 ms);
void Display_Bit(uint8 pos,uint8 date);
void Display_All(uint8 date);
void Display(node);
uint8 ADC(uint8 ch);
void DAC(uint8 date,uint8 flag);
void LED_Control(void);
void Key_Scan(void);
void Timer01Init(void)
{
TMOD = 0x06;
TL0 = 0xff; //设置定时初始值
TH0 = 0xff; //设置定时初始值
TL1 = (65536-50000)%255; //设置定时初始值
TH1 = (65536-50000)/255; //设置定时初始值
TF0 = 0;
TR0 = 1;
TF1 = 0;
TR1 = 1;
ET0 = 1;
ET1 = 1;
EA = 1;
}
void Time0_Hander(void) interrupt 1
{
cnt_f++;
}
void Time1_Hander(void) interrupt 3
{
cnt50ms++;
if(cnt50ms>=20)
{
cnt50ms = 0;
Frequence = cnt_f;
cnt_f = 0;
}
}
void main(void)
{
Init_System();
Timer01Init();
while(1)
{
Temp_Voltage = ADC(0x03);
Voltage = Temp_Voltage*100/51.0;
DAC(Temp_Voltage,DAC_Flag);
Key_Scan();
Display(node);
LED_Control();
}
}
void LED_Control(void)
{
P0 = 0xff;
if(node==0)
{
L1 = 1;
L2 = 0;
}
else
{
L1 = 0;
L2 = 1;
}
if(Voltage<150)
L3 = 0;
else if(Voltage<250)
L3 = 1;
else if(Voltage<350)
L3 = 0;
else
L3 = 1;
if(Frequence<1000)
L4 = 0;
else if(Frequence<5000)
L4 = 1;
else if(Frequence<10000)
L4 = 0;
else
L4 = 1;
if(DAC_Flag==0)
L5 = 0;
else
L5 = 1;
InitHC138(LED_Channel);
P0 &= ~(L1|(L2<<1)|(L3<<2)|(L4<<3)|(L5<<4));
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 = (P2 & 0x1f);
}
}
void Init_System(void)
{
InitHC138(BEEP_RELAY_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;
}
void Display_All(uint8 date)
{
InitHC138(COM_Channel);
P0 = 0xff;
InitHC138(SMG_Channel);
P0 = date;
InitHC138(0);
}
void Display(node)
{
uint32 date1,date2;
if(SMG_Flag)
{
switch(node)
{
case 0:
Display_Bit(0,TAB[11]),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,TAB[(Voltage/100)%10]-0x80),Delay(1);
Display_Bit(6,TAB[(Voltage%100)/10]),Delay(1);
Display_Bit(7,TAB[Voltage%10]),Delay(1);
Display_All(0xff);
break;
case 1:
Display_Bit(0,TAB[10]),Delay(1);
Display_Bit(1,0xff),Delay(1);
date1 = Frequence/100000;
if(date1)
Display_Bit(2,TAB[date1]),Delay(1);
else
Display_Bit(2,0xff),Delay(1);
date2 = (Frequence%100000)/10000;
if(date2)
Display_Bit(3,TAB[date2]),Delay(1);
else
Display_Bit(3,0xff),Delay(1);
Display_Bit(4,TAB[(Frequence/1000)%10]),Delay(1);
Display_Bit(5,TAB[(Frequence%1000)/100]),Delay(1);
Display_Bit(6,TAB[(Frequence%100)/10]),Delay(1);
Display_Bit(7,TAB[Frequence%10]),Delay(1);
Display_All(0xff);
break;
}
}
else
Display_All(0xff);
}
void Key_Scan(void)
{
if(S4==0)
{
Delay(10);
if(S4==0)
{
node = !node;
while(S4==0)
{
Display(node);
}
}
}
if(S5==0)
{
Delay(10);
if(S5==0)
{
DAC_Flag=!DAC_Flag;
while(S5==0)
{
Display(node);
}
}
}
if(S6==0)
{
Delay(10);
if(S6==0)
{
LED_Flag = !LED_Flag;
while(S6==0)
{
Display(node);
}
}
}
if(S7==0)
{
Delay(10);
if(S7==0)
{
SMG_Flag = !SMG_Flag;
while(S7==0)
{
Display(node);
}
}
}
}
uint8 ADC(uint8 ch)
{
uint8 date;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(ch);
IIC_WaitAck();
//IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
date = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return date;
}
void DAC(uint8 date,uint8 flag)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
if(flag)
IIC_SendByte(date);
else
IIC_SendByte(51*2);
IIC_WaitAck();
IIC_Stop();
}
*/
总结
还没细看,感觉挺简单。