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

📄 system_alarm.lst

📁 温度采集,基于KEILC写的,容易看懂
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.08   SYSTEM_ALARM                                                          04/04/2007 16:55:38 PAGE 1   


C51 COMPILER V7.08, COMPILATION OF MODULE SYSTEM_ALARM
OBJECT MODULE PLACED IN system_alarm.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE system_alarm.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************
   2                                    智能温控器
   3          
   4          问题描述:当温控开关打开时,若测得环境温度大于设定温度,则继电器吸合
   5                            ,启动压缩机工作;若测得环境温度小于设定温度,则继电器释放,
   6                            压缩机停止工作。
   7                    该实验可以应用于对温度控制精度要求不是很高的场合,例如,粮仓,
   8                            电冰箱,空调,电饭锅等。如果配以通讯接口,可以做成多点温度检
   9                    测监控系统。具有极强的扩展性。
  10          
  11          作者:    yiwei  "shannxi university of technolog " 
  12          日期:    2007.4.1在proteus上仿真成功;
  13                    2007.4.3电路板焊接调试成功
  14          
  15          参考资料:[1] 周兴华 编著 《单片机智能产品c语言设计实例祥解》
  16                    [2]《电子制作》 2006.11
  17                    [3] www.proteus.com
  18          
  19          注意: 此文档为仿真程序,若要在试验板上验证,需要须改一下函数
  20                  
  21          
  22          void lcd_wait(void)
  23          {
  24              DATAPORT=0xff;           
  25                  LCM_EN=1;
  26              LCM_RS=0;                           
  27              LCM_RW=1;                           
  28              _nop_();
  29              while(DATAPORT&BUSY);
  30                  LCM_EN=0;
  31                  
  32          }
  33          
  34          *******************************************************************/
  35          
  36          #include<reg51.h>
  37          #include<intrins.h>
  38          #include <absacc.h>
  39          #define uchar unsigned char
  40          #define uint   unsigned int
  41          
  42          #define BUSY  0x80                               //lcd忙检测标志
  43          #define DATAPORT P0                              //定义P0口为LCD通讯端口
  44          #define PLAYE_ADDR XBYTE[0XBFFF]                 //语音报警地址
  45          
  46          sbit RED_ALARM=P1^0;                                             //红色指示灯
  47          sbit WRITE_ALARM=P1^1;                                          //白色指示灯
  48          sbit GREEN_ALARM=P1^2;                                          //绿色指示灯
  49          sbit P1_4=P1^4;                                             //时钟调整
  50          sbit P1_5=P1^5;                                                 //时钟加
  51          sbit P1_6=P1^6;                                                 //时钟减
  52          
  53          sbit DQ = P1^7;                                                 //定义ds18b20通信端口 
  54          sbit LCM_RS=P2^0;                                                               //数据/命令端
  55          sbit LCM_RW=P2^1;                                                               //读/写选择端
