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

📄 mpx4115.txt

📁 关于气压传感器MPX4115的过压自动报警系统
💻 TXT
字号:
1.	#include<REG51.H>    
2.	#include<INTRINS.H>    
3.	#include <ABSACC.H>    
4.	#include <MATH.H>    
5.	   
6.	#define uchar unsigned char    
7.	#define uint   unsigned int    
8.	#define BUSY  0x80                               //常量定义    
9.	#define DATAPORT P0    
10.	#define ADC_adress XBYTE[0X7FF8]                 //AD的地址    
11.	   
12.	   
13.	sbit LCM_RS=P2^0;   
14.	sbit LCM_RW=P2^1;   
15.	sbit LCM_EN=P2^2;   
16.	sbit ad_busy=P3^2;   
17.	uchar ad_data;                                    //采样值存储    
18.	sbit Alarm_led_red =P1^5;                         //超过压力表量程最大值红色led报警定义    
19.	sbit Alarm_led_green=P1^6;                        //低于压力表量程最小值绿色led报警定义    
20.	unsigned char ad_data;                            //adc采样值存储单元    
21.	char press_data;                                  //标度变换存储单元    
22.	unsigned char ad_alarm;                           //报警值存储单元    
23.	unsigned char press_bai=0;                        //显示值百位    
24.	unsigned char press_shi=0;                        //显示值十位    
25.	unsigned char press_ge=0;                         //显示值个位    
26.	unsigned char press_dot=0;                        //显示值十分位    
27.	   
28.	uchar code str0[]={" press:   . kpa "};   
29.	uchar code str1[]={" yi wei dian zi "};   
30.	   
31.	void delay(uint);   
32.	void lcd_wait(void);   
33.	void delay_LCM(uint);                                                       //LCD延时子程序    
34.	void initLCM( void);                                                        //LCD初始化子程序    
35.	void lcd_wait(void);                                                        //LCD检测忙子程序    
36.	void WriteCommandLCM(uchar WCLCM,uchar BusyC);                              //写指令到ICM子函数    
37.	void WriteDataLCM(uchar WDLCM);                                             //写数据到LCM子函数    
38.	void DisplayOneChar(uchar X,uchar Y,uchar DData);                           //显示指定坐标的一个字符子函数    
39.	void DisplayListChar(uchar X,uchar Y,uchar code *DData);                    //显示指定坐标的一串字符子函数    
40.	void display(void);                                                         //系统显示子函数    
41.	void adc0809(void);                                                            
42.	void alarm(void);   
43.	void data_pro(void);   
44.	   
45.	   
46.	/**********main funcation************/   
47.	   
48.	void main(void)   
49.	{    
50.	    delay(500);                      //系统延时500ms启动    
51.	    ad_data=0;                       //采样值存储单元初始化为0    
52.	    initLCM( );   
53.	           
54.	    WriteCommandLCM(0x01,1);            //清显示屏    
55.	    DisplayListChar(0,0,str0);   
56.	    DisplayListChar(0,1,str1);   
57.	    
58.	    while(1)   
59.	    {   
60.	        
61.	        adc0809();   
62.	        data_pro();   
63.	        alarm();   
64.	        display();   
65.	                    
66.	    }   
67.	}   
68.	   
69.	   
70.	/*********延时K*1ms,12.000mhz**********/   
71.	   
72.	void delay(uint k)   
73.	{   
74.	    uint i,j;   
75.	    for(i=0;i<K;I++) if(ad_data { alarm(void) void *****************报警子函数******************* } 取压力值十分位 press_dot="((temp%1000)%100)%10;" 取压力值个位 press_ge="((temp%1000)%100)/10;" 取压力值十位 press_shi="(temp%1000)/100;" 取压力值百位 press_bai="temp/1000;" 放大10倍,便于后面的计算 temp="(int)(press*10);" 测试时补偿值为10 press="((10.0/23.0)*vary)+10;" y="(115-15)/(243-13)*X+15kpa" vary="ad_data;" int 当压力值介于15kpa到115kpa之间时,遵循线性变换 if(14<ad_data<243) press; float temp; unsigned data_pro(void) ***********************数据处理子函数************************ ad_data变量中 将采集数据送到 ad_data="ADC_adress;" 延时5ms delay(1); 启动adc转换 ADC_adress="0;" adc0809(void) ******************adc0809采样子函数****************** 稳定显示 delay(1000); DisplayOneChar(11,0,press_dot+0x30); +0x30); DisplayOneChar(9,0,press_ge DisplayOneChar(8,0,press_shi+0x30); DisplayOneChar(7,0,press_bai+0x30); DisplayListChar(0,1,str1); DisplayListChar(0,0,str0); 显示屏打开,光标不显示,不闪烁,检测忙信号 WriteCommandLCM(0x0c,1); display(void) *****************系统显示子函数***************** X++; ListLength++; DisplayOneChar(X,Y,DData[ListLength]); while(X<16) X&="15;" Y&="1;" ListLength="0;" uchar *DData) code Y,uchar X,uchar DisplayListChar(uchar *******显示指定坐标的一串字符子函数***** WriteDataLCM(DData); WriteCommandLCM(X,0); 指令码为地址码+0X80 X|="0x80;" 若y为1(显示第二行),地址码+0X40 if(Y)X|="0x40;" DData) DisplayOneChar(uchar ****显示指定坐标的一个字符子函数**** 显示光标右移设置,检测忙信号 WriteCommandLCM(0x06,1); 清屏,检测忙信号 WriteCommandLCM(0x01,1); 关闭显示,检测忙信号 WriteCommandLCM(0x08,1); 8bit数据传送,2行显示,5*7字型,检测忙信号 WriteCommandLCM(0x38,1); delay(5); WriteCommandLCM(0x38,0); 三次显示模式设置,不检测忙信号 delay(15); DATAPORT="WCLCM;" ) initLCM( **********LCM初始化子函数*********** LCM_EN="1;" _nop_(); while(DATAPORT&BUSY) LCM_RW="0;" LCM_RS="0;" 读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色 lcd_wait(void) ***********lcm内部等待函数************* 写模式 选中数据寄存器 检测忙信号 ); lcd_wait( WDLCM) WriteDataLCM(uchar **********写数据到LCM子函数************ 选中指令寄存器 if(BusyC)lcd_wait(); BusyC) WCLCM,uchar WriteCommandLCM(uchar **********写指令到ICM子函数************ {;} for(j="0;j<60;j++)">=244)                           //如果当前压力值大于115kpa,    
76.	   
77.	          {  Alarm_led_red=0; }                 //则启动red led报警    
78.	           
79.	      else   
80.	         {    Alarm_led_red=1; }                //关闭red led 报警    
81.	              
82.	       
83.	      if(ad_data<=13)                            //如果当前压力值小于15kpa    
84.	   
85.	         {  Alarm_led_green=0;  }               //则启动green led报警    
86.	   
87.	      else   
88.	         {   Alarm_led_green=1; }               //关闭green  led 报警    

⌨️ 快捷键说明

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