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

📄 ds18b20-lcd1602-c51.lst

📁 基于51的DS18B20_1Wire温度控制等C,ASM源程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V8.05a   DS18B20_LCD1602_C51                                                  11/20/2006 21:44:00 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE DS18B20_LCD1602_C51
OBJECT MODULE PLACED IN DS18B20-LCD1602-C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20-LCD1602-C51.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************/
   2          /*                                                                 */
   3          /* ME500单片机开发系统演示程序 - DS18B20温度显示                  */
   4          /*                                                                 */
   5          /* LCD1602显示                                                     */
   6          /*                                                                 */
   7          /* 版本: V1.0 (2006/11/20)                                        */
   8          /* 作者: gguoqing (Email: gguoqing@willar.com)                    */
   9          /* 网站: www.willar.com(伟纳电子)   www.mcusj.com(伟纳单片机世界) */
  10          /* 时间: 2006/09/20                                               */
  11          /*                                                                 */
  12          /*【版权】Copyright(C)伟纳电子 www.willar.com  All Rights Reserved */
  13          /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       */
  14          /*                                                                 */
  15          /*******************************************************************/
  16          
  17          #include <reg51.h>
  18          #include <intrins.h>
  19          
  20          #define uchar unsigned char
  21          #define uint  unsigned int
  22          
  23          sbit DQ = P3^3;  //定义DS18B20端口DQ  
  24          sbit BEEP=P3^7 ; //蜂鸣器驱动线
  25          
  26          bit presence,flag;
  27          bit compare_th,compare_tl,alarm_on_off=0,temp_th,temp_tl;
  28          
  29          sbit LCD_RS = P2^0;             
  30          sbit LCD_RW = P2^1;
  31          sbit LCD_EN = P2^2;
  32          
  33          sbit  K1 = P1^4;
  34          sbit  K2 = P1^5;
  35          sbit  K3 = P1^6;
  36          sbit  K4 = P1^7;
  37          
  38          uchar code  cdis1[ ] = {"  READ_ROMCORD  "};
  39          uchar code  cdis2[ ] = {"                "};
  40          uchar code  cdis3[ ] = {" DS18B20  ERR0R "};
  41          uchar code  cdis4[ ] = {"  PLEASE CHECK  "};
  42          uchar code  cdis5[ ] = {" TEMP:          "};
  43          uchar code  cdis6[ ] = {"TH:     TL:     "};
  44          
  45          unsigned char data  temp_data[2] = {0x00,0x00};
  46          unsigned char data  temp_alarm[2] = {0x00,0x00};
  47          unsigned char data  display[5] =   {0x00,0x00,0x00,0x00,0x00}; //温度值显示
  48          unsigned char data  display1[3] =  {0x00,0x00,0x00}; //温度报警值显示
  49          //unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  50          //                                    0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  51          
  52          unsigned char data  RomCode[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  53           
  54          unsigned char code  mytab1[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};
  55          unsigned char code  mytab2[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//小喇叭
C51 COMPILER V8.05a   DS18B20_LCD1602_C51                                                  11/20/2006 21:44:00 PAGE 2   

  56          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  57          
  58          unsigned char Temp,temp_comp,timecount,count;
  59          unsigned char  crc;
  60          void Disp_Temp_alarm(uchar addr,uchar num);
  61          void  spk(uchar addr);
  62          void set_temp_alarm();
  63          void temp_compare();
  64          void beep();
  65          /*******************************************************************/
  66          void delay1(int ms)
  67          {
  68   1         unsigned char y;
  69   1         while(ms--)
  70   1         {
  71   2           for(y = 0; y<250; y++)
  72   2          {
  73   3            _nop_();
  74   3            _nop_();
  75   3            _nop_();
  76   3            _nop_();
  77   3          }
  78   2         }
  79   1      }
  80          
  81          /******************************************************************/
  82          /*                                                                */
  83          /*检查LCD忙状态                                                   */
  84          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。     */
  85          /*                                                                */
  86          /******************************************************************/ 
  87          
  88          bit lcd_busy()
  89           {                          
  90   1          bit result;
  91   1          LCD_RS = 0;
  92   1          LCD_RW = 1;
  93   1          LCD_EN = 1;
  94   1          delayNOP();
  95   1          result = (bit)(P0&0x80);
  96   1          LCD_EN = 0;
  97   1          return(result); 
  98   1       }
  99          
 100          /*******************************************************************/
 101          /*                                                                 */
 102          /*写指令数据到LCD                                                  */
 103          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
 104          /*                                                                 */
 105          /*******************************************************************/
 106          void lcd_wcmd(uchar cmd)
 107          {                          
 108   1         while(lcd_busy());
 109   1          LCD_RS = 0;
 110   1          LCD_RW = 0;
 111   1          LCD_EN = 0;
 112   1          _nop_();
 113   1          _nop_(); 
 114   1          P0 = cmd;
 115   1          delayNOP();
 116   1          LCD_EN = 1;
 117   1          delayNOP();
C51 COMPILER V8.05a   DS18B20_LCD1602_C51                                                  11/20/2006 21:44:00 PAGE 3   

 118   1          LCD_EN = 0;  
 119   1      }
 120          
 121          /*******************************************************************/
 122          /*                                                                 */
 123          /*写显示数据到LCD                                                  */
 124          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
 125          /*                                                                 */
 126          /*******************************************************************/
 127          void lcd_wdat(uchar dat)
 128          {                          
 129   1         while(lcd_busy());
 130   1          LCD_RS = 1;
 131   1          LCD_RW = 0;
 132   1          LCD_EN = 0;
 133   1          P0 = dat;
 134   1          delayNOP();
 135   1          LCD_EN = 1;
 136   1          delayNOP();
 137   1          LCD_EN = 0; 
 138   1      }
 139          
 140          /*******************************************************************/
 141          /*                                                                 */
 142          /*自定义字符写入CGRAM                                              */
 143          /*                                                                 */
 144          /*******************************************************************/
 145          void  writetab()  
 146          {  
 147   1          unsigned char i;
 148   1          lcd_wcmd(0x40);            //写CGRAM
 149   1          for (i = 0; i< 8; i++)       
 150   1          lcd_wdat(mytab1[i]);
 151   1          for (i = 0; i< 8; i++)       
 152   1          lcd_wdat(mytab2[i]);    
 153   1      }
 154          
 155          /*******************************************************************/
 156          /*                                                                 */
 157          /*  LCD初始化设定                                                  */
 158          /*                                                                 */
 159          /*******************************************************************/
 160          void lcd_init()
 161          { 
 162   1          delay1(15);   
 163   1          lcd_wcmd(0x01);      //清除LCD的显示内容            
 164   1          lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
 165   1          delay1(5);
 166   1          lcd_wcmd(0x38);         
 167   1          delay1(5);
 168   1          lcd_wcmd(0x38);         
 169   1          delay1(5);
 170   1      
 171   1          lcd_wcmd(0x0c);      //显示开,关光标
 172   1          delay1(5);
 173   1          lcd_wcmd(0x06);      //移动光标
 174   1          delay1(5);
 175   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 176   1          delay1(5);
 177   1      
 178   1              writetab();               //自定义字符写入CGRAM
 179   1      }
C51 COMPILER V8.05a   DS18B20_LCD1602_C51                                                  11/20/2006 21:44:00 PAGE 4   

 180          
 181          /*******************************************************************/
 182          /*                                                                 */
 183          /*  设定显示位置                                                   */
 184          /*                                                                 */
 185          /*******************************************************************/
 186          
 187          void lcd_pos(uchar pos)
 188          {                          
 189   1        lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
 190   1      }
 191          
 192          /*******************************************************************/
 193          /*                                                                 */
 194          /*us级延时函数                                                     */
 195          /*                                                                 */
 196          /*******************************************************************/
 197          
 198          void Delay(unsigned int num)
 199          {
 200   1        while( --num );
 201   1      }
 202          
 203          /*******************************************************************/
 204          /*                                                                 */
 205          /*初始化ds1820                                                     */
 206          /*                                                                 */
 207          /*******************************************************************/
 208          Init_DS18B20(void)
 209          {  
 210   1           DQ = 1;      //DQ复位
 211   1           Delay(8);    //稍做延时
 212   1      
 213   1           DQ = 0;      //单片机将DQ拉低
 214   1           Delay(90);   //精确延时 大于 480us
 215   1      
 216   1           DQ = 1;       //拉高总线
 217   1           Delay(8);
 218   1      
 219   1           presence = DQ;    //如果=0则初始化成功 =1则初始化失败
 220   1           Delay(100);
 221   1           DQ = 1; 
 222   1           
 223   1           return(presence); //返回信号,0=presence,1= no presence
 224   1      }
 225          
 226          /*******************************************************************/
 227          /*                                                                 */
 228          /* 读一个字节                                                      */
 229          /*                                                                 */
 230          /*******************************************************************/
 231           ReadOneChar(void)
 232          {
 233   1         unsigned char i = 0;
 234   1         unsigned char dat = 0;
 235   1      
 236   1         for (i = 8; i > 0; i--)
 237   1         {
 238   2           DQ = 0; // 给脉冲信号
 239   2           dat >>= 1;
 240   2           DQ = 1; // 给脉冲信号
 241   2      
C51 COMPILER V8.05a   DS18B20_LCD1602_C51                                                  11/20/2006 21:44:00 PAGE 5   

 242   2           if(DQ)
 243   2           dat |= 0x80;
 244   2           Delay(4);
 245   2         }
 246   1          return (dat);
 247   1      }
 248          
 249          /*******************************************************************/
 250          /*                                                                 */
 251          /* 写一个字节                                                      */
 252          /*                                                                 */
 253          /*******************************************************************/
 254           WriteOneChar(unsigned char dat)

⌨️ 快捷键说明

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