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

📄 text.lst

📁 基与mpx4115压力测量仪
💻 LST
字号:
C51 COMPILER V7.08   TEXT                                                                  04/28/2007 09:34:37 PAGE 1   


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

line level    source

   1          /********************************************************
   2                             压力测试仪
   3          系统描述;输入  15--115kPA压力信号
   4                   输出  00h--ffh数字信号(adc0809)
   5                   在LED上显示实际的压力值,如果超限则报警
   6          
   7          线性区间标度变换公式:    y=(115-15)/(243-13)*X+15kpa   
   8          
   9          作者:yiwei /一维        QQ:284997953
  10          单位:eeec-shaanxi university of techmology
  11          日期:2007.4.28
  12          问题描述: 仿真时显示值不随模拟输入压力信号的变换而变换
  13          
  14          注意事项: 在实际电路板上测试时一切均正常,显示值随模
  15                     拟输入压力信号的变换而变换。
  16          
  17          ********************************************************/
  18          
  19          #include<reg51.h>
  20          #include<intrins.h>
  21          #include <absacc.h>
  22          #include <math.h>
  23          
  24          #define uchar unsigned char
  25          #define uint   unsigned int
  26          #define BUSY  0x80                               //常量定义
  27          #define DATAPORT P0
  28          #define ADC_adress XBYTE[0X7FF8]                 //AD的地址
  29          
  30          
  31          sbit LCM_RS=P2^0;
  32          sbit LCM_RW=P2^1;
  33          sbit LCM_EN=P2^2;
  34          sbit ad_busy=P3^2;
  35          uchar ad_data;                                    //采样值存储
  36          sbit Alarm_led_red =P1^5;                         //超过压力表量程最大值红色led报警定义
  37          sbit Alarm_led_green=P1^6;                        //低于压力表量程最小值绿色led报警定义
  38          unsigned char ad_data;                            //adc采样值存储单元
  39          char press_data;                                  //标度变换存储单元
  40          unsigned char ad_alarm;                           //报警值存储单元
  41          unsigned char press_bai=0;                        //显示值百位
  42          unsigned char press_shi=0;                        //显示值十位
  43          unsigned char press_ge=0;                         //显示值个位
  44          unsigned char press_dot=0;                        //显示值十分位
  45          
  46          uchar code str0[]={" press:   . kpa "};
  47          uchar code str1[]={" yi wei dian zi "};
  48          
  49          void delay(uint);
  50          void lcd_wait(void);
  51          void delay_LCM(uint);                                                                                                   //LCD延时子程序
  52          void initLCM( void);                                                                                                    //LCD初始化子程序
  53          void lcd_wait(void);                                                                                                    //LCD检测忙子程序
  54          void WriteCommandLCM(uchar WCLCM,uchar BusyC);                              //写指令到ICM子函数
  55          void WriteDataLCM(uchar WDLCM);                                             //写数据到LCM子函数
C51 COMPILER V7.08   TEXT                                                                  04/28/2007 09:34:37 PAGE 2   

  56          void DisplayOneChar(uchar X,uchar Y,uchar DData);                           //显示指定坐标的一个字符子函数
  57          void DisplayListChar(uchar X,uchar Y,uchar code *DData);                    //显示指定坐标的一串字符子函数
  58          void display(void);                                                         //系统显示子函数
  59          void adc0809(void);                                                                                                                     
  60          void alarm(void);
  61          void data_pro(void);
  62          
  63          
  64          /**********main funcation************/
  65          
  66          void main(void)
  67          { 
  68   1          delay(500);                      //系统延时500ms启动
  69   1              ad_data=0;                       //采样值存储单元初始化为0
  70   1              initLCM( );
  71   1              
  72   1              WriteCommandLCM(0x01,1);                    //清显示屏
  73   1          DisplayListChar(0,0,str0);
  74   1              DisplayListChar(0,1,str1);
  75   1       
  76   1              while(1)
  77   1          {
  78   2               
  79   2                  adc0809();
  80   2                      data_pro();
  81   2                      alarm();
  82   2                      display();
  83   2                                       
  84   2              }
  85   1      }
  86          
  87          
  88          /*********延时K*1ms,12.000mhz**********/
  89          
  90          void delay(uint k)
  91          {
  92   1          uint i,j;
  93   1          for(i=0;i<k;i++)
  94   1          {
  95   2              for(j=0;j<60;j++)
  96   2                      {;}
  97   2          }
  98   1      }   
  99          /**********写指令到ICM子函数************/
 100          
 101          void WriteCommandLCM(uchar WCLCM,uchar BusyC)
 102          {
 103   1          if(BusyC)lcd_wait();
 104   1              DATAPORT=WCLCM;
 105   1          LCM_RS=0;                   // 选中指令寄存器
 106   1          LCM_RW=0;                   // 写模式       
 107   1          LCM_EN=1;    
 108   1              _nop_();   
 109   1              _nop_();
 110   1              _nop_(); 
 111   1          LCM_EN=0;
 112   1         
 113   1      }
 114          
 115          /**********写数据到LCM子函数************/
 116          
 117          void WriteDataLCM(uchar WDLCM)
