亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
51單片機MPX4115壓力傳感器+ADC0832仿真課設程序
[打印本頁]
作者:
Fader
時間:
2019-1-11 19:57
標題:
51單片機MPX4115壓力傳感器+ADC0832仿真課設程序
此課設基于ADC0832和壓力傳感器MPX4115,把傳感器的值通過運放電路調整,送入AD轉換,再經單片機編程實現壓力的測量與顯示;涉及PWM控制,串口,按鍵控制PWM占空比等。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(41.49 KB, 下載次數: 82)
下載附件
2019-1-12 03:13 上傳
單片機源程序如下:
#include<math.h>
#include<absacc.h>
#include<intrins.h>
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define BUSY 0x80 //常量定義
#define DATAPORT P0
sbit Alarm_led_red =P1^6; //超過壓力表量程最大值紅燈報警
sbit Alarm_led_green=P1^7; //低于壓力表量程最小值路燈報警
sbit LCM_RS=P2^0;
sbit LCM_RW=P2^1;
sbit LCM_EN=P2^2;
sbit k1=P2^3;
sbit k2=P2^4;
sbit k3=P2^5;
sbit k4=P2^6;
sbit ADCS =P3^5; //ADC0832 chip seclect
sbit ADCLK =P3^6; //ADC0832 clock signal
sbit ADDI =P3^7; //ADC0832 k in
sbit ADDO =P3^7; //ADC0832 k out
uchar ad_data; //采樣值存儲
unsigned char ad_alarm; //報警值存儲單元
unsigned char press_bai=0; //顯示值百位
unsigned char press_shi=0; //顯示值十位
unsigned char press_ge=0; //顯示值個位
unsigned char press_dot=0; //顯示值十分位
uchar code str0[]={"Press: . kpa. "};
uchar code str1[]={"ZKB: 00 % "};
uchar ZKB[2];
uchar HighRH = 0;
uchar HighRL = 0;
uchar LowRH = 0;
uchar LowRL = 0;
unsigned int a;
uchar rate;
sbit PWMOUT = P1^0;
uchar step, rec_data,flag;
uchar Adc0832(unsigned char channel);
void delay(uint);
void lcd_wait(void); //檢測忙子程序
void delay_LCM(uint); //延時子程序
void initLCM(void); //初始化子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC); //寫指令到LCM子程序
void WriteDataLCM(uchar WDLCM); //寫數據到LCM子程序
void DisplayOneChar(uchar X,uchar Y,uchar DData); //顯示指定坐標的一個字符子函數
void DisplayListChar(uchar X,uchar Y,uchar code *DData); //顯示指定坐標的一串字符子函數
void display(void); //系統顯示子函數
void ConfigPWM(uchar rate);
void alarm(void);
void data_pro(void);
void ConfigPWM(uchar dc);
void key_setPWM(void);
uchar duty_cycle(uchar ad_data);
void display_zkb(void);
void zkb_pro(void);
void chuankou_init();
/**********main funcation************/
void main(void)
{
delay(50);
initLCM( );
chuankou_init();
WriteCommandLCM(0x01,1); //清屏顯示
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
delay(10);
PWMOUT=1;
EA = 1;
ConfigPWM(rate);
while(1)
{
ad_data =Adc0832(0); //采樣值存儲單元初始化為0
alarm();
data_pro();
zkb_pro();
display();
display_zkb();
a=duty_cycle(ad_data);
ConfigPWM(a);
key_setPWM();
if(a!=rate)
{
ConfigPWM(rate);
}
if(RI==1)//串口
{
RI=0;
rec_data=SBUF;
step=rec_data*2;
SBUF=rec_data;
}
}
}
void TIME_INIT()
{
TMOD|=0X02;
IT0=1;
IT1=1;
TR1=1;
EX1=1;
EX0=1;
ET0=1;
TR0=1;
EA=1;
}
void chuankou_init()
{
SCON|=0X50;
TMOD|=0X20;
PCON|=0X80;
TH1=0XFA;
TL1=0XFA;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
/********延時K*1ms,12.000mhz**********/
void delay(uint x)
{
uchar i;
while(x--)
{
for(i = 0;i < 120;i++)
{;}
}
}
/**********寫數據到ICM子函數************/
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC)
lcd_wait(); //檢測忙信號
DATAPORT=WCLCM;
LCM_RS=0;
LCM_RW=0;
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/**********????LCM???************/
void WriteDataLCM(uchar WDLCM)
{
lcd_wait( );
DATAPORT=WDLCM;
LCM_RS=1; //選中數據寄存器
LCM_RW=0; //寫模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/***********lcm內部等待程序*************/
void lcd_wait(void)
{
DATAPORT=0xff; //讀LCD前若單片機輸出低電平,而讀出LCD為高電平,則沖突,Proteus仿真會有顯示邏輯黃色
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
_nop_();
_nop_();
while(DATAPORT&BUSY)
{
LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;
}
/**********LCM??????***********/
void initLCM( )
{
DATAPORT=0;
delay(15);
WriteCommandLCM(0x38,0); //三次顯示模式,不檢測忙信號
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,1); //8bit數據傳送,兩行顯示,5*7字型,檢測忙信號
WriteCommandLCM(0x08,1); //關閉顯示,檢測忙信號
WriteCommandLCM(0x01,1); //清屏,檢測忙信號
WriteCommandLCM(0x06,1); //顯示光標右移設置
WriteCommandLCM(0x0c,1); //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
}
/****??????????????****/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40; //若Y為1(顯示第二行)地址譯碼+0x40
X|=0x80; //指令碼為地址碼+0x80
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
/*******??????????????*****/
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
uchar ListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
/*****************???????*****************/
void display(void)
{
WriteCommandLCM(0x0c,1); //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(7,0,press_bai+0x30);
DisplayOneChar(8,0,press_shi+0x30);
DisplayOneChar(9,0,press_ge +0x30);
DisplayOneChar(10,0,056);
DisplayOneChar(11,0,press_dot+0x30);
}
void display_zkb(void)
{
WriteCommandLCM(0x0c,1);
DisplayListChar(0,1,str1);
DisplayOneChar(7,1,ZKB[0]+0x30);
DisplayOneChar(8,1,ZKB[1]+0x30);
delay(1000); //穩定顯示
}
/************?ADC0832??************/
uchar Adc0832(unsigned char channel) //AD轉換,并返回結果
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0; //拉低CS端
_nop_();
_nop_();
ADCLK=1; //拉高CLK端
_nop_();
_nop_();
ADCLK=0; //拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1; //拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0; //拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1; //拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0; //拉低CLK端,形成下降沿3
ADDI=1; //控制命令結束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO; //收數據
ADCLK=1;
_nop_();
_nop_();
ADCLK=0; //形成一次時鐘脈沖
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO; //收數據
ADCLK=1;
_nop_();
_nop_();
ADCLK=0; //形成一次時鐘脈沖
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1; //拉低CS端
ADCLK=0; //拉低CLK端
ADDO=1; //拉高數據端,回到初始狀態
dat<<=8;
dat|=ndat;
return(dat);
}
void zkb_pro(void)
{
unsigned int temp;
temp=100*ad_data/256;
if(temp>0 && temp<100)
{
ZKB[0]=temp/10;
ZKB[1]=temp%10;
}
}
void data_pro(void)
{
unsigned int temp;
float press;
if(14<ad_data<243) //壓力值介于15KPA,到115kpa之間,呈線性變化
{
int vary=ad_data; //y=(115-15)/(243-13)*X+15kpa
//press=24+ad_data/2.67;
press=((10.0/28.1)*vary)+9.3; //測試時補償值為9.3
temp=(int)(press*10); //放大10倍,便于后面計算
press_bai=temp/1000;
press_shi=(temp%1000)/100;
press_ge=((temp%1000)%100)/10;
press_dot=((temp%1000)%100)%10;
}
}
/*****************?????*******************/
void alarm(void)
{
if(ad_data>=243)
{
Alarm_led_red=0;
a=10000;
while(a--);
{
}
Alarm_led_red=1;
a=10000;
while(a--);
{
}
}
else
{ Alarm_led_red=1; }
if(ad_data<=15)
{ Alarm_led_green=0;
a=10000;
while(a--);
{
}
Alarm_led_green=1;
a=10000;
while(a--);
{
}
}
else
{ Alarm_led_green=1; }
}
uchar duty_cycle(uchar ad_data)
{
uchar rate;
rate= 100*ad_data/256;
return(rate);
}
/* ??????*/
void key_setPWM()
{
if(k1==0)
{
delay(20);
if(k1==0)
{
rate++;
if(rate>99)rate=99;
while(!k2);
}
}
if(k2==0)
{
delay(20);
if(k2==0)
{
rate--;
if(rate<1)rate=1;
while(!k2);}
}
if(k3==0)
{
delay(20);
if(k3==0)
{
rate+=10;
if(rate>99)rate=99;
while(!k3);}
}
if(k4==0)
{
delay(20);
if(k4==0)
{
rate-=10;
if(rate<1)rate=1;
while(!k4);
}
}
}
/*??????dc,??20Hz????*/
void ConfigPWM(uchar dc)
{
unsigned long tmp; //臨時變量
uint high, low;
tmp = 11059200/12/20; //計算一個周期所需的計數值
high = (tmp*dc)/100; //計算高電平所需計數值
low = tmp - high; //計算低電平所需計數值
high = 65536 - high + 12; //計算高電平的定時器重載值并補償中斷延時
low = 65536 - low + 12; //計算低電平的定時器重載值并補償中斷延時
HighRH = (uchar)(high >>8); //高電平重載值拆分為高低字節
HighRL = (uchar)high;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
11502測控課設.zip
(30.52 KB, 下載次數: 251)
2019-1-11 19:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
23241
時間:
2019-10-31 19:29
這個軟件用的什么那,仿真軟件?
作者:
23241
時間:
2019-10-31 19:46
能不能把仿真圖發給我,我自己畫,我的軟件打不開這個圖,很急的
作者:
159.5819059
時間:
2019-12-16 23:00
這個有沒有詳細元件的圖片
作者:
子子子子子
時間:
2020-3-7 21:52
Proteus8也沒打開原理圖,,
作者:
bsbhwjjsjjsjsj
時間:
2020-4-18 22:21
誰給我發一下程序啊
作者:
793353205
時間:
2021-7-21 20:22
能把仿真圖發給我嗎,我的軟件打不開這個圖,謝謝了
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1