|
瓦斯監(jiān)測的傳感器接在adc0809的輸入端,模數(shù)轉換之后,再給單片機來處理 下面是仿真原理圖:歡迎大家改進并增強功能.
源程序:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char //定義數(shù)據(jù)類型
- #define uint unsigned int
- bit flag; //標志位
- /**************1602顯示字符***************/
- uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //1602顯示數(shù)組
- uchar code tab[]="Shenyangligong University"; //1602顯示字符
- uchar code table1[]="Gas strength0.5%";
- /**************1602控制端口管腳定義***************/
- sbit lcdrs=P3^0;
- sbit lcdrw=P3^1;
- sbit lcden=P3^2;
- sbit start=P3^4;
- /**************AD0809控制端口定義***************/
- sbit eoc=P3^3;
- sbit oe=P3^5;
- sbit CLK=P3^6;
- sbit P0_7=P0^7;
- /**************其他變量***************/
- uchar shi,ge,shi1,bai1,num;
- uint temp;
- uchar count;//蜂鳴器常量
- /**************系統(tǒng)延時常量***************/
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /**************蜂鳴器延時(500HZ)***************/
- void dely500(void)
- {
- unsigned char i;
- for(i=250;i>0;i--)
- {
- _nop_();
- }
- }
- /**************1602命令函數(shù)***************/
- void write_com(uchar com)
- {
- lcdrs=0;
- P1=com;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- /**************1602數(shù)據(jù)函數(shù)***************/
- void write_data(uchar date)
- {
- lcdrs=1;
- P1=date;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- /**************系統(tǒng)初始化***************/
- void init()
- {
- oe=0;
- lcden=0;
- lcdrw=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80);
- temp=0;
- TMOD=0x01;
- TH0=(65536-500)/256;
- TL0=(65536-500)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- /**************1602顯示函數(shù)***************/
- void voltage(uchar ge,uchar shi,uchar bai1)
- {
- shi=temp/1000;
- ge=temp%1000/100;
- shi1=temp%100/10;
- bai1=temp%10;
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_data(tab[num]);
- }
- write_com(0xc0);
- for(num=0;num<6;num++)
- {
- write_data(table1[num]);
- }
- write_com(0xc7);
- write_data(table[shi]);
- delay(1);
- write_com(0xc8);
- write_data(table[ge]);
- delay(1);
- write_com(0xc9);
- write_data('.');
- delay(1);
- write_com(0xca);
- write_data(table[shi1]);
- delay(1);
- write_com(0xcb);
- write_data(table[bai1]);
- delay(1);
- write_com(0xcc);
- for(num=0;num<2;num++)
- {
- write_data(table1[num]);
- }
- /*AD控制程序*/
- start=0;
- start=1;
- start=0;
- while(!eoc);
- oe=1;
- temp=P2;
- oe=0;
- temp=(temp*2*1*98.039216/100);//AD采樣換算
- /*****蜂鳴器報警程序*******/
- /**瓦斯爆炸濃度:5%——16%,本例中采用5%——15%**/
- if(temp>=200)
- {
- for(count=200;count>0;count--)
- {
- P0_7=~P0_7;
- dely500();
- }
- for(count=200;count>0;count--)
- {
- P0_7=~P0_7;
- dely500();
- dely500();
- }
- }
- }
- /**************中斷***************/
- void timer0() interrupt 1
- {
- TH0=(65536-500)/256;
- TL0=(65536-500)%256;
- CLK=~CLK; //CLK按位取反,代替了方波脈沖
- }
- void main()
- {
- init();
- while(1)
- {
- voltage(ge,shi,bai1);
- }
- }
復制代碼
|
|