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

📄 text1.lst

📁 个人单片机入门程序集合 。很适合刚学单片机的人。用的是keil proteus
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   TEXT1                                                                 08/11/2007 15:23:53 PAGE 1   


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

line level    source

   1          #include<reg51.h>
   2          #include<intrins.h>
   3          #define uint unsigned int
   4          #define uchar unsigned char
   5          //数据口定义
   6          #define lcd1602_bus P0   
   7          
   8          //引脚定义
   9          sbit rs_1602=P2^5;           
  10          sbit rw_1602=P2^6;
  11          sbit e_1602=P2^7;
  12          sbit alarm=P0^0;
  13          
  14          uchar tplsb,tpmsb;
  15          uint temp,tempx;
  16          sbit DQ=P2^0;
  17          
  18          
  19          
  20          uchar state;
  21          uchar bdata adc_549; 
  22          sbit  adc_549low=adc_549^0; 
  23          uchar s; 
  24          uchar mea,m[2];
  25          uint in[2];
  26          
  27          
  28          
  29          /*********延时子程序**********/
  30          void delay(uchar t)
  31          {
  32   1              uchar i;
  33   1              while(t--)
  34   1              {
  35   2                      /* 对于11.0592M时钟,约延时1ms */
  36   2                      for (i=0;i<125;i++)
  37   2                      {}
  38   2              }
  39   1      } 
  40          
  41          
  42          /*****************启动总线**********************/
  43          
  44          
  45          /*****************停止IIC总线****************/
  46          
  47          
  48          /**************检查应答位*******************/
  49          
  50          
  51          /*****************不对IIC总线产生应答***************/
  52          
  53          /*******************向IIC总线写数据*********************/
  54          
  55          
C51 COMPILER V7.20   TEXT1                                                                 08/11/2007 15:23:53 PAGE 2   

  56          
  57          
  58          /***********忙判断标志,返回一个位BF********************/
  59          bit lcd1602_busy(void)
  60          {
  61   1              uchar busy_flag;
  62   1              rs_1602=0;
  63   1              rw_1602=1;
  64   1              _nop_();
  65   1              e_1602=1;
  66   1              _nop_();
  67   1              lcd1602_bus=0xff;
  68   1              busy_flag=lcd1602_bus;   //e在高电平时读 
  69   1              e_1602=0;
  70   1              return (bit)(busy_flag&0x80);    //BF=1; BUSY  返回一个位
  71   1      }
  72          
  73          
  74          /********写命令,有两个参数,一个是要写的命令控制字,
  75          第二个是用来控制是否进行忙标志的判断。
  76          busyflag=1;
  77          判断: 为0 
  78          ***************/
  79          void lcd1602_wrcmd(unsigned char lcdcmd)
  80          {
  81   1              while(lcd1602_busy());     //等待空闲
  82   1              lcd1602_bus=lcdcmd;
  83   1              rs_1602=0;
  84   1              rw_1602=0;
  85   1              _nop_();
  86   1              e_1602=1;
  87   1              _nop_();
  88   1              _nop_();
  89   1              e_1602=0;      //产生一个下沿     
  90   1      }
  91          
  92          
  93          
  94          /***************向液晶写数据******************/
  95          void lcd1602_wrdata(uchar lcddata)
  96          {
  97   1       while(lcd1602_busy());       //等待空闲
  98   1       lcd1602_bus=lcddata;             //在下沿的时候写数据
  99   1       rs_1602=1;
 100   1       rw_1602=0;
 101   1       _nop_();
 102   1       e_1602=1;
 103   1       _nop_();
 104   1       _nop_();
 105   1       e_1602=0;
 106   1       //lcd_bus=0xff;
 107   1      }
 108          
 109          
 110          /************液晶的清屏************/
 111          void lcd1602_clear(void)
 112          {
 113   1        lcd1602_wrcmd(0x01);     //液晶清屏控制字     并延时>40us
 114   1        delay(1);
 115   1      }
 116          
 117          /***********1602液晶的初始化***************/
