找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2153|回复: 1
打印 上一主题 下一主题
收起左侧

ds18b20 lcd1602显示单片机源代码

[复制链接]
跳转到指定楼层
楼主
ds18b20 lcd1602显示



单片机源代码:
  1. # include <reg52.h>
  2. # include <intrins.h>
  3. # define uchar unsigned char
  4. # define uint unsigned int            //宏定义

  5. void delay_50us(uint t);                   //延时函数
  6. void write_com(uchar com);         //LCD写指令函数
  7. void write_data(uchar dat);        //LCD写数据函数
  8. void init(void);                               //LCD初始化函数
  9. void write_one_byte(uchar dat);    //向DS18B20写入一个字节
  10. uchar  read_one_byte();             //从DS18B20读出一字节
  11. void init_ds18b20();               //DS18b20初始化


  12. sbit rs=P2^6;
  13. sbit rw=P2^5;
  14. sbit e=P2^7;
  15. sbit DQ=P3^7;                   //定义按键

  16. uchar temph,templ;                   //申明温度变量
  17. uchar array[4];                                   //申明数组变量


  18. void delay_50us(uint t)                   //延时函数
  19. {
  20.         uchar j;
  21.         for(;t>0;t--)
  22.         for(j=6245;j>0;j--);
  23. }

  24. void write_com(uchar com)        //LCD写指令函数
  25. {
  26.         e=0;
  27.         rs=0;
  28.         rw=0;
  29.         P0=com;
  30.         delay_50us(10);
  31.         e=1;
  32.         delay_50us(20);
  33.         e=0;        
  34. }

  35. void write_data(uchar dat)      //LCD写数据函数
  36. {
  37.         e=0;
  38.         rs=1;
  39.         rw=0;
  40.         P0=dat;
  41.         delay_50us(10);
  42.         e=1;
  43.         delay_50us(20);
  44.         e=0;        
  45. }

  46. void init(void)                        //LCD初始化函数
  47. {
  48.         delay_50us(300);        
  49.         write_com(0x38);
  50.         delay_50us(100);
  51.         write_com(0x38);
  52.         delay_50us(100);
  53.         write_com(0x38);
  54.         write_com(0x38);
  55.                
  56.     write_com(0x08);
  57.         write_com(0x01);
  58.         write_com(0x06);
  59.         write_com(0x0c);
  60. }

  61. void init_ds18b20()        //DS18b20初始化
  62. {
  63.         uint i,q;
  64.         DQ=1;
  65.         _nop_();
  66.         DQ=0;
  67.         i=70;
  68.         while(i--);
  69.         DQ=1;
  70.         i=0;
  71.         q=DQ;
  72.         delay_50us(2);
  73. }

  74. void write_one_byte(uchar dat)//向DS18B20写入一个字节
  75. {
  76.         uint i, j;
  77.         for(j=0; j<8; j++)
  78.         {
  79.                 DQ=0;         
  80.                 i++;
  81.                 DQ=dat&0x01;  
  82.                 i=6;
  83.                 while(i--);
  84.                 DQ=1;        
  85.                 dat >>= 1;
  86.         }

  87. }

  88. uchar  read_one_byte()//从DS18B20读出一字节
  89. {
  90.         uchar dat;
  91.         uint i, j;        
  92.         for(j=8; j>0; j--)
  93.         {
  94.                 DQ=0;                        //每写入一位数据之前先把总线拉低1us
  95.                 i++;
  96.                 DQ=dat&0x01; //然后写入一个数据,从最低位开始
  97.                 i=6;
  98.                 while(i--); //延时68us,持续时间最少60us
  99.                 DQ=1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  100.                 dat>>=1;
  101.         }                                
  102.         return dat;
  103. }


  104. void main()                                           //主函数
  105. {
  106.         int TEMP;                                   //声明温度变量
  107.         init();                                           //液晶初始化

  108.         while(1)
  109.         {
  110.         
  111.                         init_ds18b20();                         //ds18b20初始化
  112.                         write_one_byte(0xcc);         //跳过ROM操作命令
  113.                         write_one_byte(0x44);         //温度转换命令
  114.                         init_ds18b20();                         //ds18b20初始化
  115.                         write_one_byte(0xcc);         //跳过ROM操作命令
  116.                         write_one_byte(0xbe);         //发送读取温度命令
  117.                         templ=read_one_byte();         //读取温度值共16位,先读低字节
  118.                         temph=read_one_byte();         //再读高字节
  119.                         TEMP=temph;                                 //高8位赋予返回值
  120.                         TEMP <<= 8;                                 //左移8位
  121.                         TEMP|=templ;                         //与低8位
  122.                         if((temph&0xf8)==0xf8)         //如果高8位为0
  123.                         {
  124.                                 write_com(0x80+0x00);        //写地址 80表示初始地址
  125.                         write_data('-');                //显示负号
  126.                                 TEMP=TEMP-1;
  127.                                 TEMP=~TEMP;                                //负数的补码是原码取反,然后再加1。

  128.                         }
  129.                         else                                                  
  130.                         {
  131.                                 write_com(0x80+0x00);  //写地址 80表示初始地址
  132.                         write_data('+');                //显示+
  133.                         }
  134.         
  135.                         TEMP=TEMP*0.0625*10+0.5;           //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  136.                                                  //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  137.                                                 //算由?.5,还是在小数点后面。
  138.                         array[0]=TEMP/1000;                    //百位
  139.                         array[1]=(TEMP%1000)/100;        //十位
  140.                         array[2]=(TEMP%100)/10;            //个位
  141.                         array[3]=TEMP%10;                        //小数
  142.                


  143. …………余下代码请下载附件…………  

复制代码

下载:
ds18b20显示温度.zip (22.03 KB, 下载次数: 49)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:239855 发表于 2017-12-12 22:30 来自手机 | 只看该作者
新人学习,下载看看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表