蓝桥杯比赛常用模板总结
这里是引用小蜜蜂老师微信公众号
采用IO模式
一、数码管延时函数和普通函数
/*=======该两个函数会在下面的数码管显示部分和按键函数部分运用========*/
#include "reg52.h"
//数码管延时函数
void DelaySMG(unsigned int t)
{
while (t--);
}
//普通延时函数
void Delay(unsigned int k)
{
while (k--);
}
二、数码管显示部分
/*========比赛时会给出0~9无小数点的断码表,后面的需要自己算========*/
#include "reg52.h"
//带小数点的共阳极数码管断码表
code unsigned char smg_Dot[]={0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10};
//不带小数点的共阳极数码管断码表
code unsigned char smg_NoDot[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsigned int dat_v=0; //电压测量数值(ADC采集部分、DS18B20温度采集部分需要此全局变量)
//锁存器选择函数
void SelectHC573(unsigned char n)
{
switch(n)
{
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;
case 0:P2=(P2&0x1f)|0x00;break;
}
P2=(P2&0x1f)|0x00;
}
//单个数码管显示函数
void DisplaySMG_Bit(unsigned char pos,unsigned char value)
{
P0=0x01<<pos;
SelectHC573(6);
P0=value;
SelectHC573(5);
}
//关闭所有数码管函数
void DisplaySMG_All(unsigned char dat)
{
P0=0xff;
SelectHC573(6);
P0=dat;
SelectHC573(7);
}
/*========根据题目要求来需要显示几个界面,这里我假设数码管显示电压========*/
//数码管显示电压函数
void DisplaySMG_U(void)
{
DisplaySMG_Bit(0,0xc1); //-U- 1100 0001
DelaySMG(200);
DisplaySMG_Bit(0,0xff); //消隐
DelaySMG(200);
DisplaySMG_Bit(1,0xff);
DelaySMG(200);
DisplaySMG_Bit(2,0xff);
DelaySMG(200);
DisplaySMG_Bit(3,0xff);
DelaySMG(200);
DisplaySMG_Bit(4,0xff);
DelaySMG(200);
DisplaySMG_Bit(5,smg_Dot[dav/100]);
DelaySMG(200);
DisplaySMG_Bit(5,0xff); //消隐
DelaySMG(200);
DisplaySMG_Bit(6,smg_Dot[dav/10%10]);
DelaySMG(200);
DisplaySMG_Bit(6,0xff); //消隐
DelaySMG(200);
DisplaySMG_Bit(7,smg_Dot[dav%10]);
DelaySMG(200);
DisplaySMG_Bit(7,0xff); //消隐
DelaySMG(200);
DisplaySMG_All(0xff);
DelaySMG(200);
}
三、ADC、DAC采集部分
#include "reg52.h"
#include "iic.h" //此底层驱动比赛时会给出来
unsigned int temp=0;
//ADC采集函数
void Read_ADC(void)
{
IIC_Start();
IIC_SendByte(0x90); //写地址
IIC_WaitAck();
IIC_SendByte(0x03); //电位器Rb2,光敏电阻是0x01
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91); //读地址
IIC_WaitAck();
temp = IIC_RecByte();
IIC_SendAck(1);
IIC_WaitAck();
IIC_Stop();
dat_v= temp*(5.0 / 255 * 100);
}
//DAC采集函数
void Read_DAC(float dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x43);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
四、温度采集模块函数
#include "reg52.h"
#include "onewire.h"
unsigned int T = 0;
//读取温度
void Read_Temperature(void)
{
unsigned char LSB = 0, MSB = 0;
unsigned int temp = 0;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay(500);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
T = (MSB << 8) | LSB;
//题目不保留小数
T = T >> 4;
//如果题目保留两位小数
if ((T & 0xf800) == 0x0000)
{
T = T*0.0625 * 100;
}
dat_v=T;
}
五、AT24C02部分
#include "reg52.h"
#include "iic.h"
unsigned int temp1 = 0;
//AT24C02 写入数据
void Write_AT24C02(unsigned char addr, unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0); //写地址
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
//AT24C02 读取数据
void Readd_AT24C02(unsigned char addr)
{
IIC_Start();
IIC_SendByte(0xa0); //读地址
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
temp1 = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
}
六、按键函数
/*========以独立按键为例========*/
#include "reg52.h"
//如果题目要求是矩阵键盘,则需写上:sfr P4=0xc0
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
unsigned char interface=1; //界面切换
//按键函数(主函数需要调用)
void ScanKey(void)
{
if(S4==0) //S4用于界面切换
{
Delay(20);
if(S4==0)
{
while(S4==0)
{
DisplaySMG_U(); //初始界面显示函数(根据题目要求修改)
}
if(interface==1)
{
interface=2;
}
else if(interface==2)
{
interface=3;
}
else if(interface==3)
{
interface=1;
}
}
}
if(S5==0)
{
Delay(20);
if(S5==0)
{
whiel(S5==0);
//根据题目要求写相关代码
}
}
if(S6==0)
{
Delay(20);
if(S6==0)
{
whiel(S6==0);
//根据题目要求写相关代码
}
}
if(S7==0)
{
Delay(20);
if(S7==0)
{
whiel(S7==0);
//根据题目要求写相关代码
}
}
}
七、LED灯显示函数
#include "reg52.h"
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
......
//LED显示函数
void LEDRunning(void)
{
//根据题目要求写相关代码
SelectHC573(4);
}
八、其他部分
/*========题目有显示频率的要求========*/
#include "reg52.h"
unsigned int count_f=0; //定时器中断0计数
unsigned int count=0; //定时器中断1计数
unsigned int dat_f=0; //频率测量数值
//定时器函数
void Init_Timer(void)
{
TMOD=0x16;
TH0=0xff;
TL0=0xff;
TH1=(65536-50000)/256; //初值50ms
TL1=(65536-50000)%256;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
//系统初始化函数
void SystemInit(void)
{
P0 = 0xff;
SelectHC573(4);
P0 = 0x00;
SelectHC573(5);
DisplaySMG_All(0xff)
}
//主函数
void main(void)
{
SystemInit();
Init_Timer();
while(1)
{
ScanKey();
switch(interface)
{
case 1:/*数码管显示界面*/;break;
case 2:/*数码管显示界面*/;break;
case 3:/*数码管显示界面*/;break;
}
LEDRunning();
}
}
//定时器0中断服务函数
void Service_Time0() interrupt 1
{
count_f++;
}
//定时器1中断服务函数
void Service_Time1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==20)
{
dat_f=count_f;
count_f=0;
count=0;
}
}
总结:
我们拿到程序题的时候,首先看程序框图把模块写进去,写进去的时候首先要调试数码管能否显示,然后在之后的每一步都需要调试,防止写完白报错或者没有相应的功能。
还有3天就比赛了,加油!冲冲冲!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)