找回密码
 立即注册

QQ登录

只需一步,快速开始

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

18b20与单片机串口结合,实时接收,检测温度程序

[复制链接]
跳转到指定楼层
楼主
ID:507222 发表于 2019-4-25 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
18b20检测温度,显示在数码管上,同过串口发送到电脑

单片机源程序如下:
  1. #include <at89x51.h>

  2. sbit DQ =     P2 ^ 6;  //定义端口DQ

  3. sbit led1    =P2^0;
  4. sbit led2    =P2^1;
  5. sbit led3    =P2^2;
  6. sbit led4    =P2^3;
  7. #define BCD unsigned char
  8. #define shi unsigned char
  9. unsigned char tx[10]={0,0,0x2E,0,0,0,0,0xDF,0x43,0x0A};

  10. unsigned code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
  11.                         0xf8,0x80,0x90};

  12. void Delay(int num)//延时函数
  13. {
  14.         while(num--) ;
  15. }

  16. void Delaynms(unsigned int di) //延时
  17. {
  18.         unsigned int da,db;
  19.          for(da=0;da<di;da++)
  20.                    for(db=0;db<100;db++);
  21. }

  22. void Init_DS18B20(void)//初始化ds1820
  23. {
  24.         unsigned char x=0;
  25.         DQ = 1;    //DQ复位
  26.         Delay(8);  //稍做延时
  27.         DQ = 0;    //单片机将DQ拉低
  28.         Delay(80); //精确延时 大于 480us
  29.         DQ = 1;    //拉高总线
  30.         Delay(14);
  31.         x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  32.         Delay(20);
  33. }


  34. unsigned char ReadOneChar(void)//读一个字节
  35. {
  36.         unsigned char i=0;
  37.         unsigned char dat = 0;
  38.         for (i=8;i>0;i--)
  39.         {
  40.                 DQ = 0; // 给脉冲信号
  41.                 dat>>=1;
  42.                 DQ = 1; // 给脉冲信号
  43.                 if(DQ)
  44.                 dat|=0x80;
  45.                 Delay(4);
  46.         }
  47.         return(dat);
  48. }


  49. void WriteOneChar(unsigned char dat)//写一个字节
  50. {
  51.         unsigned char i=0;
  52.         for (i=8; i>0; i--)
  53.         {
  54.                 DQ = 0;
  55.                 DQ = dat&0x01;
  56.                 Delay(2);
  57.                 DQ = 1;
  58.                 dat>>=1;
  59.         }
  60. }


  61. void ReadTemperature(void)//读取温度
  62. {
  63.         unsigned char a=0;
  64.         unsigned char b=0;
  65.         unsigned char Data_L=0;
  66.         unsigned char num=0;

  67.         Init_DS18B20();

  68.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  69.         WriteOneChar(0x44); // 启动温度转换
  70.         Init_DS18B20();
  71.         WriteOneChar(0xCC); //跳过读序号列号的操作
  72.         WriteOneChar(0xBE); //读取温度寄存器

  73.         a=ReadOneChar();  //读低8位
  74.         b=ReadOneChar(); //读高8位

  75.     tx[0] = (a/16+b*16)/10;      //整数部分


  76.         tx[1] = (a/16+b*16)%10;

  77.     Data_L=a&0X0F;
  78.     for(num=3;num<7;num++)                 //小数部分
  79.    {
  80.       Data_L=Data_L*10;                                 //10           //100                //40                 //80
  81.      tx[num]=Data_L/16;                         //0          //6                        //2                         //5
  82.       Data_L=Data_L%16;                                 //10           //4                        //8
  83.         }

  84. }

  85. void Display_SMG(void)
  86. {
  87.    unsigned char a;
  88.    for(a=0;a<=50;a++)
  89.    {
  90.            P0=table[tx[0]];
  91.            P2_0 = 0;
  92.            Delaynms(5);
  93.            P2_0 = 1;
  94.         
  95.            P0=(table[tx[1]])&0x7f;
  96.            P2_1 = 0;
  97.            Delaynms(5);
  98.            P2_1 = 1;
  99.         
  100.            P0=table[tx[3]];
  101.            P2_2 = 0;
  102.            Delaynms(5);
  103.            P2_2 = 1;
  104.         
  105.            P0=table[tx[4]];
  106.            P2_3 = 0;
  107.            Delaynms(5);
  108.            P2_3 = 1;
  109.    }
  110. }
  111. void b(unsigned int baud)
  112. {
  113.         SCON=0x50;//0101  0000
  114.         TMOD &=0x0F;
  115.         TMOD |=0x20;
  116.         TH1=TL1=(256-11059200)/12/2/16/baud;
  117.         ET1=0;
  118.         TR1=1;
  119. }

  120. void main(void)
  121. {  
  122.         BCD w,a,s,d;
  123.         shi z,x,c,v;
  124.         Init_DS18B20();
  125.         while(1)
  126.         {                 
  127.                 ReadTemperature();         
  128.                 Display_SMG();         
  129.                 b(9600);
  130.         w=(table[tx[0]]/10*16)+(table[tx[0]]%10);
  131.         z=((w>>4)*10+(w&0x0f));

  132.                 SBUF=z;
  133.                 while(TI==0);
  134.              TI=0;
  135.                  Delay(1000);
  136.                 a=(table[tx[1]]&0x7f/10*16)+(table[tx[1]]&0x7f%10);
  137.                 x=((a>>4)*10+(a&0x0f));
  138.                 SBUF=x;
  139.                 while(TI==0);
  140.              TI=0;
  141.                  Delay(1000);
  142.                 s=(table[tx[3]]/10*16)+(table[tx[3]]%10);
  143.                 c=((s>>4)*10+(s&0x0f));
  144.                                 SBUF=c;
  145.                 while(TI==0);
  146.              TI=0;
  147.                  Delay(1000);
  148.                 d=(table[tx[4]]/10*16)+(table[tx[4]]%10);
  149.                 v=((d>>4)*10+(d&0x0f));
  150.                                 SBUF=v;
  151.                 while(TI==0);
  152.              TI=0;
  153.      Delay(1000);
  154.         }         
  155. }
复制代码

所有资料51hei提供下载:
串口温度.rar (40.68 KB, 下载次数: 17)



评分

参与人数 2黑币 +55 收起 理由
yangjx1984 + 5
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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