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

📄 main.lst

📁 温度湿度一体化传感器的C51测试程序,容易移植到其他嵌入式处理器上
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   MAIN                                                                  06/02/2007 10:41:58 PAGE 1   


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

line level    source

   1          /***********************************************************************************
   2          Project:          SHTxx demo program (V2.1)
   3          Filename:         SHTxx_Sample_Code.c    
   4          
   5          Prozessor:        80C51 family
   6          Compiler:         Keil Version 6.14
   7          
   8          Autor:            MST
   9          Copyrigth:        (c) Sensirion AG      
  10          ***********************************************************************************/
  11          
  12          #include <REGX51.H>
  13          //#include <AT89s52.h> //Microcontroller specific library, e.g. port definitions
  14          #include <intrins.h> //Keil library (is used for _nop()_ operation)  
  15          #include <math.h>    //Keil library  
  16          #include <stdio.h>   //Keil library
  17          
  18          typedef union 
  19          { unsigned int i;
  20            float f;
  21          } value;
  22          
  23          //----------------------------------------------------------------------------------
  24          // modul-var
  25          //----------------------------------------------------------------------------------
  26          enum {TEMP,HUMI};
  27          
  28          #define DATA    P1_1
  29          #define SCK     P1_0
  30          
  31          #define noACK 0
  32          #define ACK   1
  33                                      //adr  command  r/w
  34          #define STATUS_REG_W 0x06   //000   0011    0
  35          #define STATUS_REG_R 0x07   //000   0011    1
  36          #define MEASURE_TEMP 0x03   //000   0001    1
  37          #define MEASURE_HUMI 0x05   //000   0010    1
  38          #define RESET        0x1e   //000   1111    0
  39          
  40            ///////////////////////////////////////////////////////////////
  41           
  42          
  43          
  44          unsigned char data dis_digit;
  45          unsigned char key_s, key_v;
  46          
  47          unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,   // 0, 1, 2, 3
  48                                          0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off 
  49          unsigned char dis_buf[8];               // 显示缓冲区
  50          unsigned char sec_bcd[8];               // 秒计数值, BCD码
  51          unsigned char dis_index;                // 
  52          unsigned char key_times;                // K1 按下次数                          //
  53          
  54          void clr_time();        
  55          void update_disbuf();
