蓝桥杯之驱动代码解析
【摘要】 @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)