【蓝桥杯】第十一届单片机省赛
蓝桥杯省赛
题目
暂时没找到pdf
代码参考
#include "reg52.h"
#include "iic.h"
#include "onewire.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
sfr P4 = 0xc0;
sfr AUXR = 0x8e;
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;
sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;
uint8 code TAB[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
uint8 code MTAB[3] = {0xc1,0x8c,0xc8};
void InitHC138(uint8 Channel);
void InitSystem(void);
void Delay(uint32 ms);
void Display_Bit(uint8 pos,uint8 date);
void Display_All(uint8 date);
void Display(uint8 node);
void Key_Scan(void);
uint8 ReadByte(uint8 addr);
void WriteByte(uint8 addr,uint8 date);
uint8 ADC(uint8 ch);
void Calculate_Vpcnt(void);
void LED_Control(void);
uint8 node = 0;
uint8 mode = 0;
uint8 value = 0;
uint32 Vain3 = 0;
uint32 Vp = 200;
uint32 cntN = 0;
uint8 cntflag = 1;
uint8 Exit_flag = 0;
uint8 flag1 = 0;
uint8 flag2 = 0;
uint8 cnt50ms = 0;
uint8 LED1_Flag = 0;
uint8 LED2_Flag = 0;
uint8 LED3_Flag = 0;
uint8 start_flag = 0;
uint8 cnt3 = 0;
void Timer0Init(void) //50毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xB0; //设置定时初始值
TH0 = 0x3C; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void Time0_Hander(void) interrupt 1
{
cnt50ms++;
if(cnt50ms>=100)
{
TR0 = 0;
cnt50ms = 0;
LED1_Flag = 1;
start_flag = 1;
}
}
void main(void)
{
InitSystem();
Timer0Init();
WriteByte(0x00,30);
Delay(10);
Vp = ReadByte(0x00)*10;
Delay(10);
while(1)
{
value = ADC(0x03);
Vain3 = (uint32)(value*500.0/255);//放大100倍
Calculate_Vpcnt();
Key_Scan();
LED_Control();
Display(node);
}
}
void Calculate_Vpcnt(void)
{
if(Vp==500)
{
if(Vain3<500)//未到达
{
flag1 = 1;//允许比较
}
else if(flag1==1&&Vain3<=Vp)
{
flag1 = 0;
if(cntN<99)
cntN++;
}
}
else
{
if(Vain3>Vp)
{
flag2 = 1;
}
else if(flag2==1&&Vain3<=Vp)
{
flag2 = 0;
if(cntN<99)
cntN++;
}
}
}
void LED_Control(void)
{
uint8 date = 0x07;
if(Vain3<Vp)
TR0 = 1;
else
{
LED1_Flag = 0;
cnt50ms = 0;
TR0 = 0;
}
if(cntN%2)
LED2_Flag = 1;
else
LED2_Flag = 0;
if(cnt3>=3)
LED3_Flag = 1;
else
LED3_Flag = 0;
date &= LED1_Flag|(LED2_Flag<<1)|(LED3_Flag<<2);
InitHC138(LED_Channel);
P0 = ~date;
InitHC138(0);
}
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 InitSystem(void)
{
InitHC138(BEEP_RELAY_Channel);
P0 = 0x00;
InitHC138(LED_Channel);
P0 = 0xff;
InitHC138(0);
}
void Delay(uint32 ms)
{
uint32 x,y;
for(x=0;x<ms;x++)
for(y=846;y>0;y--){}
}
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,MTAB[0]),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[Vain3/100]-0x80),Delay(1);
Display_Bit(6,TAB[(Vain3%100)/10]),Delay(1);
Display_Bit(7,TAB[Vain3%10]),Delay(1);
Display_All(0xff);
break;
case 1:
Display_Bit(0,MTAB[1]),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[Vp/100]-0x80),Delay(1);
Display_Bit(6,TAB[(Vp%100)/10]),Delay(1);
Display_Bit(7,TAB[Vp%10]),Delay(1);
Display_All(0xff);
break;
case 2:
Display_Bit(0,MTAB[2]),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[cntN/10]),Delay(1);
Display_Bit(7,TAB[cntN%10]),Delay(1);
Display_All(0xff);
break;
}
}
void Key_Scan(void)
{
R3 = 0, R4 = 1;
C3 = 1, C4 = 1;
if(C3==0)//S13
{
Delay(10);
if(node==2)
{
cnt3 = 0;
if(C3==0)
{
cntN = 0;
while(C3==0)
{
Display(node);
}
}
}
else if(node==1)//无效按键
{
cnt3++;
while(C3==0)
{
Display(node);
}
}
}
if(C4==0)//S17
{
Delay(10);
if(node==1)
{
cnt3 = 0;
if(C4==0)
{
if(Vp<=0)
Vp = 500;
else
Vp-=50;
while(C4==0)
{
Display(node);
}
}
}
else if(node==2)
{
cnt3++;
while(C4==0)
{
Display(node);
}
}
}
R3 = 1, R4 = 0;
C3 = 1, C4 = 1;
if(C3==0)//S12
{
Delay(10);
if(C3==0)
{
cnt3 = 0;//有效
++node;
if(node == 2)
{
//退出参数界面
WriteByte(0x00,Vp/10);//10倍
Delay(5);
}
if(node>=3)
{
node = 0;
}
while(C3==0)
{
Display(node);
}
}
}
if(C4==0&&node==1)//S16
{
Delay(10);
if(node==1)
{
cnt3 = 0;
if(C4==0)
{
if(Vp>=500)
Vp = 0;
else
Vp+=50;
while(C4==0)
{
Display(node);
}
}
}
else if(node==2)
{
cnt3++;
while(C4==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;
}
uint8 ReadByte(uint8 addr)
{
uint8 date;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
date = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return date;
}
void WriteByte(uint8 addr,uint8 date)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(date);
IIC_WaitAck();
IIC_Stop();
}
总结
效果差不多,有些地方参考了别人的。