C51 COMPILER V7.08   SYSTEM_ALARM                                                          04/04/2007 16:55:38 PAGE 2   

  56          sbit LCM_EN=P2^2;                                               //LCD使能信号
  57          sbit ad_busy=P3^2;                                              //adc中断方式接口
  58          sbit RECLED_EOC=P3^5;                                           //ISD1420放音结束查询标志
  59          sbit OUT=P3^7;
  60          
  61          uchar ad_data;                                                  //ad采样值存储                                          
  62          uchar seconde=0;                                                //定义并初始化时钟变量
  63          uchar minite=0;
  64          uchar hour=12;
  65          uchar mstcnt=0;
  66          uchar temp1,temp2,temp;                                     //温度显示变量
  67          uchar t,set;
  68          uchar K;
  69          bit ON_OFF=0;
  70          bit outflag;
  71          
  72          uchar code str0[]={"---  :  :  ---  "};
  73          uchar code str1[]={"SET:  C SA:  . C"};
  74          
  75          void delay_LCM(uint);                                                                                                   //LCD延时子程序
  76          void initLCM( void);                                                                                                    //LCD初始化子程序
  77          void lcd_wait(void);                                                                                                    //LCD检测忙子程序
  78          void WriteCommandLCM(uchar WCLCM,uchar BusyC);                              //写指令到ICM子函数
  79          void WriteDataLCM(uchar WDLCM);                                             //写数据到LCM子函数
  80          void DisplayOneChar(uchar X,uchar Y,uchar DData);                           //显示指定坐标的一个字符子函数
  81          void DisplayListChar(uchar X,uchar Y,uchar code *DData);                    //显示指定坐标的一串字符子函数
  82          void init_timer0(void);                                                                                         //定时器初始化
  83          void displayfun1(void);
  84          void displayfun2(void);
  85          void displayfun3(void);
  86          void displayfun4(void);
  87          void keyscan(void );                                                                                        //键盘扫描子程序
  88          void set_adj(void);
  89          void inc_key(void);
  90          void dec_key(void);
  91          void delay_18B20(unsigned int i);
  92          void Init_DS18B20(void) ;
  93          uchar ReadOneChar(void);
  94          void WriteOneChar(unsigned char dat);
  95          void ReadTemperature(void);
  96          void ad0809(void);
  97          void playalarm(void); 
  98          
  99          
 100          /*********延时K*1ms,12.000mhz**********/
 101          
 102          void delay_LCM(uint k)
 103          {
 104   1          uint i,j;
 105   1          for(i=0;i<k;i++)
 106   1          {
 107   2              for(j=0;j<60;j++)
 108   2                      {;}
 109   2          }
 110   1      }   
 111          /**********写指令到ICM子函数************/
 112          
 113          void WriteCommandLCM(uchar WCLCM,uchar BusyC)
 114          {
 115   1          if(BusyC)lcd_wait();
 116   1              DATAPORT=WCLCM;
 117   1          LCM_RS=0;                   // 选中指令寄存器
C51 COMPILER V7.08   SYSTEM_ALARM                                                          04/04/2007 16:55:38 PAGE 3   

 118   1          LCM_RW=0;                   // 写模式       
 119   1          LCM_EN=1;    
 120   1              _nop_();   
 121   1              _nop_();
 122   1              _nop_(); 
 123   1          LCM_EN=0;  
 124   1      }
 125          
 126          /**********写数据到LCM子函数************/
 127          
 128          void WriteDataLCM(uchar WDLCM)
 129          { 
 130   1          lcd_wait( );            //检测忙信号    
 131   1              DATAPORT=WDLCM;
 132   1          LCM_RS=1;               // 选中数据寄存器
 133   1          LCM_RW=0;                   // 写模式
 134   1          LCM_EN=1;
 135   1          _nop_();
 136   1              _nop_();
 137   1              _nop_();
 138   1          LCM_EN=0;
 139   1      }
 140          
 141          /***********lcm内部等待函数*************/
 142          
 143          void lcd_wait(void)
 144          {
 145   1          DATAPORT=0xff;           
 146   1              LCM_EN=1;
 147   1          LCM_RS=0;                           
 148   1          LCM_RW=1;                           
 149   1          _nop_();
 150   1          while(DATAPORT&BUSY)
 151   1              {  LCM_EN=0;
 152   2                 _nop_();
 153   2                 _nop_();
 154   2                 LCM_EN=1;
 155   2                 _nop_();
 156   2                 _nop_();
 157   2                 }
 158   1              LCM_EN=0;
 159   1              
 160   1      }
 161          
 162          /**********LCM初始化子函数***********/
 163          
 164          void initLCM( )
 165          {   
 166   1              DATAPORT=0;     
 167   1              delay_LCM(15);
 168   1              WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号
 169   1          delay_LCM(5); 
 170   1          WriteCommandLCM(0x38,0);
 171   1          delay_LCM(5); 
 172   1          WriteCommandLCM(0x38,0);
 173   1          delay_LCM(5); 
 174   1      
 175   1          WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
 176   1          WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号
 177   1          WriteCommandLCM(0x01,1);    //清屏,检测忙信号
 178   1          WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号
 179   1          WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
C51 COMPILER V7.08   SYSTEM_ALARM                                                          04/04/2007 16:55:38 PAGE 4   

 180   1      }
 181          
 182          /****************显示指定坐标的一个字符子函数*************/
 183          
 184          void DisplayOneChar(uchar X,uchar Y,uchar DData)
 185          {
 186   1          Y&=1;
 187   1          X&=15;
 188   1          if(Y)X|=0x40;               //若y为1(显示第二行),地址码+0X40
 189   1          X|=0x80;                    //指令码为地址码+0X80
 190   1          WriteCommandLCM(X,0);
 191   1          WriteDataLCM(DData);
 192   1      }
 193          
 194          /***********显示指定坐标的一串字符子函数***********/
 195          
 196          void DisplayListChar(uchar X,uchar Y,uchar code *DData)
 197          {
 198   1          uchar ListLength=0;
 199   1          Y&=0x01;
 200   1          X&=0x0f;
 201   1          while(X<16)
 202   1          {
 203   2              DisplayOneChar(X,Y,DData[ListLength]);
 204   2              ListLength++;
 205   2              X++;
 206   2          }
 207   1      }
 208          
 209          /***********ds18b20延迟子函数(晶振12MHz )*******/ 
 210          
 211          void delay_18B20(unsigned int i)
 212          {
 213   1              while(i--);
 214   1      }
 215          
 216          /**********ds18b20初始化函数**********************/
 217          
 218          void Init_DS18B20(void) 
 219          {
 220   1               unsigned char x=0;
 221   1               DQ = 1;          //DQ复位
 222   1               delay_18B20(8);  //稍做延时
 223   1               DQ = 0;          //单片机将DQ拉低
 224   1               delay_18B20(80); //精确延时 大于 480us
 225   1               DQ = 1;          //拉高总线
 226   1               delay_18B20(14);
 227   1               x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 228   1               delay_18B20(20);
 229   1      }
 230          
 231          /***********ds18b20读一个字节**************/  
 232          
 233          unsigned char ReadOneChar(void)
 234          {
 235   1              uchar i=0;
 236   1              uchar dat = 0;
 237   1              for (i=8;i>0;i--)
 238   1               {
 239   2                        DQ = 0; // 给脉冲信号
 240   2                        dat>>=1;
 241   2                        DQ = 1; // 给脉冲信号
C51 COMPILER V7.08   SYSTEM_ALARM                                                          04/04/2007 16:55:38 PAGE 5   

 242   2                        if(DQ)
 243   2                        dat|=0x80;
 244   2                        delay_18B20(4);
 245   2               }
 246   1              return(dat);
 247   1      }
 248          
 249          /*************ds18b20写一个字节****************/  
 250          
 251          void WriteOneChar(uchar dat)
 252          {
 253   1              unsigned char i=0;
 254   1              for (i=8; i>0; i--)
 255   1              {
 256   2                      DQ = 0;
 257   2                      DQ = dat&0x01;
 258   2              delay_18B20(5);
 259   2                      DQ = 1;
 260   2              dat>>=1;
 261   2       }
 262   1      }
 263          
 264          /**************读取ds18b20当前温度************/
 265          
 266          void ReadTemperature(void)
 267          {
 268   1              unsigned char a=0;
 269   1              unsigned char b=0;
 270   1              unsigned char t=0;
 271   1      
 272   1              Init_DS18B20();
 273   1              WriteOneChar(0xCC);     // 跳过读序号列号的操作
 274   1              WriteOneChar(0x44);     // 启动温度转换
 275   1      
 276   1              delay_18B20(100);       // this message is wery important
 277   1      
 278   1              Init_DS18B20();
 279   1              WriteOneChar(0xCC);     //跳过读序号列号的操作
 280   1              WriteOneChar(0xBE);     //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 281   1      
 282   1              delay_18B20(100);

⌨️ 快捷键说明

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