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

📄 5.lst

📁 由单片机、DS18B20、DS1302、1602等组成时间温度显示系统。有Proteus图和C语言程序
💻 LST
字号:
C51 COMPILER V8.05a   5                                                                    12/09/2008 10:17:59 PAGE 1   


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

line level    source

   1          #include <reg51.h>
   2          #include <intrins.h>
   3          #define HIGH 1
   4          #define LOW 0
   5          #define  uchar unsigned char
   6          #define  uint  unsigned int
   7          
   8          //***************LCD1602********************************
   9          #define DATA_MODE 0x28 //LCD模式设置,0x28位四位数据线模式
  10          #define OPEN_SCREEN 0x0C //打开LCD显示
  11          #define DISPLAY_ADDRESS 0x80 //写地址指令
  12          #define CLEARSCREEN LCD_en_com(0x01) //清屏
  13          #define LCDIO P0 //LCD1602的高四位接在P0口的高四位
  14          sbit LCD1602_RS=P0^1; //RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
  15          sbit LCD1602_EN=P0^0; //E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
  16          void LCD_en_com(uchar command); //写命令指令
  17          void LCD_en_dat(uchar temp); //写数据指令
  18          void LCD_set_xy(uchar x, unsigned char y); //设置显示地址:X为横轴(0-15),Y为纵轴(0-1).
  19          void LCD_write_char(uchar x,uchar y,uchar dat); //写一个字符
  20          void LCD_write_string(uchar x,uchar y,uchar *s);//写一个字符串
  21          void LCD_write_int(uchar x,uchar y,uint intdat); //写无字符型整形数
  22          void LCD_init(void); //lcd初始化
  23          void cover(void);
  24          
  25          //************************DS1302*******************************************//
  26          sbit RST =P3^4; //ds1302的接线
  27          sbit IO  =P3^3;
  28          sbit SCLK=P3^2;
  29          sbit ACC0=ACC^0;  //累加器
  30          sbit ACC7=ACC^7;
  31          uchar times[7]={50,59,23,30,11,7,8}; //存放时间
  32          
  33          uchar led[13];
  34          void change_time(unsigned char i);
  35          //*************************DS18B20*******************************************//
  36          sbit DQ=P1^0;
  37          uint   h;             //定义循环变量
  38          uchar data  temp_data[2]={0x00,0x00};               // 读出温度暂放
  39          uchar data  display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用
  40          uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  41          //************************其他******************************************//
  42          sbit alarm_speaker=P3^7; //蜂鸣器的接线
  43          void delay(uchar i); //延时程序
  44          unsigned char key=16; //存放健值
  45          //***************************************************************************************
  46          void LCD_en_write(void) //EN端产生一个高电平脉冲,写LCD
  47          {
  48   1      LCD1602_EN=HIGH;
  49   1      _nop_();
  50   1      LCD1602_EN=LOW;
  51   1      }
  52          //****************************************************************************************
  53          void LCD_en_com(uchar command)
  54          {
  55   1      delay(9);
C51 COMPILER V8.05a   5                                                                    12/09/2008 10:17:59 PAGE 2   

  56   1      LCD1602_RS=LOW; //RS=0 写命令
  57   1      LCDIO&=0x0f;    //清高四位
  58   1      LCDIO|=command&0xf0; //先发送高四位数据
  59   1      LCD_en_write();
  60   1      command=command<<4;
  61   1      LCDIO&=0x0f;
  62   1      LCDIO|=command&0xf0; //发送低四位数据
  63   1      LCD_en_write();
  64   1      }
  65          //*****************************************************************************************
  66          void LCD_en_dat(uchar dat)
  67          {
  68   1      delay(9);
  69   1      LCD1602_RS=HIGH; //RS=1 写数据
  70   1      LCDIO&=0x0f;     //清高四位
  71   1      LCDIO|=dat&0xf0; //写高四位
  72   1      LCD_en_write();
  73   1      dat=dat<<4;              //低四位移到高四位
  74   1      LCDIO&=0x0f;     // 清高四位
  75   1      LCDIO|=dat&0xf0; //写低四位
  76   1      LCD_en_write();
  77   1      }
  78          //**************设置显示地址:X为横轴(0-15),Y为纵轴(0-1)**************************************
  79          void LCD_set_xy(uchar x,uchar y)
  80          {
  81   1      uchar address;
  82   1      x&=0x0f;
  83   1      if(!y)
  84   1      address=0x80+x;
  85   1      else
  86   1      address=0xc0+x;
  87   1      LCD_en_com(address);
  88   1      }
  89          //***************写一个字符:X为横轴(0-15),Y为纵轴(0-1)**********
  90          void LCD_write_char(uchar x,uchar y,uchar dat)
  91          {
  92   1      LCD_set_xy(x,y);
  93   1      LCD_en_dat(dat);
  94   1      }
  95          //***************写一个字符串**********
  96          void LCD_write_string(uchar x,uchar y,const uchar *s)
  97          {
  98   1      LCD_set_xy(x,y);
  99   1      while(*s)
 100   1      {
 101   2      LCD_en_dat(*s);
 102   2      s++;
 103   2      }
 104   1      }
 105          //****************写一个无字符整数***************************************
 106          void LCD_write_int(uchar x,uchar y,uint intdat)
 107          {
 108   1      uchar i=0,temp[5];
 109   1      LCD_set_xy(x,y);
 110   1      if(intdat==0)
 111   1      {
 112   2      LCD_en_dat(0x30);
 113   2      return;
 114   2      }
 115   1      while(intdat/10 || intdat%10)
 116   1      {
 117   2      temp[i]=intdat%10;
C51 COMPILER V8.05a   5                                                                    12/09/2008 10:17:59 PAGE 3   

 118   2      intdat/=10;
 119   2      i++;
 120   2      }
 121   1      while(i)
 122   1      {
 123   2      i--;
 124   2      LCD_en_dat(temp[i]+0x30);
 125   2      }
 126   1      }
 127          //*****//LCD的初始化函数(刚上电的时候一定要调用一次)//*********************
 128          void LCD_init(void)
 129          {
 130   1      LCD_en_com(DATA_MODE); //设计四位数据线模式
 131   1      LCD_en_write();
 132   1      delay(9);
 133   1      LCD_en_com(DATA_MODE);
 134   1      LCD_en_com(OPEN_SCREEN); //打开LCD显示
 135   1      LCD_en_com(DISPLAY_ADDRESS);//设计首地址
 136   1      CLEARSCREEN; //清屏
 137   1      delay(9);
 138   1      }
 139          //***********************18b20************
 140          //*********************11微秒延时函数*********************//
 141          void delay1(uint t)
 142          {
 143   1      for(;t>0;t--);
 144   1      }
 145          //*********************18B20复位函数*********************//
 146          reset(void)
 147          {
 148   1      char presence=1;
 149   1      while(presence)
 150   1      {
 151   2      while(presence)
 152   2        {
 153   3              DQ=1;_nop_();_nop_();//总线上拉
 154   3              DQ=0;                //下拉         
 155   3              delay1(50);           //维持550us,最短维持480us
 156   3              DQ=1;                //总线上拉
 157   3              delay1(6);            //检测总线上升沿,66us
 158   3              presence=DQ;         //DS18B20发存在低电平信号(60-240us);presence=0继续下一步
 159   3         }
 160   2      delay1(30);              //延时300us,总线恢复高电平,DQ=1;
 161   2      presence = ~DQ;         //取反,跳出循环
 162   2      }
 163   1      DQ=1;
 164   1      } 
 165          //*********************18B20写命令函数*********************//
 166          void write_byte1(uchar val)
 167          {
 168   1      uchar i;
 169   1      for (i=8; i>0; i--) //定义 8 bit,写 8 bit
 170   1      {
 171   2      DQ=1;_nop_();_nop_(); 
 172   2      DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
 173   2      DQ = val&0x01;      //最低位移出,并写入总线
 174   2      delay1(6);           //66us
 175   2      val=val/2;          //右移一位,倒数第二位变为最低位
 176   2      }
 177   1      DQ = 1;
 178   1      delay(1);           //高电平维持11us,写结束 
 179   1      }
