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

📄 lcmtemp.lst

📁 已经调试通过的利用温度传感器18B20实现温度测量
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   LCMTEMP                                                               08/11/2007 11:03:53 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE LCMTEMP
OBJECT MODULE PLACED IN lcmtemp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcmtemp.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*==========================================================
   2                 -------------------------------------------------
   3                 |LCM-----51   | LCM-----51   | LCM------51      |
   4                 |-----------------------------------------------|
   5                 |DB0-----P1.0 | DB4-----P1.4 | RS-------P3.5    |
   6                 |DB1-----P1.1 | DB5-----P1.5 | RW-------P3.6    |
   7                 |DB2-----P1.2 | DB6-----P1.6 | E--------P3.7    |
   8                 |DB3-----P1.3 | DB7-----P1.7 | VLCD接1K电阻到GND|
   9                 -------------------------------------------------
  10                             [AT89S52使用12M晶振]                        
  11          注:高级功能函数被屏蔽,请选择使用
  12          =============================================================*/
  13          
  14          /*=====================头函数与宏定义===================*/
  15          #include <reg52.h>
  16          #include  <pio.h>
  17          
  18          sbit DQ=P3^6; //数据传输线接单片机的相应的引脚 
  19          unsigned char tempL=0; //设全局变量
  20          unsigned char tempH=0; 
  21          unsigned int sdata;//测量到的温度的整数部分
  22          unsigned char xiaoshu1;//小数第一位
  23          unsigned char xiaoshu2;//小数第二位
  24          unsigned char xiaoshu;//两位小数
  25          bit  fg=1;        //温度正负标志
  26          /*======================================================*/
  27          sbit LCM1602_RS=P2^0;
  28          sbit LCM1602_RW=P2^1;
  29          sbit LCM1602_E=P2^2;
  30          #define LCM1602_DATA P1    //数据线
  31          #define busy    0x80    //用于检测LCM状态字中的busy标识
  32          /*======================================================*/
  33          
  34          /*===================================================================================================*/
  35          /*                                  函数声明                                                             */
  36          /*===================================================================================================*/
  37          void delay(unsigned char i)
  38          {
  39   1       for(i;i>0;i--);
  40   1      }
  41          
  42          
  43          //***********************************************************
  44          
  45          //                     延时子程序
  46          
  47          //************************************************************
  48          /*void delay1ms()
  49          {
  50           unsigned char i;
  51           for(i=124;i>0;i--);  //延时124*8+10=1002us
  52          }
  53          
  54          */
  55          
