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

📄 clock.lst

📁 具有温度控制功能的电子时钟
💻 LST
字号:
C51 COMPILER V6.12  CLOCK                                                                  06/07/2005 21:06:59 PAGE 1   


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

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

 118          unsigned char ReadStatusLCM(void);
 119          void LCMInit(void);
 120          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
 121          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
 122          void Delay5Ms(void);
 123          void Delay400Ms(void);
 124          unsigned char code week[]={"Week."};
 125          
 126          
 127          void main(void)
 128          { 
 129   1        Delay400Ms(); //启动等待,等LCM讲入工作状态
 130   1        LCMInit(); //LCM初始化
 131   1        Delay5Ms(); //延时片刻(可不要)
 132   1        mychar();
 133   1        TMOD=0x01;
 134   1        TH0=(65535-50000)/256;
 135   1        TL0=(65535-50000)%256;
 136   1        EA=1;
 137   1        TR0=1;
 138   1        ET0=1;  
 139   1        W1302(0x90,0xa5);//打开充电二级管  一个二级管串联一个2K电阻 
 140   1        W1302(0x8e,0x80);//写保护,禁止写操作 
 141   1        adjust_res(0x1f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125
 142   1        while(1)
 143   1          {              
 144   2      	 if (P0_3==0)
 145   2            {dipsmodid++;
 146   3      	   lmcinit_or_not=1;
 147   3             if(dipsmodid>2) dipsmodid=0;
 148   3             while(P0_3==0);
 149   3            }
 150   2           switch(dipsmodid)
 151   2            {
 152   3             case 0:
 153   3              Disp_mod0();
 154   3              break;
 155   3             case 1:
 156   3              Disp_mod1();
 157   3              break;
 158   3        	  }
 159   2          }
 160   1      }
 161          /*//选择显示模

⌨️ 快捷键说明

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