|
基于51單片機(jī)和ADC0832設(shè)計(jì)的壓力傳感器 大于100KG的時(shí)候蜂鳴器報(bào)警 指示燈亮 按下按鍵后可關(guān)閉 電機(jī)轉(zhuǎn)速將變慢
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ圖片20190524153106.png (227.27 KB, 下載次數(shù): 80)
下載附件
2019-5-24 15:33 上傳
單片機(jī)源程序如下:
- //線性區(qū)間標(biāo)度變換公式: y=(115-15)/(243-13)*X+15kpa
- #include <AT89X52.h>
- #include <intrins.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- #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 MA = P1^4;
- sbit LED = P1^5;
- sbit SPK= P1^6;
- sbit K1 = P1^7;
- sbit SDA = P2 ^ 1; //數(shù)據(jù)線
- sbit SCL = P2 ^ 0; //時(shí)鐘線
- bit bAck; //應(yīng)答標(biāo)志 當(dāng)bbAck=1是為正確的應(yīng)答
- 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}; //共陽(yáng)數(shù)碼管字段碼
- unsigned char dispbuf[4];
- unsigned int temp;
- unsigned char getdata; //獲取ADC轉(zhuǎn)換回來(lái)的值
- void delay_1ms(void) //12mhz delay 1.01ms
- {
- unsigned char x,y;
- x=3;
- while(x--)
- {
- y=40;
- while(y--);
- }
- }
- void display(void) //數(shù)碼管顯示函數(shù)
- {
- char k;
- for(k=0;k<4;k++)
- {
- P1 = dispbitcode[k];
- P0 = dispcode[dispbuf[k]];
- if(k==1) //加上數(shù)碼管的dp小數(shù)點(diǎn)
- P0&=0x7f;
- delay_1ms();
- }
- }
- /************
- 讀ADC0832函數(shù)
- ************/
- //采集并返回
- unsigned int Adc0832(unsigned char channel) //AD轉(zhuǎn)換,返回結(jié)果
- {
- 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;//控制命令結(jié)束
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++)
- {
- dat|=ADDO;//收數(shù)據(jù)
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次時(shí)鐘脈沖
- _nop_();
- _nop_();
- dat<<=1;
- if(i==7)dat|=ADDO;
- }
- for(i=0;i<8;i++)
- {
- j=0;
- j=j|ADDO;//收數(shù)據(jù)
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次時(shí)鐘脈沖
- _nop_();
- _nop_();
- j=j<<7;
- ndat=ndat|j;
- if(i<7)ndat>>=1;
- }
- ADCS=1;//拉低CS端
- ADCLK=0;//拉低CLK端
- ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
- dat<<=8;
- dat|=ndat;
- return(dat); //return ad k
- }
- //啟動(dòng)I2C總線,即發(fā)送起始條件
- void StartI2C()
- {
- SDA = 1; //發(fā)送起始條件數(shù)據(jù)信號(hào)
- _nop_();
- SCL = 1;
- _nop_(); //起始建立時(shí)間大于4.7us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SDA = 0; //發(fā)送起始信號(hào)
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SCL = 0; //時(shí)鐘操作
- _nop_();
- _nop_();
- }
- //結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件
- void StopI2C()
- {
- SDA = 0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
- _nop_(); //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
- SCL = 1; //結(jié)束條件建立時(shí)間大于4us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SDA = 1; //發(fā)送I2C總線結(jié)束命令
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- //發(fā)送一個(gè)字節(jié)的數(shù)據(jù)
- void SendByte(unsigned char c)
- {
- unsigned char BitCnt;
- for(BitCnt = 0;BitCnt < 8;BitCnt++) //一個(gè)字節(jié)
- {
- if((c << BitCnt)& 0x80) SDA = 1; //判斷發(fā)送位
- else SDA = 0;
- _nop_();
- SCL = 1; //時(shí)鐘線為高,通知從機(jī)開(kāi)始接收數(shù)據(jù)
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SCL = 0;
- }
- _nop_();
- _nop_();
- SDA = 1; //釋放數(shù)據(jù)線,準(zhǔn)備接受應(yīng)答位
- _nop_();
- _nop_();
- SCL = 1;
- _nop_();
- _nop_();
- _nop_();
- if(SDA == 1) bAck =0;
- else bAck = 1; //判斷是否收到應(yīng)答信號(hào)
- SCL = 0;
- _nop_();
- _nop_();
- }
- //接收一個(gè)字節(jié)的數(shù)據(jù)
- unsigned char RevByte()
- {
- unsigned char retc;
- unsigned char BitCnt;
- retc = 0;
- SDA = 1;
- for(BitCnt=0;BitCnt<8;BitCnt++)
- {
- _nop_();
- SCL = 0; //置時(shí)鐘線為低,準(zhǔn)備接收
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SCL = 1; //置時(shí)鐘線為高使得數(shù)據(jù)有效
- _nop_();
- _nop_();
- retc = retc << 1; //左移補(bǔ)零
- if (SDA == 1)
- retc = retc + 1; //當(dāng)數(shù)據(jù)為1則收到的數(shù)據(jù)+1
- _nop_();
- _nop_();
- }
- SCL = 0;
- _nop_();
- _nop_();
- return(retc); //返回收到的數(shù)據(jù)
- }
- //WChipAdd:寫(xiě)器件地址;RChipAdd:讀器件地址;InterAdd:內(nèi)部地址;如寫(xiě)正確則返回?cái)?shù)據(jù),
- //否則返回對(duì)應(yīng)錯(cuò)誤步驟序號(hào)
- //向指定器件的內(nèi)部指定地址發(fā)送一個(gè)指定字節(jié)
- unsigned char WIICByte(unsigned char WChipAdd,unsigned char InterAdd,unsigned char WIICData)
- {
- StartI2C(); //啟動(dòng)總線
- SendByte(WChipAdd); //發(fā)送器件地址以及命令
- if (bAck==1) //收到應(yīng)答
- {
- SendByte(InterAdd); //發(fā)送內(nèi)部子地址
- if (bAck ==1)
- {
- SendByte(WIICData); //發(fā)送數(shù)據(jù)
- if(bAck == 1)
- {
- StopI2C(); //停止總線
- return(0xff);
- }
- else
- {
- return(0x03);
- }
- }
- else
- {
- return(0x02);
- }
- }
- return(0x01);
- }
- //讀取指定器件的內(nèi)部指定地址一個(gè)字節(jié)數(shù)據(jù)
- unsigned char RIICByte(unsigned char WChipAdd,unsigned char RChipAdd,unsigned char InterDataAdd)
- {
- unsigned char TempData;
- TempData = 0;
- StartI2C(); //啟動(dòng)
- SendByte(WChipAdd); //發(fā)送器件地址以及讀命令
- if (bAck==1) //收到應(yīng)答
- {
- SendByte(InterDataAdd); //發(fā)送內(nèi)部子地址
- if (bAck ==1)
- {
- StartI2C();
- SendByte(RChipAdd);
- if(bAck == 1)
- {
- TempData = RevByte(); //接收數(shù)據(jù)
- StopI2C(); //停止I2C總線
- return(TempData); //返回?cái)?shù)據(jù)
- }
- else
- {
- return(0x03);
- }
- }
- else
- {
- return(0x02);
- }
- }
- else
- {
- return(0x01);
- }
- }
- void main(void)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (4.22 KB, 下載次數(shù): 70)
下載附件
2019-5-24 18:44 上傳
所有資料51hei提供下載:
基于單臂電橋的電子地秤.rar
(105.69 KB, 下載次數(shù): 228)
2019-5-24 15:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|