【蓝桥杯】第九届单片机省赛
蓝桥杯省赛
题目
代码参考
#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};
uint8 LED_Flow[3][8] = {~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80,
~0x80,~0x40,~0x20,~0x10,~0x08,~0x04,~0x02,~0x01,
0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e};
uint32 LED_Time[4] = {1200,800,600,400};
sfr P4 = 0xc0;
sfr AUXR = 0x8e;
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
uint8 LED_Date = ~0x01;
uint32 cnt_flow = 0;
uint8 pwm;
uint8 cnt_smg = 0;
uint8 node = 0;//0 1 2
uint8 mode = 0;//0 1 2 3
uint8 LED_Count = 0;
uint8 cnt800ms_flag = 1;
uint8 rank = 0;
uint8 start_flag = 0;
uint8 Voltage = 0;
uint8 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 Key_Scan(void);
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void Timer1Init(void) //40毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xC0; //设置定时初始值
TH1 = 0x63; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
EA = 1;
}
void Time0_Hander(void) interrupt 1
{
if(start_flag==1)
{
pwm++;
if(pwm<=(LED_Time[LED_Count/8+LED_Count/20]/4.0)*rank/100.0)
{
if(flag)
{
flag = 0;
InitHC138(LED_Channel);
P0 = LED_Date;
InitHC138(0);
}
}
else
{
if(flag==0)
{
flag = 1;
InitHC138(LED_Channel);
P0 = 0xff;
InitHC138(0);
}
}
if(pwm>=LED_Time[LED_Count/8+LED_Count/20]/100.0)
{
pwm = 0;
flag=1;
}
cnt_flow++;
if(cnt_flow>=LED_Time[LED_Count/8+LED_Count/20])
{
cnt_flow = 0;
++LED_Count;
if(LED_Count>=24)
LED_Count = 0;
LED_Date = LED_Flow[LED_Count/8][LED_Count%8];
flag = 1;
}
}
}
void Time1_Hander(void) interrupt 3
{
cnt_smg++;
if(cnt_smg>=20)
{
cnt_smg = 0;
if(node!=0)
cnt800ms_flag=!cnt800ms_flag;
else
cnt800ms_flag = 1;
}
}
void main(void)
{
Init_System();
Timer0Init();
Timer1Init();
while(1)
{
Voltage = ADC(0x03);
if(Voltage<=(255.0/4))
rank = 1;
else if(Voltage<=(255.0*2/4))
rank = 2;
else if(Voltage<=(255.0*3/4))
rank = 3;
else
rank = 4;
Key_Scan();
Display(node);
}
}
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;
InitHC138(0);
}
void Display_All(uint8 date)
{
InitHC138(COM_Channel);
P0 = 0xff;
InitHC138(SMG_Channel);
P0 = date;
InitHC138(0);
}
void Display(node)
{
switch(node)
{
case 0:
Display_All(0xff);
break;
case 1:
if(cnt800ms_flag)
{
Display_Bit(0,TAB[0]),Delay(2);
Display_Bit(1,TAB[mode+1]),Delay(2);
Display_Bit(2,TAB[0]),Delay(2);
}
else
{
Display_Bit(0,0xff),Delay(2);
Display_Bit(1,0xff),Delay(2);
Display_Bit(0,0xff),Delay(2);
}
Display_Bit(3,0xff),Delay(2);
if(LED_Time[mode]/1000)
Display_Bit(4,TAB[LED_Time[mode]/1000]),Delay(2);
else
Display_Bit(4,0xff),Delay(2);
Display_Bit(5,TAB[(LED_Time[mode]%1000)/100]),Delay(2);
Display_Bit(6,TAB[(LED_Time[mode]%100)/10]),Delay(2);
Display_Bit(7,TAB[LED_Time[mode]%10]),Delay(2);
Display_All(0xff);
break;
case 2:
Display_Bit(0,TAB[0]),Delay(2);
Display_Bit(1,TAB[mode+1]),Delay(2);
Display_Bit(2,TAB[0]),Delay(2);
Display_Bit(3,0xff),Delay(2);
if(cnt800ms_flag)
{
if(LED_Time[mode]/1000)
Display_Bit(4,TAB[LED_Time[mode]/1000]),Delay(2);
else
Display_Bit(4,0xff),Delay(2);
Display_Bit(5,TAB[(LED_Time[mode]%1000)/100]),Delay(2);
Display_Bit(6,TAB[(LED_Time[mode]%100)/10]),Delay(2);
Display_Bit(7,TAB[LED_Time[mode]%10]),Delay(2);
}
else
{
Display_Bit(4,0xff),Delay(2);
Display_Bit(5,0xff),Delay(2);
Display_Bit(6,0xff),Delay(2);
Display_Bit(7,0xff),Delay(2);
}
Display_All(0xff);
break;
case 3:
Display_Bit(0,0xff),Delay(2);
Display_Bit(1,0xff),Delay(2);
Display_Bit(2,0xff),Delay(2);
Display_Bit(3,0xff),Delay(2);
Display_Bit(4,0xff),Delay(2);
Display_Bit(5,0xff),Delay(2);
Display_Bit(6,TAB[0]),Delay(2);
Display_Bit(7,TAB[rank]),Delay(2);
Display_All(0xff);
break;
}
}
void Key_Scan(void)
{
if(S4==0)
{
Delay(10);
if(S4==0)
{
if(node==1)
{
if(mode<=0)
mode = 3;
else
--mode;
}
else if(node==2)
{
if(LED_Time[mode]<=500)
LED_Time[mode] = 400;
else
LED_Time[mode] = LED_Time[mode] - 100;
}
if(node!=0)
{
while(S4==0)
{
Display(node);
}
}
else
{
while(S4==0)
{
Display(3);
}
}
}
}
if(S5==0)
{
Delay(10);
if(S5==0)
{
if(node==1)
{
if(mode>=3)
mode = 0;
else
++mode;
}
else if(node==2)
{
if(LED_Time[mode]>=1100)
LED_Time[mode] = 1200;
else
LED_Time[mode] = LED_Time[mode] + 100;
}
while(S5==0)
{
Display(node);
}
}
}
if(S6==0)
{
Delay(10);
if(S6==0)
{
++node;
if(node>=3)
{
node = 0;
mode = 0;
}
cnt_smg = 0;
cnt800ms_flag = 1;
while(S6==0)
{
Display(node);
}
}
}
if(S7==0)
{
Delay(10);
if(S7==0)
{
start_flag = !start_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;
}
总结
还没细看,感觉挺简单。