DS18B20读取序列号+1602显示,H我没加进去,序列号开头是28H,我只放进去28.
单片机源程序如下:
- #include <intrins.h>
- #include <lcd.h>
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- #define uchar unsigned char
- #define uint unsigned int
-
- uint temp,flag1;
- int LedOut[4];
- int temper;
- sbit DQ=P3^7;
- uchar sn[8];//存序列号
- uchar code table[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
-
- /*--------- DS18B20-----------*/
- void delay1(unsigned char i)
- {
- while(i--);
- }
- void initionds18b20()
- {
- DQ=0;
- delay1(128); //900us
- DQ=1;
- delay1(1);
- while(DQ); //检测到应答脉冲
- //i=103;while(i>0) i--;//等待870us
- delay1(100);
- }
- uchar readds18b20()
- { uchar i = 0;
- uchar dat = 0;
- for(i=8;i>0;i--)
- {
- DQ = 0; //将总线拉低,要在1us之后释放总线
- //单片机要在此下降沿后的15us内读数据才会有效。
- _nop_(); //至少维持了1us,表示读时序开始
- dat >>= 1; //让从总线上读到的位数据,依次从高位移动到低位。
- DQ = 1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上
- delay1(1); //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
- if(DQ) //控制器进行采样
- {
- dat |= 0x80; //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
- }
- delay1(10); //此延时不能少,确保读时序的长度60us。
- }
- return (dat);
- }
- void writeds18b20(uchar dat)
- {
- uchar i = 0;
- for(i=8;i>0;i--)
- {
- DQ = 0; //拉低总线
- _nop_(); //至少维持了1us,表示写时序(包括写0时序或写1时序)开始
- DQ = dat&0x01; //从字节的最低位开始传输
- //指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
- //因为15us后DS18B20会对总线采样。
- delay1(10); //必须让写时序持续至少60us
- DQ = 1; //写完后,必须释放总线,
- dat >>= 1;
- delay1(1);
- }
- }
- void rom() //读取序列号
- {
- uchar i;
- int j;
- initionds18b20(); //复位
- delay1(1); //延时
- writeds18b20(0x33); //发送读序列号子程序
- for (j=0;j<9;j++)
- {
- sn[j]=readds18b20(); //读取序列号
- }
- }
- /*---------------lLCD----------------------*/
- delay(BYTE ms)
- { // 延时子程序
- BYTE i;
- while(ms--)
- {
- for(i = 0; i< 250; i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- BOOL lcd_bz()
- { // 测试LCD忙碌状态
- BOOL result;
- rs = 0;
- rw = 1;
- ep = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result = (BOOL)(P0 & 0x80);
- ep = 0;
- return result;
- }
- lcd_pos(BYTE pos)
- { //设定显示位置
- LcdWriteCom(pos | 0x80);
- }
- void write_lcd_disp(char Rom)
- {
- uchar i,c,l,h;
-
- l = Rom & 0x0f; //取低4位
- h = Rom & 0xf0; //取高4位
- h >>= 4;
- if( ( h >= 0x00 )&&( h <= 0x09 ) )
- LcdWriteData(h+0x30); //取ASCII码
- else
- LcdWriteData(h+0x37); //取ASCII码
- if( ( l >= 0x00 )&&( l <= 0x09 ) )
- LcdWriteData(l+0x30); //取ASCII码
- else
- LcdWriteData(l+0x37); //取ASCII码
-
- delay(1);
- }
- void main()
- {
- int k;
- uchar a,b,c,d,e,f,g,h,j;
- LcdInit(); // 初始化LCD
-
- rom();
- a=sn[0]; //调用读序列号子程序
- b=sn[1];
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
ds18b20读取序列号 16022.rar
(40.62 KB, 下载次数: 77)
|