C51 COMPILER V8.05a   5                                                                    12/09/2008 10:17:59 PAGE 4   

 180          //*********************18B20读1个字节函数*********************//
 181          uchar read_byte1(void)
 182          {
 183   1      uchar i;
 184   1      uchar value = 0;
 185   1      for (i=8;i>0;i--)
 186   1      {
 187   2      DQ=1;_nop_();_nop_();
 188   2      value>>=1;           //右移一位
 189   2      DQ = 0;            
 190   2      _nop_();_nop_();_nop_();_nop_();          //4us
 191   2      DQ = 1;_nop_();_nop_();_nop_();_nop_();   //4us ,读时隙
 192   2      if(DQ)value|=0x80;   //DQ=1,则写入为 10000000
 193   2      delay1(6);            //66us
 194   2      }
 195   1      DQ=1;
 196   1      return(value);
 197   1      }
 198          //*********************读出温度函数*********************//
 199          read_temp()
 200          {
 201   1              reset();       //总线复位
 202   1              write_byte1(0xCC); // 发Skip ROM命令
 203   1              write_byte1(0xBE); //  发读命令
 204   1              temp_data[0]=read_byte1();  //温度低8位
 205   1              temp_data[1]=read_byte1();  //温度高8位
 206   1              reset();
 207   1              write_byte1(0xCC); // Skip ROM
 208   1              write_byte1(0x44); // 发转换命令
 209   1      }
 210          //*********************温度数据处理函数*********************//
 211          work_temp()
 212          {
 213   1      uchar n=0;       //存储符号
 214   1      if(temp_data[1]>112)
 215   1       {temp_data[1]=(0xFF-temp_data[1]);temp_data[0]=(0xFF-temp_data[0]);n=1;} //负温度求补码
 216   1      
 217   1      display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];  //处理小数位
 218   1      display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//低八位屏蔽小数位后右移四位与高八位屏蔽符号

⌨️ 快捷键说明

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