花了一個星期做的單片機結課作業,代碼注釋清晰,可讀性高。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ截圖20181105160318.png (172.58 KB, 下載次數: 52)
下載附件
2018-11-5 16:03 上傳
單片機源程序如下:
- /******************************************************************
- * @file chengxu.c
- * @author 16自動化1班
- * @version 終結版
- * @date 2018年11月5號
- ******************************************************************
- * @instructions
- * 該程序實現的是對煙霧濃度的檢測以百分制形式將采集到的值顯示在數
- * 碼管上,使用的是AT89系列單片機做處理器,模數轉換芯片采用AD0809
- * 芯片。(該程序運用在大多模擬量采集轉數字的傳感器)
- ******************************************************************/
- #include <reg52.h> //頭文件
- #define uchar unsigned char //宏定義無符號字符型
- #define uint unsigned int //宏定義無符號整型
- code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示段碼 數碼管字跟
- uchar wei[4]={0XEf,0XDf,0XBf,0X7f}; //位控制碼
- sbit ST=P3^0; //A/D啟動轉換信號
- sbit OE=P3^1; //數據輸出允許信號
- sbit EOC=P3^2; //A/D轉換結束信號
- sbit CLK=P3^3; //時鐘脈沖
- sbit Beep=P3^7; //蜂鳴器IO口
- uint z,x,c,v,AD0809, date; //定義數據類型(全局變量)
- /******************************************************************
- us延時函數,具體延時情況跟單片機選擇的晶振有關
- ******************************************************************/
- void delayus(uint i)
- {
- while(i--);
- }
- /******************************************************************
- ms延時函數,具體延時情況跟單片機選擇的晶振有關
- ******************************************************************/
- void delayms(uchar t)
- {
- uchar i,j;
- for(i=0;i<t;i++)
- {
- for(j=13;j>0;j--);
- { ;
- }
- }
- }
- /*************************************************************************
- 蜂鳴器報警函數
- **************************************************************************/
- void Subeep()
- {
- int i;
- for(i=0;i<10;i++)
- {
- Beep=~Beep; //蜂鳴器輸出
- delayus(12); //如要改變發聲改變延時即可
- }
- }
- /**********************************************************************
- 數碼管動態掃描
- *********************************************************************/
- void xianshi() //顯示函數
- {
- uint z,x,c,v;
- z=date/1000; //求百分數十位
- x=date%1000/100; //求百分數的個位
- c=date%100/10; //求百分數小數點后一位
- v=date%10; //求百分數小數點的后兩位
- if(z>5) //如果煙霧濃度大于50%蜂鳴器發出報警聲
- {
- Subeep(); //調用蜂鳴器報警函數
- }
-
- if(z==10) //判斷z的值是否是10
- {
- z=9; //z賦值9
- x=9; //x賦值9
- c=9; //c賦值9
- v=9; //v賦值9
- }
- P2=0XFF; //P2IO初始化
- P0=seg7code[z]; //百分數十位賦值給數碼管斷碼
- P2=wei[0]; //選擇百分數十位顯示
- delayms(3); //顯示3ms
- P2=0XFF; //消影
- P0=seg7code[x]&0x7f; //百分數個位賦值給數碼管斷碼和小數點斷碼
- P2=wei[1]; //選擇百分數個位顯示
- delayms(3); //顯示3ms
- P2=0XFF; //消影
- P0=seg7code[c]; //百分數小數點后一位賦值給數碼管斷碼
- P2=wei[2]; //選擇百分數小數點后兩位顯示
- delayms(3); //顯示3ms
- P2=0XFF; //消影
- P0=seg7code[v]; //百分數小數點后兩位賦值給數碼管斷碼
- P2=wei[3]; //選擇百分數小數點后兩位顯示
- delayms(4); //顯示3ms
- P2=0XFF; //消影
- }
- /*************************************************************************
- CLK振蕩信號
- **************************************************************************/
- void timer0( ) interrupt 1 //定時器0工作方式1
- {
- TH0=(65536-2)/256; //重裝計數初值
- TL0=(65536-2)%256; //重裝計數初值
- CLK=!CLK; //取反
- }
- /*************************************************************************
- 主函數
- **************************************************************************/
- void main()
- {
- TMOD=0X01; //定時器中斷0
- CLK=0; //脈沖信號初始值為0
- TH0=(65536-2)/256; //定時時間高八位初值
- TL0=(65536-2)%256; //定時時間低八位初值
- EA=1; //開CPU中斷
- ET0=1; //開T/C0中斷
- TR0=1;
- while(1) //無限循環
- {
- ST=0; //使采集信號為低
- ST=1; //開始數據轉換
- ST=0; //停止數據轉換
- while(!EOC); //等待數據轉換完畢
- OE=1; //允許數據輸出信號
- AD0809=P1; //讀取數據
- OE=0; //關閉數據輸出允許信號
- if(AD0809>=251) //電壓顯示不能超過5V
- AD0809=250;
- date=AD0809*40; //數碼管顯示的數據值,其中40為采集數據的毫安值
- xianshi(); //數碼管顯示函數
- }
- }
復制代碼
0.png (47.67 KB, 下載次數: 48)
下載附件
2018-11-5 18:03 上傳
所有資料51hei提供下載:
基于51單片機的煙霧傳感器的檢測.zip
(462.62 KB, 下載次數: 65)
2018-11-5 16:01 上傳
點擊文件名下載附件
內涵源碼、仿真電路、數據手冊 下載積分: 黑幣 -5
|