C51 COMPILER V8.02   MAIN                                                                  06/02/2007 10:41:58 PAGE 2   

  56          bit     scan_key();
  57          void proc_key();
  58          void delayms(unsigned char ms);
  59          
  60          sbit    K1 = P1^4;
  61           ///////////////////////////////////////////////////////////////
  62          
  63          
  64          /*                                                                             *
  65          *                 数码管显示秒表, 分辨率0.01s                                     *
  66          *                 K1=P1.4---控制按钮                                           *
  67          *                       第一次按下时, 启动开始计时                             *
  68          *                       第二次按下时, 停止                                     *
  69          *                       第三次按下时, 归零                                     *
  70          *                                                                              *
  71          *    秒单位,寄存器与数码管对应关系:                                            *
  72          *                                                                              *
  73          * --- 秒单位 ---------- 数码管端口 ---- 缓冲区 --------- 计时BCD码值寄存器     *
  74          *     十万位               P20        dis_buf[7]          sec_bcd[7]           *
  75          *     万位                 P21        dis_buf[6]          sec_bcd[6]           *
  76          *     千位                 P22        dis_buf[5]          sec_bcd[5]           *
  77          *     百位                 P23        dis_buf[4]          sec_bcd[4]           *
  78          *     十位                 P24        dis_buf[3]          sec_bcd[3]           *
  79          *     个位(1.s)            P25        dis_buf[2]          sec_bcd[2]           *
  80          *     十分位(0.1s)         P26        dis_buf[1]          sec_bcd[1]           *
  81          *     百分位(0.01s)        P27        dis_buf[0]          sec_bcd[0]           *
  82          *                                                                              *
  83          ********************************************************************************
  84          */
  85          
  86          
  87          
  88          
  89          void smg(void)
  90          {
  91   1              P0 = 0xff;
  92   1              P2 = 0xff;
  93   1              TMOD = 0x11;                // 定时器0, 1工作模式1, 16位定时方式
  94   1              TH1 = 0xdc;
  95   1              TL1 = 0;
  96   1      
  97   1              TH0 = 0xFC;
  98   1              TL0 = 0x17;
  99   1              
 100   1              clr_time();                     // 
 101   1                                                 
 102   1              dis_digit = 0x7f;               // 初始显示P20口数码管
 103   1              dis_index = 0;                  // 
 104   1              
 105   1              key_times = 0;
 106   1              key_v = 0x01;
 107   1              
 108   1              IE = 0x8a;                              // 使能timer0, timer1中断
 109   1              
 110   1              TR0 = 1;
 111   1              TR1 = 0;
 112   1              while(1)
 113   1              {
 114   2                      if(scan_key())
 115   2                      {
 116   3                              delayms(10);
 117   3                              if(scan_key())
C51 COMPILER V8.02   MAIN                                                                  06/02/2007 10:41:58 PAGE 3   

 118   3                              {
 119   4                                      key_v = key_s;
 120   4                                      proc_key();
 121   4                              }
 122   3                      }
 123   2                      
 124   2              }
 125   1      }
 126          
 127          void clr_time()
 128          {
 129   1              sec_bcd[0] = 0x0;
 130   1              sec_bcd[1] = 0x0;
 131   1              sec_bcd[2] = 0x0;
 132   1              sec_bcd[3] = 0x0;
 133   1              sec_bcd[4] = 0x0;
 134   1              sec_bcd[5] = 0x0;
 135   1              sec_bcd[6] = 0x0;
 136   1              sec_bcd[7] = 0x0;   
 137   1              
 138   1              update_disbuf();
 139   1              
 140   1      }
 141          
 142          bit scan_key()
 143          {
 144   1              key_s = 0x00;
 145   1              key_s |= K1;
 146   1              return(key_s ^ key_v);  
 147   1      }
 148          
 149          void proc_key()
 150          {
 151   1              if((key_v & 0x01) == 0)
 152   1              {
 153   2                      key_times++;
 154   2                      if(key_times == 1)
 155   2                      {
 156   3                              TR1 = 1;
 157   3                      }
 158   2                      else if(key_times == 2)
 159   2                      {       
 160   3                              TR1 = 0;
 161   3                      }
 162   2                      else
 163   2                      {
 164   3                              clr_time();
 165   3                              key_times = 0;
 166   3                      }
 167   2                      
 168   2              }
 169   1      }
 170          
 171          void timer0() interrupt 1
 172          // 定时器0中断服务程序, 用于数码管的动态扫描
 173          // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
 174          // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
 175          //                              选通P2.0口数码管
 176          // dis_buf   --- 显于缓冲区基地址       
 177          {
 178   1              TH0 = 0xFC;
 179   1              TL0 = 0x17;
C51 COMPILER V8.02   MAIN                                                                  06/02/2007 10:41:58 PAGE 4   

 180   1              
 181   1              P2 = 0xff;                                                      // 先关闭所有数码管
 182   1              P0 = dis_buf[dis_index];                        // 显示代码传送到P0口
 183   1              P2 = dis_digit;                                         // 
 184   1      
 185   1              dis_digit = _cror_(dis_digit,1);        // 位选通值右移(P20<-P27), 下次中断时选通下一位数码管
 186   1              dis_index++;                                            // 
 187   1                                              
 188   1              dis_index &= 0x07;                      // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
 189   1      }
 190          
 191          void timer1() interrupt 3
 192          //
 193          {       
 194   1              unsigned char i;
 195   1              TH1 |= 0xdc;
 196   1              for(i = 0; i < 8; i++)
 197   1              {
 198   2                      sec_bcd[i]++;                   // 低位加1
 199   2                      if(sec_bcd[i] < 10)             // 如果低位满10则向高位进1
 200   2                              break;                  // 低位未满10
 201   2                      sec_bcd[i] = 0;                 // 低位满10清0
 202   2              }
 203   1              update_disbuf();                        // 更新显示缓冲区
 204   1      }
 205          
 206          void update_disbuf()
 207          // 更新显示缓冲区
 208          {
 209   1              dis_buf[0] = dis_code[sec_bcd[0]];
 210   1              dis_buf[1] = dis_code[sec_bcd[1]];
 211   1              dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f;       // 加上小数点
 212   1              dis_buf[3] = dis_code[sec_bcd[3]];
 213   1              dis_buf[4] = dis_code[sec_bcd[4]];
 214   1              dis_buf[5] = dis_code[sec_bcd[5]];
 215   1              dis_buf[6] = dis_code[sec_bcd[6]];
 216   1              dis_buf[7] = dis_code[sec_bcd[7]];
 217   1      }
 218          
 219          void delayms(unsigned char ms)  
 220          // 延时子程序
 221          {                                               
 222   1              unsigned char i;
 223   1              while(ms--)
 224   1              {
 225   2                      for(i = 0; i < 120; i++);
 226   2              }
 227   1      }
 228          
 229          
 230          
 231          
 232           //////////////////////////////////////////////////////////////
 233          
 234           //////////////////////////////////////////////////////////////
 235          
 236          

⌨️ 快捷键说明

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