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

📄 51

📁 51单片机大量源码
💻
📖 第 1 页 / 共 2 页
字号:
 186          /*****************************************************
 187          函数功能:向DS18B20写入一个字节数据
 188          入口参数:dat
 189          ***************************************************/  
 190          WriteOneChar(unsigned char dat)
 191          {
 192   1              unsigned char i=0;
 193   1              for (i=0; i<8; i++)
 194   1                       {
 195   2                        DQ =1;         // 先将数据线拉高
 196   2                        _nop_();           //等待一个机器周期  
 197   2                        DQ=0;          //将数据线从高拉低时即启动写时序       
 198   2                        DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,
 199   2                             //并将其送到数据线上等待DS18B20采样      
 200   2                       for(time=0;time<10;time++)     
 201   2                           ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
 202   2                        DQ=1;          //释放数据线               
 203   2                        for(time=0;time<1;time++)
 204   2                                ;//延时3us,两个写时序间至少需要1us的恢复期
 205   2                        dat>>=1;       //将dat中的各二进制位数据右移1位
 206   2                       }
 207   1                for(time=0;time<4;time++)
 208   1                            ; //稍作延时,给硬件一点反应时间
 209   1      }
 210          /******************************************************************************
 211          以下是与温度有关的显示设置
 212           ******************************************************************************/
 213           /*****************************************************
 214          函数功能:显示没有检测到DS18B20
 215          ***************************************************/   
 216          void display_error(void)
 217           {
 218   1             unsigned char i;
 219   1                           WriteAddress(0x00);    //写显示地址,将在第1行第1列开始显示
 220   1                                 i = 0;                //从第一个字符开始显示
 221   1                                      while(Error[i] != '\0')  //只要没有写到结束标志,就继续写
 222   1                                      {                                               
 223   2                                              WriteData(Error[i]);   //将字符常量写入LCD
 224   2                                              i++;                 //指向下一个字符
 225   2                                              delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
 226   2                                      }       
 227   1                                      while(1)              //进入死循环,等待查明原因
 228   1                                        ;
 229   1      }
 230          /*****************************************************
 231          函数功能:显示说明信息
 232          ***************************************************/   
 233          void display_explain(void)
 234           {
 235   1             unsigned char i;
 236   1                           WriteAddress(0x00);    //写显示地址,将在第1行第1列开始显示
 237   1                                 i = 0;                //从第一个字符开始显示
 238   1                                      while(Str[i] != '\0')  //只要没有写到结束标志,就继续写
 239   1                                      {                                               
 240   2                                              WriteData(Str[i]);   //将字符常量写入LCD
 241   2                                              i++;                 //指向下一个字符
C51 COMPILER V8.09   EX90                                                                  07/12/2010 14:48:31 PAGE 5   

 242   2                                              delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
 243   2                                      }       
 244   1      }
 245          /*****************************************************
 246          函数功能:显示温度符号
 247          ***************************************************/   
 248          void display_symbol(void)
 249           {
 250   1             unsigned char i;
 251   1                           WriteAddress(0x40);    //写显示地址,将在第2行第1列开始显示
 252   1                                 i = 0;                //从第一个字符开始显示
 253   1                                      while(Temp[i] != '\0')  //只要没有写到结束标志,就继续写
 254   1                                      {                                               
 255   2                                              WriteData(Temp[i]);   //将字符常量写入LCD
 256   2                                              i++;                 //指向下一个字符
 257   2                                              delaynms(50);        //延时1ms给硬件一点反应时间
 258   2                                      }       
 259   1      }
 260          
 261          /*****************************************************
 262          函数功能:显示温度的小数点
 263          ***************************************************/   
 264          void    display_dot(void)
 265          {         
 266   1               WriteAddress(0x49);      //写显示地址,将在第2行第10列开始显示            
 267   1               WriteData('.');      //将小数点的字符常量写入LCD
 268   1               delaynms(50);         //延时1ms给硬件一点反应时间              
 269   1      }
 270          /*****************************************************
 271          函数功能:显示温度的单位(Cent)
 272          ***************************************************/   
 273          void    display_cent(void)
 274          {
 275   1                 unsigned char i;    
 276   1                           WriteAddress(0x4c);        //写显示地址,将在第2行第13列开始显示   
 277   1                                 i = 0;                    //从第一个字符开始显示 
 278   1                                      while(Cent[i] != '\0')     //只要没有写到结束标志,就继续写
 279   1                                      {                                       
 280   2                                              WriteData(Cent[i]);     //将字符常量写入LCD
 281   2                                              i++;                 //指向下一个字符
 282   2                                              delaynms(50);        //延时1ms给硬件一点反应时间
 283   2                                      }       
 284   1      }
 285          /*****************************************************
 286          函数功能:显示温度的整数部分
 287          入口参数:x
 288          ***************************************************/ 
 289          void display_temp1(unsigned char x)
 290          {
 291   1       unsigned char j,k,l;     //j,k,l分别储存温度的百位、十位和个位
 292   1              j=x/100;              //取百位
 293   1              k=(x%100)/10;    //取十位
 294   1              l=x%10;             //取个位  
 295   1              WriteAddress(0x46);    //写显示地址,将在第2行第7列开始显示
 296   1              WriteData(digit[j]);    //将百位数字的字符常量写入LCD
 297   1              WriteData(digit[k]);    //将十位数字的字符常量写入LCD
 298   1              WriteData(digit[l]);    //将个位数字的字符常量写入LCD
 299   1              delaynms(50);         //延时1ms给硬件一点反应时间     
 300   1       }
 301           /*****************************************************
 302          函数功能:显示温度的小数数部分
 303          入口参数:x
C51 COMPILER V8.09   EX90                                                                  07/12/2010 14:48:31 PAGE 6   

 304          ***************************************************/ 
 305           void display_temp2(unsigned char x)
 306          {
 307   1              WriteAddress(0x4a);      //写显示地址,将在第2行第11列开始显示
 308   1              WriteData(digit[x]);     //将小数部分的第一位数字字符常量写入LCD
 309   1              delaynms(50);          //延时1ms给硬件一点反应时间
 310   1      }
 311          /*****************************************************
 312          函数功能:做好读温度的准备
 313          ***************************************************/ 
 314          void ReadyReadTemp(void)
 315          {
 316   1            Init_DS18B20();     //将DS18B20初始化
 317   1                      WriteOneChar(0xCC); // 跳过读序号列号的操作
 318   1                      WriteOneChar(0x44); // 启动温度转换       
 319   1                 for(time=0;time<100;time++)
 320   1                          ;    //温度转换需要一点时间
 321   1                      Init_DS18B20();     //将DS18B20初始化
 322   1                      WriteOneChar(0xCC); //跳过读序号列号的操作
 323   1                      WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位       
 324   1      }
 325          
 326          
 327          /*****************************************************
 328          函数功能:主函数
 329          ***************************************************/ 
 330          
 331           void main(void)
 332           {        
 333   1                unsigned char TL;     //储存暂存器的温度低位
 334   1           unsigned char TH;    //储存暂存器的温度高位
 335   1           unsigned char TN;      //储存温度的整数部分
 336   1                unsigned char TD;       //储存温度的小数部分
 337   1                LcdInitiate();         //将液晶初始化
 338   1                 delaynms(5);        //延时5ms给硬件一点反应时间      
 339   1                      if(Init_DS18B20()==1)
 340   1                  display_error();
 341   1                      display_explain();
 342   1              display_symbol();    //显示温度说明
 343   1            display_dot();       //显示温度的小数点
 344   1            display_cent();      //显示温度的单位
 345   1         while(1)                //不断检测并显示温度
 346   1               {      
 347   2                      ReadyReadTemp();     //读温度准备
 348   2                 TL=ReadOneChar();    //先读的是温度值低位
 349   2                      TH=ReadOneChar();    //接着读的是温度值高位
 350   2                      TN=TH*16+TL/16;      //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
 351   2                                                //这样得出的是温度的整数部分,小数部分被丢弃了
 352   2                 TD=(TL%16)*10/16;    //计算温度的小数部分,将余数乘以10再除以16取整,
 353   2                                                //这样得到的是温度小数部分的第一位数字(保留1位小数)
 354   2                 display_temp1(TN);    //显示温度的整数部分
 355   2                 display_temp2(TD);    //显示温度的小数部分
 356   2            delaynms(10);               
 357   2          }   
 358   1                                
 359   1      }
 360          
 361          
 362          
 363          
 364          

C51 COMPILER V8.09   EX90                                                                  07/12/2010 14:48:31 PAGE 7   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    635    ----
   CONSTANT SIZE    =     50    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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