迅维网

查看: 1882|回复: 0
打印 上一主题 下一主题

STC12C5A60单片机加DS18B20多路温度采集并显示1820的序列号

[复制链接]
跳转到指定楼层
1#
发表于 2016-8-27 07:12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: 中国 来自 中国

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x


  •         功   能:读取序列号并匹配序列号,并读温度值
  •                          多功能试验板显示多路温度采集
  •                          正常显示2个DS18B20温度
  •                          正常读取DS18B20序列号
  •         单片机:STC12C5A60S2
  •         晶  振:11.0592M
  •         作  者:苏义江改编自网络
  •         时  间:2016-8-25
  • ************************************************/
  • #include <reg52.h>
  • #include <intrins.h>
  • #define uchar unsigned char
  • #define uint unsigned int
  • sbit RS=P2^7;
  • sbit RW=P2^6;
  • sbit EN=P2^5;
  • sbit DQ=P3^4; //传感器引脚
  • sbit key=P3^7;
  • sbit d1=P1^3;//指示灯
  • sbit d2=P1^4;
  • bit st=1;
  • uchar code table0[]={"DuoLuWenDuXS:U  "};
  • uchar code table2[]={"SD:  "}; //湿度
  • uchar code table1[]={"0123456789ABCDEF"};
  • //现有的2个DS18B20传感器的序列号ROM1,ROM2
  • uchar DSrom[4][8]={//4个器件每个64位序列号
  •         {0x28,0xff,0x2a,0x0A,0x22,0x04,0x00,0xf6},//ROM1
  •         {0x28,0xFF,0x0b,0x0d,0x20,0x04,0x00,0x0a},//ROM2
  •         {0x28,0x0C,0xBA,0xBA,0x02,0x00,0x00,0x54},//ROM3
  •         {0x28,0xff,0x91,0x14,0x22,0x04,0x00,0xe4}//ROM4
  •         };
  • int f[4]; //温度数组
  • int tvalue; //温度值变量
  • float ftvalue; //温度值变量
  • uchar fCode[8];//序列号数组
  • uint warnl=300; //设定温度值高
  • uint warnh=992;//设定温度值低
  • void ds1820wr(uchar dat);//写数据
  • void ds1820rst();//ds1820复位
  • uchar ds1820rd();//读数据
  • void DispCode();//读取序列号
  • uchar tflag;//温度正负标志
  • //////////lcd1602程序////////////
  • void delay1ms(uint ms)//延时1毫秒(不够精确的)
  • {
  •         uint i,j;
  •         for(i=0;i<ms;i++)
  •         for(j=0;j<620;j++);
  • }
  • void wr_com(uchar com)//写指令//
  • {
  •         delay1ms(1);
  •         RS=0;
  •         RW=0;
  •         EN=0;
  •         P0=com;
  •         delay1ms(1);
  •         EN=1;
  •         delay1ms(1);
  •          EN=0;
  • }
  • void wr_dat(uchar dat)//写数据//
  • {
  •         delay1ms(1);;
  •         RS=1;
  •         RW=0;
  •         EN=0;
  •         P0=dat;
  •         delay1ms(1);
  •         EN=1;
  •         delay1ms(1);
  •         EN=0;
  • }
  • void lcd_init()//1602初始化设置//
  • {
  •         delay1ms(15);
  •         wr_com(0x38);
  •         delay1ms(5);
  •         wr_com(0x08);delay1ms(5);
  •         wr_com(0x01);delay1ms(5);
  •         wr_com(0x06);delay1ms(5);
  •         wr_com(0x0c);delay1ms(5);
  • }
  • void display(uchar *p)//显示字符串
  • {
  •         while(*p!='\0')
  •         {
  •                 wr_dat(*p);
  •                 p++;
  •                 delay1ms(1);
  •         }
  • }
  • void displayinit()//初始化显示
  • {
  •         lcd_init();
  •         wr_com(0x80);
  •         display(table0);
  •         wr_com(0xC6);
  •         wr_dat(0xdf);
  •         wr_com(0xC7);
  •         wr_dat('C');
  •         wr_com(0xCf);
  •         wr_dat(0x25);
  •         wr_com(0XC9);
  •         display(table2);
  • }
  • void tmstart()//初始化ds18b20
  • {
  •         DQ=1;
  •         d1=1;
  •         d2=1;
  •         ds1820rst();
  •         delay1ms(1);
  •         ds1820wr(0xcc);
  •         ds1820wr(0x44);
  • }
  • void read_dealtemp()//读取并处理温度
  • {
  •         uchar i,j,t;
  •         uchar a,b;
  •         for(j=0;j<5;j++)  //挂载4个设备
  •         {
  •                 ds1820rst();  //复位
  •                 delay1ms(1);
  •                 ds1820wr(0x55);  //匹配EOM指令
  •                 for(i=0;i<8;i++)
  •                 {
  •                         ds1820wr(DSrom[j]);//发送64位序列号
  •                 }
  •                 ds1820wr(0xbe);//温度转换
  •                 a=ds1820rd();   //读高位
  •                 b=ds1820rd();  //读低位
  •                 tvalue=b;
  •                 tvalue<<=8;
  •                 tvalue=tvalue|a;
  •                 if(tvalue<0)   //判断正负温度
  •                 {
  •                         d1=1;
  •                         tvalue=~tvalue+1;
  •                         wr_com(0xc0);   //第二行第一列
  •                         wr_dat(0x2d);    //负温度符号"-"
  •                         if(tvalue<warnl) //温度高于设定值warnl=300;
  •                         {
  •                                 d2=0;     //报警
  •                                 DQ=0;
  •                         }
  •                         else
  •                         {
  •                                 d2=1;
  •                                 DQ=1;
  •                         }
  •                 }
  •             else
  •                 {
  •                         d2=1;
  •                         wr_com(0xc0);
  •                         wr_dat(' ');
  •                         if(tvalue>warnh) //温度高于设定值warnh=992;
  •                         {
  •                                 d1=0;     //报警
  •                                 DQ=0;
  •                         }
  •                         else
  •                         {
  •                                 d1=1;
  •                                 DQ=1;
  •                         }
  •                 }
  •                 if(j==0)
  •                 {
  •                         wr_com(0x8f);
  •                         wr_dat('1');
  •                 }
  •                 if(j==1)
  •                 {
  •                         wr_com(0x8f);
  •                         wr_dat('2');
  •                 }
  •                 if(j==2)
  •                 {
  •                         wr_com(0x8f);
  •                         wr_dat('3');
  •                 }
  •                 if(j==3)
  •                 {
  •                         wr_com(0x8f);
  •                         wr_dat('4');
  •                 }
  •                 if(j==4)
  •                 {
  •                         wr_com(0x8f);
  •                         wr_dat('5');
  •                 }
  •                 ftvalue=tvalue*0.0625;
  •                 tvalue=ftvalue*10+0.5;
  •                 ftvalue=ftvalue+0.05; //温度补偿
  •                 f[j]=tvalue;//温度扩大十倍,精确到一位小数
  •                 tvalue=f[j];
  •                 t=tvalue/1000;
  •                 wr_com(0x80+0x41);
  •                 wr_dat(table1[t]);//显示百位
  •                 t=tvalue%1000/100;
  •                 wr_dat(table1[t]);//显示十位
  •                 t=tvalue%100/10;
  •                 wr_dat(table1[t]);//显示个位
  •                 wr_dat(0x2e); //显示小数点儿
  •                 t=tvalue%10/1;
  •                 wr_dat(table1[t]);//显示小数位
  •                 delay1ms(5000);
  •         }
  • }
  • void keyscan()//按键
  • {
  •         if(key==0)
  •         {
  •                 delay1ms(30);
  •                 if(key==0)
  •                 {
  •                         st=~st;
  •                 }
  •                 while(!key);
  •         }
  • }
  • void main()
  • {
  •         d1=1;
  •         d2=1;
  •         DQ=1;
  •         displayinit();//初始化显示
  •         while(1)
  •         {
  •                 keyscan();//按住按键等4个器件循环完毕显示序列号
  •                 if(st==1)
  •                 {
  •                         wr_com(0x01);
  •                         displayinit();//初始化显示
  •                         tmstart();//初始化
  •                         read_dealtemp();//读取温度
  •                 }
  •                 else
  •                 {
  •                         wr_com(0x01);
  •                         keyscan();//按住按键等4个器件循环完毕显示序列号
  •                         DispCode();//读取序列号
  •                         delay1ms(1000);
  •                 }
  •         }
  • }
  • ////////DS18B20函数///////////////
  • void  delay_b20(uint n)//STC12C5A单片机定时1us
  • {
  •   while(n--)
  •   {
  •   _nop_();
  •   }
  • }
  • void ds1820rst()/*ds1820复位*/
  • {
  •         uchar x=0;
  •         DQ = 1;          //DQ复位
  •         delay_b20(1); //延时
  •         DQ = 0;          //DQ拉低
  •         delay_b20(500); //精确延时大于480us
  •         DQ = 1;          //拉高
  •         delay_b20(80);
  • }
  • uchar ds1820rd()/*读数据*/
  • {
  •         uchar i=0;
  •         uchar dat = 0;
  •         for (i=0;i<8;i++)
  •         {
  •                 DQ = 1; //给脉冲信号
  •                 delay_b20(1);
  •                 DQ = 0; //给脉冲信号
  •                 delay_b20(1);
  •                 dat>>=1;
  •                 DQ = 1; //给脉冲信号
  •                 if(DQ)
  •                 dat|=0x80;
  •                 delay_b20(60);
  •         }
  •         return(dat);
  • }
  • void ds1820wr(uchar dat)/*写数据*/
  • {
  •         uchar i=0;
  •         for (i=0; i<8; i++)
  •         {
  •                 DQ = 1;
  •                 delay_b20(1);
  •                 DQ = 0;
  •                 DQ = dat&0x01;
  •                 delay_b20(60);
  •                 DQ = 1;
  •                 delay_b20(60);
  •                 dat>>=1;
  •         }
  •         delay_b20(1);
  • }
  • ///////////读取序列号//////////
  • void DispCode()//读取序列号
  • {
  •         uchar i,temp;
  •         ds1820rst();
  •         ds1820wr(0x33);
  •         for (i=0;i<8;i++)
  •         {
  •                 fCode=ds1820rd();
  •         }
  •         wr_com(0x80+0x40);
  •         for (i=0;i<8;i++)
  •         {
  •                 temp = fCode>>4; //显示高四位
  •                 if (temp<10)
  •                 wr_dat(temp + 0x30);  // 显示数字
  •                 else
  •                 wr_dat(temp + 0x37); //否则大于数字9显示字母
  •                 temp = fCode&0x0f;//显示低四位
  •                 if (temp<10)
  •                 wr_dat(temp+ 0x30);
  •                 else
  •                 wr_dat(temp + 0x37);
  •         }
  • }


[color=rgb(85, 85, 85) !important]复制代码



S0X483GL@VJDG}U_A@B0LBK.jpg (615.06 KB, 下载次数: 17)

读取的序列号

                               
登录/注册后看高清大图




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

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复