蓝桥杯(单片机组)学习笔记(五)--------ADDA/DS18B20

1.AD(PCF8591)

PCF8591 是单片、单电源低功耗8 位CMOS 数据采集器件,具有4 个模拟输入、一个输出和一个串行I2C 总线接口。3 个地址引脚A0、A1 和A2 用于编程硬件地址,允许将最多8 个器件连接至I2C总线而不需要额外硬件。器件的地址、控制和数据通过两线双向I2C 总线传输。器件功能包括多路复用模拟输入、片上跟踪和保持功能、8 位模数转换和8 位数模拟转换。最大转换速率取决于I2C 总线的最高速率。今天只研究AD的运用,DA要用到再说。
lqb板子上的AD采集通道(A0外接排插)
①原理图
在这里插入图片描述
在这里插入图片描述
PCF8591具有4个模拟输入(AIN0~AIN3)、1个模拟输出(AOUT)和1个串行I²C总线接口(SDA、SCL)。
准备用AIN3做一个动态数码管显示电压值,通过调节变阻器改变电压值,使用到了I2C总线驱动程序,PCF8591驱动程序。

②PCF8591的地址/总线协议
在这里插入图片描述
所以我们结合原理图,地址应该是1001 0000 ,HEX就是0X90(写),0X91(读)。
在这里插入图片描述
一般用的多的都是A/D转换,即读模式的总线协议。代码思路:通道三,电位器改变电压,ADC采集在数码管上显示,保留两位小数。(部分代码)

void main(void)
{
	All_Init();
	while(1)
	{
		Display(PCF8591_Trans());
	}
}

void PCF8591_DAC(unsigned char dat)//channel
{
	IIC_Start();
	IIC_SendByte(0x90); //发送写命令
	IIC_WaitAck();
	IIC_SendByte(0x04);  //选择DAC输出
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
	Delay_ms(10);
}

uchar PC8591_ADC()
{
	uchar dat;
	
	IIC_Start();
	IIC_SendByte(0x90);   //发送起始地址 写命令
	IIC_WaitAck();
	IIC_SendByte(0x03);   //初始化通道三  03
	IIC_WaitAck();
	
	IIC_Start();//再次重启
	IIC_SendByte(0x91);//发送读命令
	IIC_WaitAck();
	dat = IIC_RecByte();
	IIC_Ack(0);
	IIC_Stop();
	
	return dat;
}

uint PCF8591_Trans()//把AD值转化为电压
{
	uint AD_Num;//AD值
	float value;//电压值
	AD_Num = PC8591_ADC();//0~255 8位AD/DA
	value = AD_Num*0.01953;//转换为电压值 0-5v.0-255
	AD_Num = value*100;//保留两位小数
	
	return AD_Num;
}

在数码管进行显示的时候,发现循环到最后一位显示的时候,老是出现频闪,于是在最后一位再位选关闭清零一下,加上以下代码。我在验证是不是数码管还需要加一点代码,后面再看效果改改。(找到问题了,是驱动延时的时间还不够,原来有5个_nop_(),现在改成15个_nop_()了)

	P2 = (P2 & 0x1f | 0xc0);    //消隐
	P0 = 0X00;                  //消除最后一位过亮
	P2 &= 0X1F;v

2.DS18B20

①可编程分辨率的单总线. 数字温度计。DS18B20 数字温度计提供9至12位的摄氏温度测量, 并具有易失性的用户可编程触发点的上限和下限报警功能。DS18B20 单总线通信按定义只需要一条数据线(和地线)与中央微处理器进行通信。它具有工作温度范围55°C + 125 °C和准确±0.5 °C范围- 10 °C + 85 °C.此外, DS18B20 可以导出功率直接从数据线( “寄生虫”),消除了外部电源需要。
每DS18B20 都有一个唯一的64位串行码,它允许多个DS18B20 在同一根总线功能。
在这里插入图片描述
在这里插入图片描述
②DS18B20内部结构图
在这里插入图片描述(1) 64 位ROM。它的内容是64 位序列号,它可以被看作是该DS18B20 的地址序列码,其作用是使每个DS18B20 都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。