C51 COMPILER V7.08   TEXT                                                                  04/28/2007 09:34:37 PAGE 3   

 118          { 
 119   1          lcd_wait( );             //检测忙信号    
 120   1              DATAPORT=WDLCM;
 121   1          LCM_RS=1;                // 选中数据寄存器
 122   1          LCM_RW=0;                    // 写模式
 123   1          LCM_EN=1;
 124   1          _nop_();
 125   1              _nop_();
 126   1              _nop_();
 127   1          LCM_EN=0;
 128   1      }
 129          
 130          /***********lcm内部等待函数*************/
 131          
 132          void lcd_wait(void)
 133          {
 134   1          DATAPORT=0xff;           //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
 135   1              LCM_EN=1;
 136   1          LCM_RS=0;   
 137   1          LCM_RW=1;   
 138   1          _nop_();
 139   1          _nop_();
 140   1              _nop_();
 141   1          while(DATAPORT&BUSY)  
 142   1              {  LCM_EN=0;
 143   2                 _nop_();
 144   2                 _nop_();
 145   2                 LCM_EN=1;
 146   2                 _nop_();
 147   2                 _nop_();
 148   2                 }     
 149   1              LCM_EN=0;       
 150   1              
 151   1      }
 152          
 153          /**********LCM初始化子函数***********/
 154          
 155          void initLCM( )
 156          {   
 157   1              DATAPORT=0;     
 158   1              delay(15);
 159   1              WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号
 160   1          delay(5); 
 161   1          WriteCommandLCM(0x38,0);
 162   1          delay(5); 
 163   1          WriteCommandLCM(0x38,0);
 164   1          delay(5); 
 165   1      
 166   1          WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
 167   1          WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号
 168   1          WriteCommandLCM(0x01,1);    //清屏,检测忙信号
 169   1          WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号
 170   1          WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
 171   1      }
 172          
 173          /****显示指定坐标的一个字符子函数****/
 174          
 175          void DisplayOneChar(uchar X,uchar Y,uchar DData)
 176          
 177          {
 178   1          Y&=1;
 179   1          X&=15;
C51 COMPILER V7.08   TEXT                                                                  04/28/2007 09:34:37 PAGE 4   

 180   1          if(Y)X|=0x40;               //若y为1(显示第二行),地址码+0X40
 181   1          X|=0x80;                    //指令码为地址码+0X80
 182   1          WriteCommandLCM(X,0);
 183   1          WriteDataLCM(DData);
 184   1      }
 185          
 186          /*******显示指定坐标的一串字符子函数*****/
 187           
 188          void DisplayListChar(uchar X,uchar Y,uchar code *DData)
 189          {
 190   1          uchar ListLength=0;
 191   1          Y&=0x01;
 192   1          X&=0x0f;
 193   1          while(X<16)
 194   1          {
 195   2              DisplayOneChar(X,Y,DData[ListLength]);
 196   2              ListLength++;
 197   2              X++;
 198   2          }
 199   1      }
 200          
 201           /*****************系统显示子函数*****************/
 202          
 203          void display(void)
 204          {
 205   1              WriteCommandLCM(0x0c,1);                                //显示屏打开,光标不显示,不闪烁,检测忙信号    
 206   1              DisplayListChar(0,0,str0);      
 207   1              DisplayListChar(0,1,str1);      
 208   1      
 209   1      
 210   1              DisplayOneChar(7,0,press_bai+0x30);
 211   1              DisplayOneChar(8,0,press_shi+0x30);
 212   1              DisplayOneChar(9,0,press_ge +0x30);
 213   1          DisplayOneChar(11,0,press_dot+0x30);
 214   1              delay(1000);                               //稳定显示
 215   1      }
 216          
 217          /******************adc0809采样子函数******************/
 218          
 219          void adc0809(void) 
 220          {
 221   1              ADC_adress=0;                                                    //启动adc转换
 222   1              delay(1);                                                                        //延时5ms
 223   1          ad_data=ADC_adress;                          //将采集数据送到 ad_data变量中
 224   1          
 225   1      }
 226          
 227          /***********************数据处理子函数************************/
 228          
 229          void data_pro(void)
 230          {
 231   1            unsigned int temp;
 232   1            float  press;                       
 233   1      
 234   1                if(14<ad_data<243)                                   //当压力值介于15kpa到115kpa之间时,遵循线性变换
 235   1                      {                           
 236   2                          int vary=ad_data;                                           //y=(115-15)/(243-13)*X+15kpa                   
 237   2                              press=((10.0/23.0)*vary)+10;                    //测试时补偿值为10
 238   2                                                                                                                        
 239   2                              temp=(int)(press*10);                   //放大10倍,便于后面的计算
 240   2                                                                                              
 241   2                                                                                                              
C51 COMPILER V7.08   TEXT                                                                  04/28/2007 09:34:37 PAGE 5   

 242   2                              press_bai=temp/1000;                            //取压力值百位
 243   2                              press_shi=(temp%1000)/100;                      //取压力值十位
 244   2                              press_ge=((temp%1000)%100)/10;          //取压力值个位
 245   2                              press_dot=((temp%1000)%100)%10;                 //取压力值十分位
 246   2      
 247   2                         }
 248   1      
 249   1                  
 250   1                               
 251   1      }
 252          /*****************报警子函数*******************/
 253          
 254          void alarm(void)
 255          {
 256   1               if(ad_data>=244)                           //如果当前压力值大于115kpa,
 257   1      
 258   1                {  Alarm_led_red=0; }                 //则启动red led报警
 259   1              
 260   1                else
 261   1                   {    Alarm_led_red=1; }                    //关闭red led 报警
 262   1                         
 263   1              
 264   1                if(ad_data<=13)                                                       //如果当前压力值小于15kpa
 265   1      
 266   1                   {  Alarm_led_green=0;  }               //则启动green led报警
 267   1      
 268   1            else
 269   1                   {   Alarm_led_green=1; }                           //关闭green  led 报警
 270   1               
 271   1      }
 272          
 273          
 274          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    629    ----
   CONSTANT SIZE    =     34    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7      14
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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