久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機和MPX4115發動機機油壓力檢測Proteus仿真程序、載重檢測等
[打印本頁]
作者:
naigai223
時間:
2022-5-18 14:55
標題:
51單片機和MPX4115發動機機油壓力檢測Proteus仿真程序、載重檢測等
51單片機和MPX4115壓力測量器壓力檢測系統--發動機機油壓力檢測、載重檢測等
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(56.54 KB, 下載次數: 28)
下載附件
2022-5-18 18:10 上傳
51hei.gif
(97.3 KB, 下載次數: 28)
下載附件
2022-5-19 05:01 上傳
單片機代碼:
//線性區間標度變換公式: y=(115-15)/(243-13)*X+15kpa
#include <AT89X52.h>
#include <intrins.h>
#include <stdio.h>
#define R24C04ADD 0xA1
#define W24C04ADD 0xA0
//ADC0832的引腳
sbit ADCS =P2^2; //ADC0832 chip seclect
sbit ADDI =P2^4; //ADC0832 k in
sbit ADDO =P2^4; //ADC0832 k out
sbit ADCLK =P2^3; //ADC0832 clock signal
sbit SDA = P2 ^ 1; //數據線
sbit SCL = P2 ^ 0; //時鐘線
bit bAck; //應答標志 當bbAck=1是為正確的應答
unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f}; //位掃描
unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //共陽數碼管字段碼
unsigned char dispbuf[4];
unsigned int temp;
unsigned char getdata; //獲取ADC轉換回來的值
void delay_1ms(void) //12mhz delay 1.01ms
{
unsigned char x,y;
x=3;
while(x--)
{
y=40;
while(y--);
}
}
void display(void) //數碼管顯示函數
{
char k;
for(k=0;k<4;k++)
{
P1 = dispbitcode[k];
P0 = dispcode[dispbuf[k]];
if(k==1) //加上數碼管的dp小數點
P0&=0x7f;
delay_1ms();
}
}
/************
讀ADC0832函數
************/
//采集并返回
unsigned int Adc0832(unsigned char channel) //AD轉換,返回結果
{
unsigned char i=0;
unsigned char j;
unsigned int dat=0;
unsigned char 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); //return ad k
}
//啟動I2C總線,即發送起始條件
void StartI2C()
{
SDA = 1; //發送起始條件數據信號
_nop_();
SCL = 1;
_nop_(); //起始建立時間大于4.7us
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 0; //發送起始信號
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0; //時鐘操作
_nop_();
_nop_();
}
//結束I2C總線,即發送I2C結束條件
void StopI2C()
{
SDA = 0; //發送結束條件的數據信號
_nop_(); //發送結束條件的時鐘信號
SCL = 1; //結束條件建立時間大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1; //發送I2C總線結束命令
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//發送一個字節的數據
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt = 0;BitCnt < 8;BitCnt++) //一個字節
{
if((c << BitCnt)& 0x80) SDA = 1; //判斷發送位
else SDA = 0;
_nop_();
SCL = 1; //時鐘線為高,通知從機開始接收數據
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
_nop_();
_nop_();
SDA = 1; //釋放數據線,準備接受應答位
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
if(SDA == 1) bAck =0;
else bAck = 1; //判斷是否收到應答信號
SCL = 0;
_nop_();
_nop_();
}
//接收一個字節的數據
unsigned char RevByte()
{
unsigned char retc;
unsigned char BitCnt;
retc = 0;
SDA = 1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_nop_();
SCL = 0; //置時鐘線為低,準備接收
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1; //置時鐘線為高使得數據有效
_nop_();
_nop_();
retc = retc << 1; //左移補零
if (SDA == 1)
retc = retc + 1; //當數據為1則收到的數據+1
_nop_();
_nop_();
}
SCL = 0;
_nop_();
_nop_();
return(retc); //返回收到的數據
}
//WChipAdd:寫器件地址;RChipAdd:讀器件地址;InterAdd:內部地址;如寫正確則返回數據,
//否則返回對應錯誤步驟序號
//向指定器件的內部指定地址發送一個指定字節
unsigned char WIICByte(unsigned char WChipAdd,unsigned char InterAdd,unsigned char WIICData)
{
StartI2C(); //啟動總線
SendByte(WChipAdd); //發送器件地址以及命令
if (bAck==1) //收到應答
{
SendByte(InterAdd); //發送內部子地址
if (bAck ==1)
{
SendByte(WIICData); //發送數據
if(bAck == 1)
{
StopI2C(); //停止總線
return(0xff);
}
else
{
return(0x03);
}
}
else
{
return(0x02);
}
}
return(0x01);
}
//讀取指定器件的內部指定地址一個字節數據
unsigned char RIICByte(unsigned char WChipAdd,unsigned char RChipAdd,unsigned char InterDataAdd)
{
unsigned char TempData;
TempData = 0;
StartI2C(); //啟動
SendByte(WChipAdd); //發送器件地址以及讀命令
if (bAck==1) //收到應答
{
SendByte(InterDataAdd); //發送內部子地址
if (bAck ==1)
{
StartI2C();
SendByte(RChipAdd);
if(bAck == 1)
{
TempData = RevByte(); //接收數據
StopI2C(); //停止I2C總線
return(TempData); //返回數據
}
else
{
return(0x03);
}
}
else
{
return(0x02);
}
}
else
{
return(0x01);
}
}
void main(void)
{
unsigned int OverCounter = 0;
unsigned char ptemp;
bit OverFlg = 0;
unsigned int temp,ppress = 0;
float press;
while(1)
{
getdata=Adc0832(0);
if(14<getdata<243) //當壓力值介于15kpa到115kpa之間時,遵循線性變換
{
int vary=getdata; //y=(115-15)/(243-13)*X+15kpa
press=((10.0/23.0)*vary)+9.3; //測試時補償值為9.3
temp=(int)(press*10); //放大10倍,便于后面的計算
if(temp != ppress)
{
ppress = temp;
OverFlg = 1;
}
dispbuf[3]=temp/1000; //取壓力值百位
dispbuf[2]=(temp%1000)/100; //取壓力值十位
dispbuf[1]=((temp%1000)%100)/10; //取壓力值個位
dispbuf[0]=((temp%1000)%100)%10; //取壓力值十分位
display();
if (temp > 100)
{
if(OverFlg == 1) //如果是新的一輛車通過
{
OverCounter++;
WIICByte(W24C04ADD,0x01,(OverCounter/0xff)); //低位
WIICByte(W24C04ADD,0x02,(OverCounter%0xff)); //高位
// ptemp = printf("%f\n",OverCounter);
OverFlg = 0; //清除標志
}
}
}
}
}
復制代碼
本人初學,僅供參考,存在錯誤和不足之處,請大家回帖多多指教,切勿照搬,文件下載:
Keil代碼與Proteus8.8仿真下載:
仿真代碼.7z
(45.49 KB, 下載次數: 37)
2022-5-19 05:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美精品一区在线
|
中文字幕 亚洲一区
|
爽爽免费视频
|
国产精品久久久亚洲
|
国产在线精品区
|
久久国产精品一区二区三区
|
激情伊人网
|
一级黄色片日本
|
av网站免费在线观看
|
五月婷婷激情网
|
精品视频一区二区三区在线观看
|
欧美日韩精品久久久免费观看
|
中文字幕一区二区三区在线观看
|
精品久久国产
|
亚洲欧美日韩在线
|
国产欧美在线播放
|
黄频免费
|
国产欧美精品区一区二区三区
|
欧美亚洲视频在线观看
|
www97影院
|
毛片国产
|
国产女人第一次做爰毛片
|
99精品久久久
|
瑟瑟视频在线看
|
看一级毛片
|
日日碰狠狠躁久久躁96avv
|
狠狠色香婷婷久久亚洲精品
|
小草久久久久久久久爱六
|
亚洲网在线
|
国产一区二区久久
|
欧美日韩视频网站
|
日韩乱码在线
|
国产免费一区
|
91免费视频
|
欧美午夜视频
|
香蕉国产在线视频
|
日韩一区二区久久
|
久久久精
|
99亚洲精品
|
综合久久综合久久
|
欧美九九
|