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

📄 clock.lst

📁 LCD1602 显示时钟 LCD1602应用实例带有温度控制
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   CLOCK                                                                 07/14/2008 21:00:26 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE CLOCK
OBJECT MODULE PLACED IN clock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE clock.c DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          /*============================================================
   3          使用1602液晶显示DS1302+S51时钟+温度显示  
   4          ==============================================================       
   5          
   6          SMC1602A(16*2)模拟口线接线方式
   7          连接线图: 
   8          ---------------------------------------------------
   9          |LCM-----51  | LCM-----51  | LCM------51 |
  10          ---------------------------------------------|
  11          |DB0-----P1.0 | DB4-----P1.4 | RS-------P2.0 |
  12          |DB1-----P1.1 | DB5-----P1.5 | RW-------P2.1 |
  13          |DB2-----P1.2 | DB6-----P1.6 | E--------P2.2 |
  14          |DB3-----P1.3 | DB7-----P1.7 | VLCD接1K电阻到GND|
  15          ---------------------------------------------------
  16          DS1302 接线图
  17          
  18                   Vcc2  CLK I/O  /RST 
  19                     
  20                      |   |   |   |
  21                     --------------
  22                    | 8   7   6   5|
  23                    |   DS1302     |
  24                    |              |
  25                    | 1   2   3   4|
  26                     --------------
  27                      |   |   |   |
  28                   VCC1           GND
  29          
  30          1 脚接+5V    2,3脚32768HZ晶振  4脚接地  5脚接S51的P02 6脚接S51的P01 7接S51的P00
  31          8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
  32          电压在2.5V以上即可维持
  33          
  34          按键说明:1. 共三个键,低电平有效
  35                    2. P04 和 P05 同时按:初始化
  36                    3. P06 端口按键:选择要调整的项目
  37                    4. P05 端口按键:增加;P04端口按键:减少
  38                    5. P03 端口按键:选择显示模式;新增按键
  39          
  40          
  41          [注:AT89S51使用12M晶振]
  42          =============================================================*/
  43          #include <AT89x51.h>
  44          #include <string.h>
  45          #include<intrins.h>
  46          
  47          #define LCM_RS P2_0 //定义引脚
  48          #define LCM_RW P2_1
  49          #define LCM_E P2_2
  50          #define LCM_Data P1
  51          #define Busy 0x80 //用于检测LCM状态字中的Busy标识
  52          #define uchar unsigned char
  53          
  54          uchar id,timecount,dipsmodid;
  55          bit lmcinit_or_not; //是否需要清屏标志位“1”为需要“0”为不需要
C51 COMPILER V7.06   CLOCK                                                                 07/14/2008 21:00:26 PAGE 2   

  56          bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志
  57          void Disp_line1(void); //显示屏幕第一行 
  58          void Disp_line2(void); //显示屏幕第二行
  59          void id_case1_key();
  60          //void Dispmod_id_case_key(void);//选择显示模式
  61          void Disp_mod0(void);//显示模式0
  62          void Disp_mod1(void);//显示模式
  63          
  64          
  65          //*********** DS1302 时间显示定义部分
  66          sbit T_CLK=P0^0;
  67          sbit T_IO =P0^1;
  68          sbit T_RST=P0^2;
  69          sbit ACC0=ACC^0;
  70          sbit ACC7=ACC^7;
  71          void Set(uchar,uchar);     //根据选择调整相应项目
  72          void   RTInputByte(uchar);       /* 输入 1Byte */
  73          uchar  RTOutputByte(void);       /* 输出 1Byte */
  74          void   W1302(uchar, uchar);   // 向DS1302写入一个字节
  75          uchar  R1302(uchar);          // 从DS1302读出一个字节
  76          void   Set1302(unsigned char * ); //  设置时间 
  77          bit sec,min,hour,year,mon,day,weekk; //闪烁标志位
  78          //初始化后设置为:04年12月2日星期4 0点0分0秒
  79          unsigned char inittime[7]={0x00,0x00,0x00,0x02,0x12,0x04,0x04};
  80          //                          秒  分钟 小时  日   月   年  星期
  81          
  82          //***** 18B20温度显示定义部
  83          sbit DQ=P0^7; //18B20 接P07口
  84          typedef unsigned char byte;
  85          typedef unsigned int  word;
  86          Read_Temperature(char,char);
  87          void mychar(void);
  88          byte ow_reset(void);
  89          byte read_byte(void);
  90          void write_byte(char val);
  91          void adjust_res(char res); //res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
  92                                     //              0.5, 0.25, 0.125   
  93          
  94          //*******温度控制部分*********
  95          bit tl_flash_flag;       //下限闪烁标志
  96          bit th_flash_flag;       //上限闪烁标志
  97          bit tl_flag;               //下限越限标志  
  98          bit th_flag;               //上限越限标志  
  99          bit tl_sign,th_sign;            //温度零下标志 0:零上,1:零下
 100          char tempid;
 101          void Disp_Temp(void);    //显示上下限温度
 102          void Set_TH_Temp(void);  //设置温度上限
 103          void Set_TL_Temp(void);  //设置温度下限
 104          signed char tl=20,th=45;
 105          void Compare_Temp(signed char l,signed char h);     //比较温度
 106          void Tl_Al(void);         //下限越限报警
 107          void Th_Al(void);         //上限越限报警
 108          
 109          
 110          
 111          //******* 1602LCD驱动 **********************************************************
 112          void WriteDataLCM(unsigned char WDLCM);
 113          void WriteCommandLCM(unsigned char WCLCM,BuysC);
 114          unsigned char ReadStatusLCM(void);
 115          void LCMInit(void);
 116          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
 117          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
