栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【蓝桥杯】第十一届单片机省赛

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【蓝桥杯】第十一届单片机省赛

【蓝桥杯】第十一届单片机省赛

蓝桥杯省赛

【蓝桥杯】第十一届单片机省赛题目代码参考总结

题目

代码参考
#include "reg52.h"
#include "iic.h"
#include "onewire.h"


typedef unsigned char uint8;
typedef unsigned int uint32;

#define LED_Channel  		4
#define BEEP_DELAY_Channel  5
#define COM_Channel  		6
#define SMG_Channel  		7

sfr P4 = 0xc0;
sfr AUXR = 0x8e;

//数码管编码
uint8 code TAB[19] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f,0x8c};
//带小数点
uint8 code Dot_TAB[16]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e} ;

//独立按键   J5:23
sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;
sbit S7 = P3^0;

uint8 node = 0;
uint32 temp;
uint8 tmax = 30;
uint8 tmin = 20;
uint8 tmode = 1;
uint8 pretmax = 30;
uint8 pretmin = 20;
uint8 errflag = 0;
void Delay(uint32 ms);
void InitHC138(uint8 Channel);
void Init_System(void);
void Display_Bit(uint8 pos,uint8 date);
void Display_All(uint8 date);
void Display(uint8 node);
void Key_Scan(void);
void Read_Temp(void);
void SMG_Delay(uint32 t);
void DAC(uint8 date);
void DAC_Hander(void);
void main()
{
	Init_System();
	
	while(1)
	{
		if(node == 0)
			Read_Temp();
		Key_Scan();
		Display(node);
		DAC_Hander();
	}
}
void DAC_Hander(void)
{
	P0 = 0xff;
	if(temp>tmax)
	{
		DAC(255*4/5);
		P0&=0xfe;//L1
	}
	else if(temp=tmin)
	{
		DAC(255*3/5);
		P0&=0xfd;//L2
	}
	if(node==0)
		InitHC138(LED_Channel);
	if(errflag == 1)
	{
		P0&=0xf7;//L4
	}
	InitHC138(0);
	
}
void Delay(uint32 ms)
{
	uint32 x,y;
	for(x=0;x0;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 &= 0x1f;
	}
}
void Init_System(void)
{
	InitHC138(BEEP_DELAY_Channel);
	P0 = 0x00;
	InitHC138(LED_Channel);
	P0 = 0xff;
	InitHC138(0);
}

void Display_Bit(uint8 pos,uint8 date)
{
	InitHC138(COM_Channel);
	P0 = 0x01<=2)
				node = 0;
			if(node)
			{
				pretmax = tmax;
				pretmin = tmin;
				tmode = 1;
			}
			else
			{
				if(tmax=2)
				tmode = 0;
			while(S5==0);
		}
	}
	
	if(S6==0)
	{
		Delay(10);
		if(S6==0)
		{
			switch(tmode)
			{
				case 0:
					if(tmax<99)
						++tmax;
					break;
				case 1:
					if(tmin<99)
						++tmin;
					break;
			}
			
			while(S6==0);
		}
	}
	
	if(S7==0)
	{
		Delay(10);
		if(S7==0)
		{
			
			switch(tmode)
			{
				case 0:
					if(tmax>0)
						--tmax;
					break;
				case 1:
					if(tmin>0)
						--tmin;
					break;
			}
			while(S7==0);
		}
	}
}

//初始化,跳过rom,操作
//前5位是符号位,后4位是小数位,小数存放在LSB(低位先读),//0.0625*10
void Read_Temp(void)
{
	uint8 LSB,MSB;
	
	init_ds18b20();
	Write_DS18B20(0xcc);  //跳过ROM指令
	Write_DS18B20(0x44);	//开始温度转换
	SMG_Delay(50);
	//可用 Delay_oneWire(200);	   // 延时一段时间
	
	init_ds18b20();
	Write_DS18B20(0xcc);	//跳过ROM指令
	Write_DS18B20(0xbe);	//读取高速暂存器
	
	LSB =Read_DS18B20();  //读取第一个字节
	MSB =Read_DS18B20();	//读取第二字节

	temp = (MSB<<8)|LSB;
	
	//包含小数 ,如果不包含小数,直接将temp右移4位即可
	if((temp & 0xf800)== 0x0000)  //判断高五位符号位是否为0 ,即是否为证书
	{
		temp = temp>>4;
//		temp = temp * 10;
//		temp = temp + (LSB & 0x0f)*0.625 ;//0.0625*10
	}
	
}

void DAC(uint8 date)	// 输入值需要转换
{

	IIC_Start();
	IIC_SendByte(0x90);		
	IIC_WaitAck();				
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(date);
	IIC_WaitAck();
	IIC_Stop();
}




总结

效果差不多,具体对不对还没细看。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779016.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号