⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hjmcu.lst

📁 很实用的单片机例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
 192   1                       {
 193   2                         
 194   2                         DQ =1;       // 先将数据线拉高
 195   2                         _nop_();         //等待一个机器周期   
 196   2                         DQ = 0;      //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
 197   2                              dat>>=1;
 198   2                         _nop_();     //等待一个机器周期                 
 199   2                         DQ = 1;     //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
 200   2                         for(time=0;time<2;time++)
 201   2                   ;      //延时约6us,使主机在15us内采样
 202   2                         if(DQ==1)
 203   2                            dat|=0x80;  //如果读到的数据是1,则将1存入dat
 204   2                              else
 205   2                                      dat|=0x00;//如果读到的数据是0,则将0存入dat
 206   2                           //将单片机检测到的电平信号DQ存入r[i]       
 207   2                         for(time=0;time<8;time++)
 208   2                              ;              //延时3us,两个读时序之间必须有大于1us的恢复期    
 209   2                  }                       
 210   1               return(dat);    //返回读出的十进制数据
 211   1      }
 212          /*****************************************************
 213          函数功能:向DS18B20写入一个字节数据
 214          入口参数:dat
 215          ***************************************************/  
 216          WriteOneChar(unsigned char dat)
 217          {
 218   1              unsigned char i=0;
 219   1              for (i=0; i<8; i++)
 220   1                       {
 221   2                        DQ =1;         // 先将数据线拉高
 222   2                        _nop_();           //等待一个机器周期  
 223   2                        DQ=0;          //将数据线从高拉低时即启动写时序       
 224   2                        DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,
 225   2                             //并将其送到数据线上等待DS18B20采样      
 226   2                       for(time=0;time<10;time++)     
 227   2                           ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
 228   2                        DQ=1;          //释放数据线               
 229   2                        for(time=0;time<1;time++)
 230   2                                ;//延时3us,两个写时序间至少需要1us的恢复期
 231   2                        dat>>=1;       //将dat中的各二进制位数据右移1位
 232   2                       }
 233   1                for(time=0;time<4;time++)
 234   1                            ; //稍作延时,给硬件一点反应时间
 235   1      }
 236          /******************************************************************************
 237          以下是与温度有关的显示设置
 238           ******************************************************************************/
 239           /*****************************************************
C51 COMPILER V7.00  HJMCU                                                                  06/06/2011 11:03:54 PAGE 5   

 240          函数功能:显示没有检测到DS18B20
 241          ***************************************************/   
 242          void display_error(void)
 243           {
 244   1             unsigned char i;
 245   1                           WriteAddress(0x00);    //写显示地址,将在第1行第1列开始显示
 246   1                                 i = 0;                //从第一个字符开始显示
 247   1                                      while(Error[i] != '\0')  //只要没有写到结束标志,就继续写
 248   1                                      {                                               
 249   2                                              WriteData(Error[i]);   //将字符常量写入LCD
 250   2                                              i++;                 //指向下一个字符
 251   2                                              delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
 252   2                                      }       
 253   1                                      while(1)              //进入死循环,等待查明原因
 254   1                                        ;
 255   1      }
 256          /*****************************************************
 257          函数功能:显示说明信息
 258          ***************************************************/   
 259          void display_explain(void)
 260           {
 261   1             unsigned char i;
 262   1                           WriteAddress(0x00);    //写显示地址,将在第1行第1列开始显示
 263   1                                 i = 0;                //从第一个字符开始显示
 264   1                                      while(Str[i] != '\0')  //只要没有写到结束标志,就继续写
 265   1                                      {                                               
 266   2                                              WriteData(Str[i]);   //将字符常量写入LCD
 267   2                                              i++;                 //指向下一个字符
 268   2                                              delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
 269   2                                      }       
 270   1      }
 271          /*****************************************************
 272          函数功能:显示温度符号
 273          ***************************************************/   
 274          void display_symbol(void)
 275           {
 276   1             unsigned char i;
 277   1                           WriteAddress(0x40);    //写显示地址,将在第2行第1列开始显示
 278   1                                 i = 0;                //从第一个字符开始显示
 279   1                                      while(Temp[i] != '\0')  //只要没有写到结束标志,就继续写
 280   1                                      {                                               
 281   2                                              WriteData(Temp[i]);   //将字符常量写入LCD
 282   2                                              i++;                 //指向下一个字符
 283   2                                              delaynms(50);        //延时1ms给硬件一点反应时间
 284   2                                      }       
 285   1      }
 286          
 287          /*****************************************************
 288          函数功能:显示温度的小数点
 289          ***************************************************/   
 290          void    display_dot(void)
 291          {         
 292   1               WriteAddress(0x49);      //写显示地址,将在第2行第10列开始显示            
 293   1               WriteData('.');      //将小数点的字符常量写入LCD
 294   1               delaynms(50);         //延时1ms给硬件一点反应时间              
 295   1      }
 296          /*****************************************************
 297          函数功能:显示温度的单位(Cent)
 298          ***************************************************/   
 299          void    display_cent(void)
 300          {
 301   1                 unsigned char i;    
C51 COMPILER V7.00  HJMCU                                                                  06/06/2011 11:03:54 PAGE 6   

 302   1                           WriteAddress(0x4c);        //写显示地址,将在第2行第13列开始显示   
 303   1                                 i = 0;                    //从第一个字符开始显示 
 304   1                                      while(Cent[i] != '\0')     //只要没有写到结束标志,就继续写
 305   1                                      {                                       
 306   2                                              WriteData(Cent[i]);     //将字符常量写入LCD
 307   2                                              i++;                 //指向下一个字符
 308   2                                              delaynms(50);        //延时1ms给硬件一点反应时间
 309   2                                      }       
 310   1      }
 311          /*****************************************************
 312          函数功能:显示温度的整数部分
 313          入口参数:x
 314          ***************************************************/ 
 315          void display_temp1(unsigned char x)
 316          {
 317   1       unsigned char j,k,l;     //j,k,l分别储存温度的百位、十位和个位
 318   1              j=x/100;              //取百位
 319   1              k=(x%100)/10;    //取十位
 320   1              l=x%10;             //取个位  
 321   1              WriteAddress(0x46);    //写显示地址,将在第2行第7列开始显示
 322   1              WriteData(digit[j]);    //将百位数字的字符常量写入LCD
 323   1              WriteData(digit[k]);    //将十位数字的字符常量写入LCD
 324   1              WriteData(digit[l]);    //将个位数字的字符常量写入LCD
 325   1              delaynms(50);         //延时1ms给硬件一点反应时间     
 326   1       }
 327           /*****************************************************
 328          函数功能:显示温度的小数数部分
 329          入口参数:x
 330          ***************************************************/ 
 331           void display_temp2(unsigned char x)
 332          {
 333   1              WriteAddress(0x4a);      //写显示地址,将在第2行第11列开始显示
 334   1              WriteData(digit[x]);     //将小数部分的第一位数字字符常量写入LCD
 335   1              delaynms(50);          //延时1ms给硬件一点反应时间
 336   1      }
 337          /*****************************************************
 338          函数功能:做好读温度的准备
 339          ***************************************************/ 
 340          void ReadyReadTemp(void)
 341          {
 342   1            Init_DS18B20();     //将DS18B20初始化
 343   1                      WriteOneChar(0xCC); // 跳过读序号列号的操作
 344   1                      WriteOneChar(0x44); // 启动温度转换       
 345   1                 for(time=0;time<100;time++)
 346   1                          ;    //温度转换需要一点时间
 347   1                      Init_DS18B20();     //将DS18B20初始化
 348   1                      WriteOneChar(0xCC); //跳过读序号列号的操作
 349   1                      WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位       
 350   1      }
 351          
 352          
 353          /*****************************************************
 354          函数功能:主函数
 355          ***************************************************/ 
 356          
 357           void main(void)
 358           {        
 359   1                unsigned char TL;     //储存暂存器的温度低位
 360   1           unsigned char TH;    //储存暂存器的温度高位
 361   1           unsigned char TN;      //储存温度的整数部分
 362   1                unsigned char TD;       //储存温度的小数部分
 363   1           ioin(); 
C51 COMPILER V7.00  HJMCU                                                                  06/06/2011 11:03:54 PAGE 7   

 364   1                LcdInitiate();         //将液晶初始化
 365   1                 delaynms(5);        //延时5ms给硬件一点反应时间      
 366   1                      if(Init_DS18B20()==1)
 367   1                  display_error();
 368   1                      display_explain();
 369   1              display_symbol();    //显示温度说明
 370   1            display_dot();       //显示温度的小数点
 371   1            display_cent();      //显示温度的单位
 372   1                 
 373   1      
 374   1         while(1)                //不断检测并显示温度
 375   1               {      
 376   2                      ReadyReadTemp();     //读温度准备
 377   2                 TL=ReadOneChar();    //先读的是温度值低位
 378   2                      TH=ReadOneChar();    //接着读的是温度值高位
 379   2                      TN=TH*16+TL/16;      //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
 380   2                                                //这样得出的是温度的整数部分,小数部分被丢弃了
 381   2                 TD=(TL%16)*10/16;    //计算温度的小数部分,将余数乘以10再除以16取整,
 382   2                                                //这样得到的是温度小数部分的第一位数字(保留1位小数)
 383   2                 display_temp1(TN);    //显示温度的整数部分
 384   2                 display_temp2(TD);    //显示温度的小数部分
 385   2            delaynms(10);               
 386   2          }   
 387   1                                
 388   1      }
 389          

C51 COMPILATION COMPLETE.  0 WARNING(S),  1 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -