蓝桥杯之驱动代码解析

举报
yd_274589494 发表于 2023/07/22 09:51:24 2023/07/22
【摘要】 @TOC 前言本文主要带大家了解驱动代码,以及比赛官方在驱动代码下的套。 一、DS18B20官方下套点://单总线延时函数void Delay_OneWire(unsigned int t) //STC89C52RC{ t*=11; while(t--);}此函数官方会把t*=11删除,大家在比赛时记得把这个写上,忘记写上这个会导致数据读取错误。自己编写代码部分:float read_te...

@TOC

前言

本文主要带大家了解驱动代码,以及比赛官方在驱动代码下的套。

一、DS18B20

官方下套点:

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	t*=11;
	while(t--);
}

此函数官方会把t*=11删除,大家在比赛时记得把这个写上,忘记写上这个会导致数据读取错误。

自己编写代码部分:

float read_temp()
{
	float temp;//定义一个float类型变量(读取出来的温度是小数)
	unsigned char low,high;//(定义温度高8位和低8位)
	init_ds18b20();//初始化DS18B20
	Write_DS18B20(0xcc);//忽略rom指令
	Write_DS18B20(0x44);//温度转换指令
	Delay_OneWire(200);
	init_ds18b20();
	Write_DS18B20(0xcc);//忽略rom指令
	Write_DS18B20(0xbe);//读取暂存器的内容
	low=Read_DS18B20();//读出温度低8位
	high=Read_DS18B20();//读出温度高8位
	temp=(high<<8|low)*0.0625;//得到实际温度值
	
	return temp;
}

编写好上面函数我们在获取温度时就可直接调用此函数得到温度值。

有的朋友对0.0625可能不是很理解,我们从DS18B20里面读取出来的只不过是16位二进制数,并不是我们想要的十进制温度值。加上0.0625即可转为我们想要的温度值。(有其他想法的朋友可以告诉我)

二、IIC

1.IIC通信协议

IIC通信协议是常用的一种多主设备协议,通信过程中有一根SDA数据线和一根SCL时钟线连接各个设备,一个IIC总线上可挂接多个主设备和从设备。
下面的函数都要求我们自己编写。

2.读写AT24C02

//AT24C02写函数
void Write_24C02(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读函数
unsigned char Read_24C02(unsigned char addr)
{
	unsigned char data;
	IIC_Start();					//起始信号			
	IIC_SendByte(0xa0); 			//设备写地址
	IIC_WaitAck();					//等待应答
	IIC_SendByte(addr); 			//发送内存字节地址
	IIC_WaitAck(); 					//等待应答
 
	IIC_Start();					//起始信号
	IIC_SendByte(0xa1); 			//设备读地址
	IIC_WaitAck();					//等待应答
	data = IIC_RecByte();			//读出目标数据
	IIC_Ack(0); 					//产生非应答信号
	IIC_Stop();						//停止信号
	return data;
}


3.读取ADC

//addr:在单片机上面有三个电阻地址分别为0x01 0x02 0x03(没有记错的话)
unsigned char Read_ADC(unsigned char addr)
{
    unsigned char Data;				//保存AD采样值
	IIC_Start();					//起始信号
	IIC_SendByte(0x90); 			//设备写地址
	IIC_WaitAck();  				//等待应答
	IIC_SendByte(addr); 			//设置控制寄存器
	IIC_WaitAck();  				//等待应答
	IIC_Stop(); 					//停止信号
	
	IIC_Start();					//起始信号
	IIC_SendByte(0x91); 			//设备读地址
	IIC_WaitAck(); 				    //等待应答
	Data= IIC_RecByte(); 	    	//读取当前通道的数据
	IIC_Ack(0); 					//产生非应答信号
	IIC_Stop(); 					//停止信号

	return Data;
}

注意点:很多朋友在同时使用AD和DA转换的时候会发现这两个不能同时使用,根据IIC通信协议规则需要对代码稍作改动。
比如只使用AD时读取Rb3的值写的是:Rb3=Read_ADC(0x03);
同时使用时要改为:Rb3=Read_ADC(0x43);

总结

驱动代码就讲到这里,大家有什么问题可以留言或者私信。记得帮忙点赞哦。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。