|
基于PCF8591轉(zhuǎn)換器實(shí)現(xiàn)煙霧報警,LCD1602液晶屏和數(shù)碼管實(shí)現(xiàn)檢測煙霧濃度,超過預(yù)設(shè)值蜂鳴器響,燈亮。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
煙霧.png (93.68 KB, 下載次數(shù): 62)
下載附件
仿真圖
2018-10-30 08:06 上傳
單片機(jī)源程序:
- #include <reg51.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include <intrins.h>
- #include "I2C.h"
- #define u8 unsigned char
- #define u16 unsigned int
- #define uchar unsigned char
- #define uint unsigned int
- #define nops() do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0) //定義空指令
- #define READADDR 0x91 //讀地址
- #define WRITEADDR 0x90 //寫地址
- sbit SCL = P1^7; //I2C 時鐘
- sbit SDA = P1^6; //I2C 數(shù)據(jù)
- uchar yanwu; //用于讀取ADC數(shù)據(jù)
- uchar yushe_yanwu=100; //煙霧預(yù)設(shè)值
- //運(yùn)行模式
- uchar Mode=0; // =1是設(shè)置煙霧閥值 =0是正常監(jiān)控模式
- //管腳聲明
- sbit Led_Reg =P2^2; //紅燈
- sbit Buzzer =P1^5; //蜂鳴器
- sbit Fan =P3^3; //
- /********************************************************************
- * 名稱 : delay_1ms()
- * 功能 : 延時1ms函數(shù)
- * 輸入 : q
- * 輸出 : 無
- ***********************************************************************/
- void delay_ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<110;j++);
- }
- /***********************************************************************************************************
- LCD1602相關(guān)函數(shù)
- 特殊接口說明
- RS:寄存器選擇輸入端
- RS = 1:指向數(shù)據(jù)寄存器 數(shù)據(jù)
- RS = 0:指向指令寄存器 命令
- RW:讀寫控制輸入端
- RW = 0:寫操作 RW = 1:讀操作
- E:使能信號輸入端
- 讀操作時,高電平有效;
- 寫操作時,下降沿有效;
- ***********************************************************************************************************/
- //LCD管腳聲明 (RW引腳實(shí)物直接接地,因為本設(shè)計只用到液晶的寫操作,RW引腳一直是低電平)
- sbit LCDRS = P2^6; //寄存器選擇輸入端,RS = 1 指向數(shù)據(jù)(讀或?qū)憯?shù)據(jù)) RS = 0指向指令(讀或?qū)懨睿?br />
- sbit LCDEN = P2^7;
- sbit D0 = P0^0;
- sbit D1 = P0^1;
- sbit D2 = P0^2;
- sbit D3 = P0^3;
- sbit D4 = P0^4;
- sbit D5 = P0^5;
- sbit D6 = P0^6;
- sbit D7 = P0^7;
- //LCD延時
- void LCDdelay(uint z) //該延時大約100us(不精確,液晶操作的延時不要求很精確)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=10;y>0;y--);
- }
- void LCD_WriteData(u8 dat)
- {
- if(dat&0x01)D0=1;else D0=0;
- if(dat&0x02)D1=1;else D1=0;
- if(dat&0x04)D2=1;else D2=0;
- if(dat&0x08)D3=1;else D3=0;
- if(dat&0x10)D4=1;else D4=0;
- if(dat&0x20)D5=1;else D5=0;
- if(dat&0x40)D6=1;else D6=0;
- if(dat&0x80)D7=1;else D7=0;
- }
- //寫命令
- void write_com(uchar com)
- {
- LCDRS=0; //RS = 0 ,指向數(shù)據(jù)寄存器,
- LCD_WriteData(com);
- // DAT=com;
- LCDdelay(5);
- LCDEN=1;
- LCDdelay(5);
- LCDEN=0;
- }
- //寫數(shù)據(jù)
- void write_data(uchar date)
- {
- LCDRS=1;
- LCD_WriteData(date);
- // DAT=date;
- LCDdelay(5);
- LCDEN=1;
- LCDdelay(5);
- LCDEN=0;
- }
- /*------------------------------------------------
- 選擇寫入位置
- x = 0 表示寫入第一行, y是列
- x = 1 表示寫入第二行, y是列
- ------------------------------------------------*/
- void SelectPosition(unsigned char x,unsigned char y)
- {
- if (x == 0)
- {
- write_com(0x80 + y); //表示第一行
- }
- else
- {
- write_com(0xC0 + y); //表示第二行
- }
- }
- /*------------------------------------------------
- 寫入字符串函數(shù)
- x是行,y是列,*s是寫入的數(shù)據(jù)
- ------------------------------------------------*/
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- SelectPosition(x,y) ;
- while (*s)
- {
- write_data( *s);
- s++;
- }
- }
- //========================================================================
- // 函數(shù): void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
- // 應(yīng)用: LCD_Write_Char(0,1,366,4) ;
- // 描述: 在第0行第一個字節(jié)位置顯示366的后4位,顯示結(jié)果為 0366
- // 參數(shù): x:行,y:列,s:要顯示的字,l:顯示的位數(shù)
- // 返回: none.
- // 版本: VER1.0
- // 備注: 最大顯示65535
- //========================================================================
- void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
- {
- SelectPosition(x,y) ;
- if(l>=5)
- write_data(0x30+s/10000%10); //萬位
- if(l>=4)
- write_data(0x30+s/1000%10); //千位
- if(l>=3)
- write_data(0x30+s/100%10); //百位
- if(l>=2)
- write_data(0x30+s/10%10); //十位
- if(l>=1)
- write_data(0x30+s%10); //個位
- }
復(fù)制代碼
全部資料51hei下載地址:
煙霧報警器.zip
(142.14 KB, 下載次數(shù): 184)
2018-10-30 08:07 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|