#include <reg51.h> #include <intrins.h> #include <stdio.h> //包含必要的頭文件
#define uint unsigned int #define uchar unsigned char #define delay4us() {_nop_();_nop_();_nop_();_nop_();} #define NOP _nop_()
sbit HIGH=P2^3; sbit LOW=P2^4 ; sbit AD_CS =P1^0; sbit SCK=P1^1; sbit DO=P1^2; sbit DI=P1^2; sbit RS=P2^0; sbit RW=P2^1; sbit E =P2^2; //必要的位定義
unsigned char adval; uchar Display_Buffer[] = "000.0KPa"; uchar code Line1[] = "Current Press:"; //初始化所顯示的字符
uchar adc0832(uchar channel) //讀ADC0832函數(shù),采集并返回 { uchar i=0; uchar j; uint dat2=0; uchar ndat=0; if(channel==0)channel=2; if(channel==1)channel=3; AD_CS=0;NOP; NOP; //拉低CS端,AD片選 DI=1;NOP; NOP; //在第一個脈沖下降之前 DI 必須是高電平,表示啟始信號 SCK=1;NOP; NOP; SCK=0;NOP; NOP; SCK=1; DI=channel&0x1;NOP;NOP; //在第二和第三個脈沖下降之前 DI 輸入兩位表示通道
SCK=0;NOP; NOP; SCK=1; DI=(channel>>1)&0x1;NOP; NOP; SCK=0; //寫命令完成,DI失去輸入作用 DI=1;NOP;NOP; dat2=0; for(i=0;i<8;i++) //讀出8字節(jié)數(shù)據(jù) { dat2|=DO; SCK=1;NOP; NOP; SCK=0;NOP; NOP; dat2<<=1; if(i==7) dat2|=DO; }
for(i=0;i<8;i++) { j=0; j=j|DO; SCK=1;NOP; NOP; SCK=0;NOP; NOP; j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; }
AD_CS=1; SCK=0; DO=1; dat2<<=8; dat2|=ndat; return(dat2); //返回數(shù)據(jù) }
void DelayMS(uint ms) //延時程序,相應(yīng)數(shù)值為相應(yīng)毫秒數(shù) { uchar i; while(ms--) { for(i=0;i<120;i++); //1mS延時 } }
uchar Read_LCD_State() //檢測LCD是否“忙” { uchar state; RS=0;RW=1;E=1;DelayMS(1); state=P0; //返回P0的值 E= 0;DelayMS(1); return state; //返回狀態(tài) }
void LCD_Busy_Wait() { while((Read_LCD_State()&0x80)==0x80); DelayMS(5); }
void LCD_Write_Command(uchar cmd) //寫命令函數(shù) { LCD_Busy_Wait(); RS = 0; RW = 0; E = 0; _nop_(); _nop_(); P0 = cmd; //將CMD值寫入LCD產(chǎn)生相應(yīng)的控制 delay4us(); E = 1; delay4us(); E = 0; }
void Set_LCD_Pos(uchar pos) { LCD_Write_Command(pos | 0x80); }
void LCD_Write_Data(uchar dat) //寫數(shù)據(jù)函數(shù) { LCD_Busy_Wait(); RS = 1; RW = 0; E = 0; P0 = dat; delay4us(); E = 1; delay4us(); E = 0; }
void LCD_Initialise() //LCD初始化函數(shù) { LCD_Write_Command(0x38); DelayMS(1); LCD_Write_Command(0x0c); DelayMS(1); LCD_Write_Command(0x06); DelayMS(1); LCD_Write_Command(0x01); DelayMS(1); }
void Display_LCD_String(uchar p,uchar *s) //LCD顯示函數(shù) { uchar i; Set_LCD_Pos(p); for(i=0;i<16;i++) { LCD_Write_Data(s); //調(diào)用寫數(shù)據(jù)函數(shù) DelayMS(1); } }
void write_sfm(uchar add,uchar num) //分秒函數(shù) { LCD_Write_Command(0x80+0x40+add); //第行數(shù)據(jù)指針位置調(diào)整 LCD_Write_Data(0x30+num); }
void main() { uchar c; uint bai,sh,ge,xiaoshu; long d; //為得到小數(shù)部分,使用長整形數(shù) LCD_Initialise(); DelayMS(10); Display_LCD_String(0x00,Line1); Display_LCD_String(0x46,Display_Buffer); HIGH=0; LOW=0;
while(1) { c=adc0832(0); d=c; d=d*10; //將數(shù)值擴(kuò)大10倍得到小數(shù) d=((d-100)*1000/2360)+150; //將電壓值轉(zhuǎn)換為壓力值 bai=d/1000 ; //分離出百位 sh=d%1000/100; //分離出十位 ge=d%100/10; //分離出個位 xiaoshu=d%10 ; //分離出小數(shù)位 if(c>246) //判斷過壓函數(shù) { HIGH=1;LOW=0; //開啟過壓報警燈 DelayMS(1) ; write_sfm(6,bai); write_sfm(7,sh); write_sfm(8,ge); write_sfm(10,xiaoshu); //寫數(shù)據(jù) } else if(c<10) //開啟欠壓報警燈 { { LOW=1; HIGH=0; write_sfm(6,bai); write_sfm(7,sh); write_sfm(8,ge); write_sfm(10,xiaoshu); //寫數(shù)據(jù) } else { HIGH=0;LOW=0; //正常狀態(tài),顯示壓力值 write_sfm(6,bai); write_sfm(7,sh); write_sfm(8,ge); write_sfm(10,xiaoshu); } } } //程序完 #include <reg51.h> #include <intrins.h> #include <stdio.h> //包含必要的頭文件
#define uint unsigned int #define uchar unsigned char #define delay4us() {_nop_();_nop_();_nop_();_nop_();} #define NOP _nop_()
sbit HIGH=P2^3; sbit LOW=P2^4 ; sbit AD_CS =P1^0; sbit SCK=P1^1; sbit DO=P1^2; sbit DI=P1^2; sbit RS=P2^0; sbit RW=P2^1; sbit E =P2^2; //必要的位定義
unsigned char adval; uchar Display_Buffer[] = "000.0KPa"; uchar code Line1[] = "Current Press:"; //初始化所顯示的字符
uchar adc0832(uchar channel) //讀ADC0832函數(shù),采集并返回 { uchar i=0; uchar j; uint dat2=0; uchar ndat=0; if(channel==0)channel=2; if(channel==1)channel=3; AD_CS=0;NOP; NOP; //拉低CS端,AD片選 DI=1;NOP; NOP; //在第一個脈沖下降之前 DI 必須是高電平,表示啟始信號 SCK=1;NOP; NOP; SCK=0;NOP; NOP; SCK=1; DI=channel&0x1;NOP;NOP; //在第二和第三個脈沖下降之前 DI 輸入兩位表示通道
SCK=0;NOP; NOP; SCK=1; DI=(channel>>1)&0x1;NOP; NOP; SCK=0; //寫命令完成,DI失去輸入作用 DI=1;NOP;NOP; dat2=0; for(i=0;i<8;i++) //讀出8字節(jié)數(shù)據(jù) { dat2|=DO; SCK=1;NOP; NOP; SCK=0;NOP; NOP; dat2<<=1; if(i==7) dat2|=DO; }
for(i=0;i<8;i++) { j=0; j=j|DO; SCK=1;NOP; NOP; SCK=0;NOP; NOP; j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; }
AD_CS=1; SCK=0; DO=1; dat2<<=8; dat2|=ndat; return(dat2); //返回數(shù)據(jù) }
void DelayMS(uint ms) //延時程序,相應(yīng)數(shù)值為相應(yīng)毫秒數(shù) { uchar i; while(ms--) { for(i=0;i<120;i++); //1mS延時 } }
uchar Read_LCD_State() //檢測LCD是否“忙” { uchar state; RS=0;RW=1;E=1;DelayMS(1); state=P0; //返回P0的值 E= 0;DelayMS(1); return state; //返回狀態(tài) }
void LCD_Busy_Wait() { while((Read_LCD_State()&0x80)==0x80); DelayMS(5); }
void LCD_Write_Command(uchar cmd) //寫命令函數(shù) { LCD_Busy_Wait(); RS = 0; RW = 0; E = 0; _nop_(); _nop_(); P0 = cmd; //將CMD值寫入LCD產(chǎn)生相應(yīng)的控制 delay4us(); E = 1; delay4us(); E = 0; }
void Set_LCD_Pos(uchar pos) { LCD_Write_Command(pos | 0x80); }
void LCD_Write_Data(uchar dat) //寫數(shù)據(jù)函數(shù) { LCD_Busy_Wait(); RS = 1; RW = 0; E = 0; P0 = dat; delay4us(); E = 1; delay4us(); E = 0; }
void LCD_Initialise() //LCD初始化函數(shù) { LCD_Write_Command(0x38); DelayMS(1); LCD_Write_Command(0x0c); DelayMS(1); LCD_Write_Command(0x06); DelayMS(1); LCD_Write_Command(0x01); DelayMS(1); }
void Display_LCD_String(uchar p,uchar *s) //LCD顯示函數(shù) { uchar i; Set_LCD_Pos(p); for(i=0;i<16;i++) { LCD_Write_Data(s); //調(diào)用寫數(shù)據(jù)函數(shù) DelayMS(1); } } void write_sfm(uchar add,uchar num) //分秒函數(shù) { LCD_Write_Command(0x80+0x40+add); //第行數(shù)據(jù)指針位置調(diào)整 LCD_Write_Data(0x30+num); } void main() { uchar c; uint bai,sh,ge,xiaoshu; long d; //為得到小數(shù)部分,使用長整形數(shù) LCD_Initialise(); DelayMS(10); Display_LCD_String(0x00,Line1); Display_LCD_String(0x46,Display_Buffer); HIGH=0; LOW=0; while(1) { c=adc0832(0); d=c; d=d*10; //將數(shù)值擴(kuò)大10倍得到小數(shù) d=((d-100)*1000/2360)+150; //將電壓值轉(zhuǎn)換為壓力值 bai=d/1000 ; //分離出百位 sh=d%1000/100; //分離出十位 ge=d%100/10; //分離出個位 xiaoshu=d%10 ; //分離出小數(shù)位 if(c>246) //判斷過壓函數(shù) { HIGH=1;LOW=0; //開啟過壓報警燈 DelayMS(1) ; write_sfm(6,bai); write_sfm(7,sh); write_sfm(8,ge); write_sfm(10,xiaoshu); //寫數(shù)據(jù) } else if(c<10) //開啟欠壓報警燈 { { LOW=1; HIGH=0; write_sfm(6,bai); write_sfm(7,sh); write_sfm(8,ge); write_sfm(10,xiaoshu); //寫數(shù)據(jù) } else { HIGH=0;LOW=0; //正常狀態(tài),顯示壓力值 write_sfm(6,bai); write_sfm(7,sh); write_sfm(8,ge); write_sfm(10,xiaoshu); } } } //程序完
仿真圖
|