C51 COMPILER V7.06   CLOCK                                                                 07/14/2008 21:00:26 PAGE 3   

 118          void Delay5Ms(void);
 119          void Delay400Ms(void);
 120          unsigned char code week[]={"Week."};
 121          
 122          
 123          void main(void)
 124          { 
 125   1        Delay400Ms(); //启动等待,等LCM讲入工作状态
 126   1        LCMInit(); //LCM初始化
 127   1        Delay5Ms(); //延时片刻(可不要)
 128   1        mychar();
 129   1        TMOD=0x01;
 130   1        TH0=(65535-50000)/256;
 131   1        TL0=(65535-50000)%256;
 132   1        EA=1;
 133   1        TR0=1;
 134   1        ET0=1;  
 135   1        W1302(0x90,0xa5);//打开充电二级管  一个二级管串联一个2K电阻 
 136   1        W1302(0x8e,0x80);//写保护,禁止写操作 
 137   1        adjust_res(0x1f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125
 138   1        while(1)
 139   1          {              
 140   2               if (P0_3==0)
 141   2            {dipsmodid++;
 142   3                 lmcinit_or_not=1;
 143   3             if(dipsmodid>2) dipsmodid=0;
 144   3             while(P0_3==0);
 145   3            }
 146   2           switch(dipsmodid)
 147   2            {
 148   3             case 0:
 149   3              Disp_mod0();
 150   3              break;
 151   3             case 1:
 152   3              Disp_mod1();
 153   3              break;
 154   3                }
 155   2          }
 156   1      }
 157          /*//选择显示模?
 158          void Dispmod_id_case_key()
 159          {
 160           if (P0_3==0)
 161            {dipsmodid++;
 162             if(dipsmodid>1) dipsmodid=0;
 163            }
 164          }*/
 165          //显示模式0
 166          void Disp_mod0(void)
 167          {
 168   1       if(lmcinit_or_not==1)
 169   1        {LCMInit();
 170   2         lmcinit_or_not=0;
 171   2        }
 172   1       if ((P0_4|P0_5)==0) //初始化
 173   1        {
 174   2         Delay5Ms();
 175   2         if ((P0_4|P0_5)==0) Set1302(inittime);
 176   2        }
 177   1       //mychar(); //显示自定义字符
 178   1       if (P0_6==0) // 设置和选择项目键
 179   1            {
C51 COMPILER V7.06   CLOCK                                                                 07/14/2008 21:00:26 PAGE 4   

 180   2             Delay5Ms();
 181   2             if(P0_6==0){id++;if(id>7) id=0;}
 182   2             while(P0_6==0);    
 183   2            }
 184   1           switch(id)
 185   1            {
 186   2             case 0:
 187   2               sec=0;
 188   2               Disp_line1(); Disp_line2();
 189   2               break;
 190   2             case 1://年
 191   2               year=1;
 192   2               Disp_line1(); Disp_line2();                  
 193   2               id_case1_key();
 194   2               break;
 195   2             case 2://月
 196   2               year=0;mon=1;
 197   2               Disp_line1(); Disp_line2();                 
 198   2               id_case1_key();
 199   2               break;
 200   2             case 3://日
 201   2               mon=0;day=1;
 202   2               Disp_line1(); Disp_line2();
 203   2               id_case1_key();
 204   2               break;             
 205   2             case 4://星期
 206   2               day=0;weekk=1;
 207   2               Disp_line1(); Disp_line2();         
 208   2               id_case1_key();
 209   2               break;
 210   2             case 5://小时
 211   2               weekk=0;hour=1;
 212   2               Disp_line1(); Disp_line2(); 
 213   2               id_case1_key();      
 214   2               break;       
 215   2             case 6://分钟
 216   2               hour=0;min=1;
 217   2               Disp_line1(); Disp_line2(); 
 218   2               id_case1_key();
 219   2               break;
 220   2             case 7://秒
 221   2               min=0;sec=1;
 222   2               Disp_line1(); Disp_line2();             
 223   2               id_case1_key();
 224   2               break;              
 225   2            }
 226   1      }
 227          //显示模式1
 228          void Disp_mod1(void)
 229          {
 230   1       if(lmcinit_or_not==1)
 231   1        {LCMInit();
 232   2         lmcinit_or_not=0;
 233   2        }
 234   1       Read_Temperature(1,0);
 235   1       DisplayOneChar(0,1,'T');
 236   1       DisplayOneChar(1,1,'L');
 237   1       DisplayOneChar(2,1,':');
 238   1       DisplayOneChar(7,1,'T');
 239   1       DisplayOneChar(8,1,'H');
 240   1       DisplayOneChar(9,1,':');
 241   1       if(P0_6==0)
C51 COMPILER V7.06   CLOCK                                                                 07/14/2008 21:00:26 PAGE 5   

 242   1        { 
 243   2          if(P0_6==0)
 244   2           {
 245   3            tempid++;
 246   3            if(tempid>2) tempid=0;
 247   3            while(P0_6==0);
 248   3           }
 249   2        }
 250   1       switch(tempid)
 251   1        {
 252   2         case 0:
 253   2          tl_flash_flag=0;
 254   2          th_flash_flag=0;
 255   2          Disp_Temp();
 256   2         break;
 257   2         case 1:
 258   2          tl_flash_flag=1;
 259   2          th_flash_flag=0;
 260   2          Disp_Temp();
 261   2              Set_TL_Temp(); 
 262   2         break;
 263   2         case 2:
 264   2          tl_flash_flag=0;
 265   2          th_flash_flag=1;
 266   2          Disp_Temp();
 267   2          Set_TH_Temp();
 268   2         break;
 269   2        }
 270   1       Compare_Temp(tl,th);
 271   1       Tl_Al();
 272   1       Th_Al();
 273   1      }
 274          
 275          //显示上下限温度
 276          void Disp_Temp(void)
 277          {
 278   1       
 279   1       unsigned char tl_gw,tl_sw,tl_bw;               //下限温度的个位,十位,百位
 280   1       unsigned char th_gw,th_sw,th_bw;               //上限温度的个位,十位,百位
 281   1      
 282   1       tl_sign=tl>>7;
 283   1       if(tl_sign)
 284   1        {
 285   2         tl_bw=(~(tl-1))/100;         //计算百位
 286   2         tl_sw=((~(tl-1))-tl_bw*100)/10;              //计算十位
 287   2         tl_gw=(~(tl-1))-tl_bw*100-tl_sw*10;          //计算个位
 288   2        }
 289   1       else
 290   1        {
 291   2         tl_bw=(tl)/100;          
 292   2         tl_sw=(tl-tl_bw*100)/10;
 293   2         tl_gw=tl-tl_bw*100-tl_sw*10;
 294   2        }
 295   1      
 296   1       if(tl_flash_flag==1)
 297   1        {
 298   2         if(flag==1)
 299   2          {if(tl_sign)
 300   3                {
 301   4                 DisplayOneChar(3,1,0x2d);
 302   4             DisplayOneChar(4,1,tl_sw+0x30); 
 303   4             DisplayOneChar(5,1,tl_gw+0x30);
C51 COMPILER V7.06   CLOCK                                                                 07/14/2008 21:00:26 PAGE 6   

 304   4                }
 305   3               else
 306   3                {
 307   4                 DisplayOneChar(3,1,tl_bw+0x30);
 308   4             DisplayOneChar(4,1,tl_sw+0x30); //显示下限温度
 309   4             DisplayOneChar(5,1,tl_gw+0x30);
 310   4            } 
 311   3          }
 312   2         else
 313   2          {DisplayOneChar(3,1,0x20);
 314   3           DisplayOneChar(4,1,0x20); //显示下限温度
 315   3           DisplayOneChar(5,1,0x20);    
 316   3          }
 317   2        }
 318   1       else
 319   1        {
 320   2         DisplayOneChar(3,1,tl_bw+0x30);
 321   2         DisplayOneChar(4,1,tl_sw+0x30); //显示下限温度
 322   2         DisplayOneChar(5,1,tl_gw+0x30);
 323   2        }
 324   1      
 325   1        
 326   1        th_sign=th>>7;
 327   1        if(th_sign)
 328   1         {
 329   2          th_bw=(~(th-1))/100;                //计算百位
 330   2          th_sw=((~(th-1))-th_bw*100)/10;             //计算十位
 331   2          th_gw=(~(th-1))-th_bw*100-th_sw*10;         //计算个位
 332   2         }
 333   1        else
 334   1         {
 335   2          th_bw=(th)/100;          
 336   2          th_sw=(th-th_bw*100)/10;
 337   2          th_gw=th-th_bw*100-th_sw*10;
 338   2         }
 339   1      
 340   1      
 341   1       if(th_flash_flag==1)
 342   1        {
 343   2         if(flag==1)
 344   2          {if(th_sign)
 345   3                {
 346   4             DisplayOneChar(10,1,0x2d);
 347   4             DisplayOneChar(11,1,th_sw+0x30); //显示下限温度
 348   4             DisplayOneChar(12,1,th_gw+0x30);  
 349   4                }
 350   3               else
 351   3                {
 352   4             DisplayOneChar(10,1,th_bw+0x30);
 353   4             DisplayOneChar(11,1,th_sw+0x30); //显示下限温度
 354   4             DisplayOneChar(12,1,th_gw+0x30);  

⌨️ 快捷键说明

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