C51 COMPILER V7.20   TEXT1                                                                 08/11/2007 15:23:53 PAGE 3   

 118          void lcd1602_init(void)
 119          {
 120   1        lcd1602_wrcmd(0x38);          //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
 121   1        delay(1);
 122   1        lcd1602_wrcmd(0x0e);         //显示开关控制----显示开关开,光标开关关,闪烁开关关
 123   1        delay(1);
 124   1        lcd1602_wrcmd(0x06);         //输入方式设置,AC自增1, S=0;
 125   1        delay(1);                
 126   1        lcd1602_wrcmd(0x01);         //清屏
 127   1        delay(1);
 128   1      }
 129          
 130          
 131          /**********4*4矩阵键盘****************/
 132          /************
 133           矩阵键盘
 134          D---------P1.0
 135          C---------P1.1
 136          B---------P1.2
 137          A---------P1.3
 138          1---------P1.4
 139          2---------P1.5
 140          3---------P1.6
 141          4---------P1.7
 142          按键值的分布
 143             D   C  B  A
 144          1〔15 14 13 12〕
 145          2〔11 10  9  8〕
 146          3〔 7  6  5  4〕
 147          4〔 3  2  1  0〕
 148          利用已有的那个按键程序  
 149          *************/
 150          
 151          void TxReset(void)
 152          {
 153   1              uint i;
 154   1              DQ = 0;
 155   1      
 156   1              /* 拉低约900us */
 157   1              i = 100;
 158   1              while (i>0)     i--;    
 159   1              
 160   1              DQ = 1;                         // 产生上升沿
 161   1              i = 4;
 162   1              while (i>0)     i--;
 163   1      }
 164          
 165          /* 等待应答脉冲 */
 166          void RxWait(void)
 167          {
 168   1              uint i;
 169   1              while(DQ);
 170   1              while(~DQ);                     // 检测到应答脉冲 
 171   1              i = 4;
 172   1              while (i>0)     i--;
 173   1      }
 174          
 175          /* 读取数据的一位,满足读时隙要求 */ 
 176          bit RdBit(void)
 177          {
 178   1              uint i;
 179   1              bit b;
C51 COMPILER V7.20   TEXT1                                                                 08/11/2007 15:23:53 PAGE 4   

 180   1              DQ = 0;
 181   1              i++;
 182   1              DQ = 1;
 183   1              i++;i++;                        // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
 184   1              b = DQ;
 185   1              i = 8;
 186   1              while(i>0) i--;
 187   1              return (b);
 188   1      }
 189          
 190          /* 读取数据的一个字节 */
 191          uchar RdByte(void)
 192          {
 193   1              uchar i,j,b;
 194   1              b = 0;
 195   1              for (i=1;i<=8;i++)
 196   1              {
 197   2                      j = RdBit();
 198   2                      b = (j<<7)|(b>>1);
 199   2              }
 200   1              return(b);
 201   1      }
 202          
 203          /* 写数据的一个字节,满足写1和写0的时隙要求 */
 204          void WrByte(uchar b)
 205          {
 206   1              uint i;
 207   1              uchar j;
 208   1              bit btmp;
 209   1              for(j=1;j<=8;j++)
 210   1              {
 211   2                      btmp = b&0x01;
 212   2                      b = b>>1;               // 取下一位(由低位向高位)
 213   2                      if (btmp)
 214   2                      {
 215   3                              /* 写1 */
 216   3                              DQ = 0;
 217   3                              i++;i++;        // 延时,使得15us以内拉高
 218   3                              DQ = 1;
 219   3                              i = 8;
 220   3                              while(i>0) i--; // 整个写1时隙不低于60us 
 221   3                      }
 222   2                      else
 223   2                      {
 224   3                              /* 写0 */
 225   3                              DQ = 0;                 
 226   3                              i = 8;
 227   3                              while(i>0) i--; // 保持低在60us到120us之间
 228   3                              DQ = 1;
 229   3                              i++;
 230   3                              i++;
 231   3                      }
 232   2              }
 233   1      }
 234          
 235          /* 启动温度转换 */
 236          void convert(void)
 237          {
 238   1              TxReset();                      // 产生复位脉冲,初始化DS18B20
 239   1              RxWait();                       // 等待DS18B20给出应答脉冲
 240   1              delay(1);                       // 延时
 241   1              WrByte(0xcc);           // skip rom 命令
C51 COMPILER V7.20   TEXT1                                                                 08/11/2007 15:23:53 PAGE 5   

 242   1              WrByte(0x44);           // convert T 命令
 243   1      }
 244          
 245          /* 读取温度值 */
 246          void RdTemp(void)
 247          {
 248   1              TxReset();                      // 产生复位脉冲,初始化DS18B20 
 249   1              RxWait();                       // 等待DS18B20给出应答脉冲
 250   1              delay(1);                       // 延时
 251   1              WrByte(0xcc);           // skip rom 命令
 252   1              WrByte(0xbe);           // read scratchpad 命令
 253   1              tplsb = RdByte();       // 温度值低位字节(其中低4位为二进制的“小数”部分)
 254   1              tpmsb = RdByte();       // 高位值高位字节(其中高5位为符号位)          
 255   1      }
 256          
 257          
 258          
 259          void gettemp()
 260          {
 261   1         delay(1);            // 延时1ms
 262   1         convert();           // 启动温度转换,需要750ms
 263   1         delay(100);  // 延时1s
 264   1         RdTemp();
 265   1         temp=(tpmsb&0x07)*16+((tplsb&0xf0)>>4);
 266   1         tempx=tplsb&0x0f;
 267   1      }
 268          
 269          
 270          
 271          
 272          uchar getkey_ii()
 273          
 274          {
 275   1          unsigned char keycode=0xff,temp,i;
 276   1          P1=0x0f;
 277   1          temp=P1&0x0f;
 278   1          if(temp!=0x0f)        //判是否有键按下
 279   1          {
 280   2             // beep=0;
 281   2              P1=0xef;          //自第0行开始扫描输出,自列读入键值
 282   2              for(i=0;i<4;i++)
 283   2              {
 284   3                  temp=P1&0x0f;
 285   3                  if(temp==0x07)     //判断第0列是否有键按下
 286   3                  {    
 287   4                      keycode=i*4+0;
 288   4                      break;
 289   4                  }
 290   3                  else if(temp==0x0b)//判断第1列是否有键按下
 291   3                  {
 292   4                      keycode=i*4+1;
 293   4                      break;                                                                                    
 294   4                  }
 295   3                  else if(temp==0x0d)//判断第2列是否有键按下
 296   3                  {
 297   4                      keycode=i*4+2;
 298   4                      break;
 299   4                  }

⌨️ 快捷键说明

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