(2) 9字节暂存器包含:温度传感器、上限触发TH高温报警器、下限触发TL低温报警器、高速暂存器、8位CRC产生器。

③64位ROM结构图
在这里插入图片描述

8位CRC:是单总线系列器件的编码,DS18B20定义为28H。
48位序列号:是一个唯一的序列号。
8位系列码:由CRC产生器生产,作为ROM中的前56位编码的校验码。

④字节暂存器结构图

这里写图片描述

以上是内部9 个字节的暂存单元(包括EEPROM)。
字节0~1 是温度存储器,用来存储转换好的温度。
字节2~3 是用户用来设置最高报警和最低报警值。这个可以用软件来实现。
字节4 是配置寄存器,用来配置转换精度,让它工作在9~12 位。
字节5~7 保留位。
字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。

在这里插入图片描述
以上是内部9 个字节的暂存单元(包括EEPROM)。
字节0~1 是温度存储器,用来存储转换好的温度。
字节2~3 是用户用来设置最高报警和最低报警值。这个可以用软件来实现。
字节4 是配置寄存器,用来配置转换精度,让它工作在9~12 位。
字节5~7 保留位。
字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。
⑤温度寄存器结构图
在这里插入图片描述
温度寄存器由两个字节组成,分为低8位和高8位。一共16位。
其中,第0位到第3位,存储的是温度值的小数部分。
第4位到第10位存储的是温度值的整数部分。
第11位到第15位为符号位。全0表示是正温度,全1表示是负温度。
表格中的数值,如果相应的位为1,表示存在。如果相应的位为0,表示不存在。

存储在18B20的两个8bit的RAM中
读温度寄存器时(整数数值),应该取LS Byte的高四位,MS Byte的低四位。设 High,Low都是只占4bit的uchar类型,temp是8bit的uint类型;

读温度寄存器时(带小数的数值),应将High先赋给temp(temp此时是16bit的int类型),并左移8位到高八位,最后再把LOW赋值给低八位。

温度值一般都是两位整数,这时候要取小数,最后把Temp0.0625100就行了。特别注意的是,我的数码管是从最后一位依次向前显示的!

⑥配置寄存器

在这里插入图片描述
精度值:
9-bit 0.5℃
10-bit 0.25℃
11-bit 0.125℃
12-bit 0.0625℃(最后得到的小数温度再×0.0625就行了)

⑦温度/数据关系
在这里插入图片描述
二.单总线协议
1.单总线通信初始化
2.位写入时序
3.位读取时序
4.DS18B20的ROM操作命令 (常用)
用途:主要是用于选定在单总线上的DS18B20,分为2个命令
(1).温度变换,代码为44H
(2).跳过ROM,代码为CCH,当总线仅有一个DS18B20时,不需要匹配 。
(3)读暂存存储器,代码为BEH
附上部分代码:


int Read_Temper ()
{
	uchar High,Low;
	int temp;
	
	Init_DS18B20();
	Write_DS18B20(OW_SKIP_ROM);//跳过ROM指令
	Write_DS18B20(DS18B20_CONVERT);//启动温度转换
	Delay_OneWire(200);//注意保持500ms以上的延时
	
	Init_DS18B20();
	Write_DS18B20(OW_SKIP_ROM);
	Write_DS18B20(DS18B20_READ);//启动读命令
	Low = Read_DS18B20();//先读低字节
	High = Read_DS18B20();
//	temp = (High <<4)|(Low>>4);//此时返回temp则为整数,Temp要变成成uint
	
	/*精度为0.0625摄氏度*/
	temp = High;
	temp = (temp<< 8)|Low;
	
	if(temp < 0)//以补码的形式给出
	{
		temp = ~(temp -1);
	}
	temp *= 0.0625*100;//多给了两位小数出来
	return temp;
}
	
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值