蓝桥杯比赛常用模板总结

蓝桥杯比赛常用模板总结,第1张

蓝桥杯比赛常用模板总结

这里是引用小蜜蜂老师微信公众号

采用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天就比赛了,加油!冲冲冲!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/564423.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存