? ? ?考研复习模电,看二极管的温度特性,每升高一度压降减小2.1mv左右,于是产生了做电子温度计的想法。找了一堆1n4148串联起来,用万用表测了一下很灵敏。“传感器” 和AD芯片是有了,但考虑到电路复杂,温度不容易校准等问题,还是决定放弃此方案。
? ? 数字温度传感器最常见的就是DS18B20了,但看了一下PDF发现“1-wire”通信协议相当复杂。又到几家公司的网站上搜了一下,发现Ti的TMP121是SPI的只读型的,控制起来相当简单。于是就按TMP121开始写Verilog。由于通信协议很简单,最麻烦的就是二进制转BCD的问题了,下面引用一种常见的方法:
=======================================================================
用两个寄存器,一个10bit,一个16bit,分别存bin码和有待实现的bcd码。接下来,逐位将BIN的最高位移入BCD的最低位。
同时,将BCD的16位寄存器按每四位划成一块,我们称之为个十百千好了。但记住,个,十,百,千都有4个bit位。
1.将bin[9](bin是bin[9:0])移入bcd[0]。这样,bin[9]就变成了原来的bin[8],bin[0]=0。
2.分别检查个十百千里存的数是不是大于等于5(按二进制换十进制那样换算),如果是,加3。
3.重做1,2。直到全部移进去“======================================================================
? ? ? 因为左移一位相当于×2所以要检查是否大于4,如果大于4的话再乘以2会超过9,所以要加3进行修正。
? ? ?但遗憾的是去电子城买芯片的时候没有买到TMP121,只好买了一片DS18B20回来。然后认真研究了一下数据手册。花了一下午时间写出了雏形,发现其实并没有想象的那么难。也许这就是所谓的世上无难事,只怕有心人吧。
? ? 主要部分就是:初始化、写数据、读数据三部分。然后通过状态机调度各部分的工作。
可怜的液晶屏被压坏了一半,只有一半亮了。室温27度,传感器的线留了很长,可以用来测体温。
1-wire总线上的5K上拉电阻。
体温36.75度。显示的温度根据体温表测的数据进行了加0.125度的修正。分辨率为0.0625度。
用户377235 2012-6-28 17:19