前言
本文主要带大家了解驱动代码,以及比赛官方在驱动代码下的套。
一、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);
总结
驱动代码就讲到这里,大家有什么问题可以留言或者私信。记得帮忙点赞哦。