C51 COMPILER V8.02   LCMTEMP                                                               08/11/2007 11:03:53 PAGE 2   

  56          //*****************************初始化程序 *********************************//
  57          
  58          Init_DS18B20(void) 
  59          {
  60   1       unsigned char x=0;
  61   1       DQ=1; //DQ先置高 
  62   1       delay(8); //稍延时
  63   1       DQ=0; //发送复位脉冲 
  64   1       delay(80); //延时(>480us) 
  65   1       DQ=1; //拉高数据线 
  66   1       delay(5); //等待(15~60us) 
  67   1       x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1 
  68   1       delay(20); 
  69   1      } 
  70          //**********读一个字节************//
  71          
  72          ReadOneChar(void)  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
  73          {
  74   1      unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
  75   1      unsigned char dat=0; 
  76   1      for (i=8;i>0;i--) //一个字节有8位 
  77   1      {
  78   2       DQ=1; 
  79   2       delay(1); 
  80   2       DQ=0;
  81   2       dat>>=1; 
  82   2       DQ=1; 
  83   2       if(DQ) 
  84   2       dat|=0x80; 
  85   2       delay(4);
  86   2      } 
  87   1      return(dat);
  88   1      } 
  89          
  90          
  91          
  92          //*********************** **写一个字节**************************//
  93          
  94          WriteOneChar(unsigned char dat) 
  95          { 
  96   1        unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
  97   1        for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。 
  98   1        {
  99   2         DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。 
 100   2         DQ=dat&0x01; 
 101   2         delay(5); 
 102   2         DQ=1; 
 103   2         dat>>=1;
 104   2        } 
 105   1        delay(4);
 106   1      } 
 107          
 108          
 109          //读温度值(低位放tempL;高位放tempH;)
 110          ReadTemperature(void) 
 111          { 
 112   1       Init_DS18B20(); //初始化
 113   1       WriteOneChar(0xcc); //跳过读序列号的操作
 114   1       WriteOneChar(0x44); //启动温度转换
 115   1       delay(125); //转换需要一点时间,延时 
 116   1       Init_DS18B20(); //初始化
 117   1       WriteOneChar(0xcc); //跳过读序列号的操作 
C51 COMPILER V8.02   LCMTEMP                                                               08/11/2007 11:03:53 PAGE 3   

 118   1       WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位) 
 119   1       tempL=ReadOneChar(); //读出温度的低位LSB
 120   1       tempH=ReadOneChar(); //读出温度的高位MSB 
 121   1        
 122   1                      if(tempH>0x7f)      //最高位为1时温度是负
 123   1                      {
 124   2                       tempL=~tempL;         //补码转换,取反加一
 125   2                       tempH=~tempH+1;       
 126   2                       fg=0;      //读取温度为负时fg=0
 127   2             }
 128   1                      sdata = tempL/16+tempH*16;      //整数部分
 129   1                      xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
 130   1                      xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
 131   1                      xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
 132   1      }
 133          
 134          
 135          void initialize_1602(void);//LCM初始化
 136             
 137          void write_1602_command(unsigned char command,BuysC);   //写控制
 138          void write_1602_data(unsigned char Data);               //写数据
 139          void read_1602_status(void);                            //读状态,等待空闲
 140          
 141          void display_1602_onechar(unsigned char x, unsigned char y, unsigned char d);   //按指定位置显示一个字符
 142          void display_1602_listchar(unsigned char x, unsigned char y, unsigned char *d); //按指定位置显示一串字符
 143          
 144          void cursor_1602(unsigned char work);   //光标开关,work=0为关,work=1为开
 145          void clear_1602();              //清屏
 146          void delay1602(unsigned char t);
 147          
 148          /*====================高级功能函数==========================================================
 149          void movesreen_1602_rl(unsigned int time,unsigned char direction);   //循环左(右)移动屏幕上的所有字符
 150          void movedata_1602_left(unsigned char *d);                   //以左移动的方式显示长于16字节的字符串
 151          void movedata_1602_up(unsigned char *d);                     //以逐行上移的方式显示文章
 152          void turnpage_1602(unsigned char *d);                        //以翻页的方式显示文章
 153          ============================================================================================*/
 154          
 155          void display_1602_num(unsigned char x,unsigned char y,long int num);  //在指定的位置显示数字num
 156          
 157          /*==================================================================================*/
 158          /*                         字符串                                                   */
 159          /*==================================================================================*/
 160          unsigned char code first[]={"Temperature is:"};
 161          unsigned char code second[]={"jim love zhou"};
 162          
 163          
 164          
 165          /*===============================主函数==================================*/
 166          void main()
 167          {
 168   1      while(1)
 169   1      {
 170   2      
 171   2      
 172   2      
 173   2      delay1602(100);                           //启动等待,等LCM讲入工作状态
 174   2      initialize_1602();                      //LCM初始化
 175   2      
 176   2      
 177   2      display_1602_listchar(0, 0, first); //在第一行显示"welcome to use"
 178   2      while(1)
 179   2      {
C51 COMPILER V8.02   LCMTEMP                                                               08/11/2007 11:03:53 PAGE 4   

 180   3      ReadTemperature();
 181   3      display_1602_onechar(0,1,sdata/10+0x30);
 182   3      display_1602_onechar(1,1,sdata%10+0x30);
 183   3      display_1602_onechar(2,1,'.');
 184   3      display_1602_onechar(3,1,xiaoshu/10+0x30);
 185   3      display_1602_onechar(4,1,xiaoshu%10+0x30);
 186   3      display_1602_onechar(5,1,'C');
 187   3      
 188   3      
 189   3      
 190   3      
 191   3      
 192   3      }
 193   2      
 194   2      
 195   2      
 196   2       }
 197   1      
 198   1      
 199   1      
 200   1       }
 201          
 202          /*=======================================================================*/
 203          
 204          
 205          /*==========================================================================*/
 206          /*                              写控制                                      */
 207          /*==========================================================================*/
 208          void write_1602_command(unsigned char command,BuysC) //BuysC为0时忽略忙检测
 209          {
 210   1      if (BuysC) read_1602_status();    //检测忙信号
 211   1      LCM1602_DATA=command;
 212   1      LCM1602_RS=0;
 213   1      LCM1602_RW=0; 
 214   1      LCM1602_E=0;
 215   1      LCM1602_E=0;
 216   1      LCM1602_E=1;
 217   1      }
 218          
 219          
 220          /*=========================================================================*/
 221          /*                              写数据                                     */
 222          /*=========================================================================*/
 223          void write_1602_data(unsigned char Data)
 224          {
 225   1      read_1602_status();//检测忙
 226   1      LCM1602_DATA=Data;
 227   1      LCM1602_RS=1;
 228   1      LCM1602_RW=0;
 229   1      LCM1602_E=0;      //若晶振速度太高可以在这后加小的延时
 230   1      LCM1602_E=0;      //延时
 231   1      LCM1602_E=1;
 232   1      }
 233          
 234          /*==================================*/
 235          /*          读状态,等待空闲         */
 236          /*==================================*/
 237          void read_1602_status(void)

⌨️ 快捷键说明

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