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

📄 wdbj.lst

📁 一个可控温度报警装置的源码,用DS18B20采集温度,用4个按键设置温度的上下限并存在EEPROM中,按键可实现单击和长按,且时间精确,也是一个不错的键盘程序.4个数码管显示温度,4个数码管用来设定.
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   WDBJ                                                                  03/08/2008 22:56:25 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE WDBJ
OBJECT MODULE PLACED IN wdbj.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE wdbj.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<intrins.h>     
   2          #include<reg52.h>
   3          #include<absacc.h>
   4          #define uint  unsigned int
   5          #define uchar unsigned char
   6          
   7          #define liangtime       40                                      //设置闪烁时间
   8          #define mietime         40                                      
   9          #define MaxRate 50                                              //重复前的延迟值600MS
  10          #define MinRate 20                                              //重复速度240MS
  11          #define         N       2                                               //设定去抖时间
  12          
  13          //定时器1的时间常数和方式控制字2ms
  14          #define V_TH0   (65535-10000)/256
  15          #define V_TL0   (65535-10000)%256
  16          #define V_TMOD  0x01
  17          sbit    ds18b20_IO=P1^0;
  18          sbit    duX=P2^7;       //段选使能
  19          sbit    weX=P2^6;       //位选使能
  20          sbit    K1=P3^7;        //设置键
  21          sbit    K2=P3^5;        //加数键
  22          sbit    K3=P3^6;        //减数键
  23          sbit    K4=P3^4;
  24          sbit    led4=P1^3;      
  25          sbit    led8=P1^7;
  26          sbit    sda=P1^2;       
  27          sbit    scl=P1^1;
  28          uchar   buffer[]={0,0,0,0,0,0,0,0};             //数码管键显缓存
  29          uchar   *pb=&buffer[0];
  30          uchar   code    duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  31                                  0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管段码表
  32          uchar   code    wema[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选
  33          uchar   tempL,tempH;
  34          uchar   task;                                           //task:按键状态,0:去抖,1:重复的延缓,2:重复
  35          bit             keydone,keyprocess;                                     //keydone:按键任务完成标志,为1时已完成
  36                                                                                          //keyprocess:按键有效标志,为1时对按键执行
  37          bit     shans;                                                          //shans 为闪烁使能位,1时LED闪,shanz为闪烁状态位,
  38          bit             shanz;                                                          //1时为灭
  39          bit     keymark;                                                //设定状态标志位
  40          uchar   blink;                                          //闪烁控制器,某位为1时闪烁。
  41          uchar   ledtime;                                                //闪烁时间
  42          uchar   sdate;                                          //显示位置变量
  43          
  44          uchar   funcnt;                                         //功能键的个数
  45          uchar   funval;                                         //最后扫描到的功能键的值
  46          uchar   keypre=0x00;                            //存放上次功能键的键值
  47          uint    num1;
  48          void    keyXZ(void);
  49          void    display(uchar pos);
  50          /****************************************************************************/
  51          /*                                                                          */
  52          /*                         所用的延时子程序                                 */
  53          /*                                                                          */
  54          /****************************************************************************/
  55          void DelayM(uint a)                                                                             //延时函数 1MS/次       
C51 COMPILER V7.50   WDBJ                                                                  03/08/2008 22:56:25 PAGE 2   

  56          {
  57   1                      unsigned char i;
  58   1                      while( --a != 0)
  59   1                      {               
  60   2                              for(i = 0; i < 125; i++);                                       //一个 ; 表示空语句,CPU空转。
  61   2                      }                                                                                       //i 从0加到125,CPU大概就耗时1毫秒
  62   1      }
  63          void DelayU(uint b)                                                                             //延时函数 US级别       
  64          {
  65   1                      unsigned char i;
  66   1                      while( --b != 0)
  67   1                      {               
  68   2                              for(i = 0; i < 20; i++);                                        //一个 ; 表示空语句,CPU空转。
  69   2                      }                                 
  70   1      }
  71          void delay_5us(uchar c)         //(2.17*y+5)us延时,11.0592M晶振
  72          {
  73   1          while(--c);
  74   1      }
  75          void    delay(void)
  76          {;;}
  77          /******************************************************************/
  78          /******************************************************************/
  79          /*                                              DS18B20驱动函数                                                   */
  80          /******************************************************************/
  81          void DS18b20_w_byte(uchar dat);
  82          uchar DS18b20_r_byte(void);
  83          DS18b20_init(void);
  84          uint DS18b20_readTemp(void);
  85          /******************************************************************/
  86          /*                                              写一字节函数                                                      */
  87          /*                                              入口参数dat                                                               */
  88          /******************************************************************/
  89          void DS18b20_w_byte(uchar dat)                  //向18b20写一个字节dat是要写的内容
  90          {
  91   1          uchar i;
  92   1          for(i=0;i<8;i++)
  93   1          {
  94   2              ds18b20_IO=0;
  95   2              ds18b20_IO=0x01&dat;
  96   2              delay_5us(15);                  //要求总时间在60-120us
  97   2              ds18b20_IO=1;                   //释放总线    
  98   2              dat=dat>>1;
  99   2          }    
 100   1      }
 101          
 102          /******************************************************************/
 103          /*                                              读一字节函数                                                      */
 104          /*                                                                                                                                */
 105          /******************************************************************/
 106          uchar DS18b20_r_byte(void)                      //从18b20读一个字节.返回读到的内容
 107          {
 108   1          uchar i,dat;
 109   1          dat=0;                              
 110   1          for(i=0;i<8;i++)
 111   1          {
 112   2      
 113   2              ds18b20_IO=0;
 114   2              dat=dat>>1;
 115   2              ds18b20_IO=1;                   //释放总线
 116   2              if(ds18b20_IO)
 117   2                   dat|=0x80;
C51 COMPILER V7.50   WDBJ                                                                  03/08/2008 22:56:25 PAGE 3   

 118   2              delay_5us(15);                  //要求总时间在60-120us
 119   2          }
 120   1          return dat;    
 121   1      }
 122          
 123          /******************************************************************/
 124          /*                                              ds18b20初始化函数                                                 */
 125          /*                                                                                                                                */
 126          /******************************************************************/
 127          DS18b20_init(void)                                      //每次上电都给18b20初始化,设置18b20的参数
 128          {
 129   1              uchar x=0;
 130   1          ds18b20_IO=1;
 131   1              delay_5us(25);
 132   1              ds18b20_IO=0;
 133   1          delay_5us(255);                     //要求480-960us
 134   1          ds18b20_IO=1;                       //释放总线
 135   1          delay_5us(40);                      //要求60-120us
 136   1              x=ds18b20_IO;                                           //用X值来判断初始化是否成功
 137   1              delay_5us(60);
 138   1      }
 139          
 140          /******************************************************************/
 141          /*                                              向DS18B20读温度值                                                 */
 142          /*                                              出口参数DS18b20_temp                                      */
 143          /******************************************************************/
 144          uint DS18b20_readTemp(void)                                     //读18b20温度值
 145          {
 146   1              uint DS18b20_temp,t;                            //读出的18b20温度值存放地
 147   1              uchar   i;
 148   1              float tt=0;
 149   1              DS18b20_init();
 150   1              DS18b20_w_byte(0xcc);                   //发送Skip ROM命令
 151   1          DS18b20_w_byte(0x44);                       //发送温度转换命令
 152   1              for(i=0;i<7;i++)
 153   1              {
 154   2                      for(sdate=0;sdate<=7;sdate++)
 155   2                      {
 156   3                              display(sdate);
 157   3                              DelayM(3);
 158   3                      }
 159   2                      keyXZ();
 160   2              }
 161   1              DS18b20_init();
 162   1              DS18b20_w_byte(0xcc);                   //发送Skip ROM命令
 163   1          DS18b20_w_byte(0xbe);                       //读温度寄存器(头两个值分别为温度的低和高位
 164   1              tempL=DS18b20_r_byte();                         //读温度低字节  
 165   1              tempH=DS18b20_r_byte();                         //读温度高字节
 166   1              t=tempH;
 167   1              t<<=8;
 168   1              t|=tempL;
 169   1              tt=t*0.0625;
 170   1              DS18b20_temp=tt*10+0.5;
 171   1              return(DS18b20_temp); 
 172   1      }
 173          //以下为EEPROM所用子函数
 174          //起始信号
 175          void start()
 176          {
 177   1              sda=1;
 178   1              delay();
 179   1              scl=1;
C51 COMPILER V7.50   WDBJ                                                                  03/08/2008 22:56:25 PAGE 4   

 180   1              delay();
 181   1              sda=0;
 182   1              delay();
 183   1              scl=0;
 184   1              delay();
 185   1      }
 186          //停止信号
 187          void stop()
 188          {
 189   1              sda=0;
 190   1              delay();
 191   1              scl=1;
 192   1              delay();
 193   1              sda=1;
 194   1              delay();
 195   1      }
 196          //应答
 197          void yingda()
 198          {
 199   1              uchar i=0;
 200   1              scl=1;
 201   1              delay();
 202   1              while((sda==1)&&(i<250))i++;
 203   1              scl=0;
 204   1              delay();
 205   1      }
 206          //初始
 207          void init()
 208          {
 209   1              scl=1;
 210   1              delay();
 211   1              sda=1;
 212   1              delay();        
 213   1      }
 214          //写一个字节
 215          void write_byte(uchar date)
 216          {
 217   1              uchar i,temp;
 218   1              temp=date;
 219   1              for(i=0;i<8;i++)
 220   1              {
 221   2                      temp=temp<<1;
 222   2                      scl=0;
 223   2                      delay();
 224   2                      sda=CY;
 225   2                      delay();
 226   2                      scl=1;
 227   2                      delay();        
 228   2              }
 229   1              scl=0;
 230   1              delay();
 231   1              sda=1;
 232   1              delay();
 233   1      }
 234          //读一个字节
 235          uchar read_byte()
 236          {       
 237   1              uchar i,j,k;
 238   1              scl=0;
 239   1              delay();
 240   1              sda=1;
 241   1              for(i=0;i<8;i++)
C51 COMPILER V7.50   WDBJ                                                                  03/08/2008 22:56:25 PAGE 5   

 242   1              {
 243   2                      delay();
 244   2                      scl=1;
 245   2                      delay();
 246   2                      if (sda==1) j=1;
 247   2                            else j=0;
 248   2                      k=(k<<1)|j;
 249   2                      scl=0;          
 250   2              }
 251   1              delay();
 252   1              return k;
 253   1      }
 254          
 255          void write_add(uchar dizhi,uchar date)
 256          {
 257   1              start();
 258   1              write_byte(0xa0);
 259   1              yingda();
 260   1              write_byte(dizhi);
 261   1              yingda();
 262   1              write_byte(date);

⌨️ 快捷键说明

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