|
這是前幾天做的一個基于51單片機的一個煙霧報警系統(tǒng),采用有ADC功能的STC12C5A60S2單片機,通過MQ-2煙霧模塊檢測,溫度傳感器DS18B20檢測溫度,通過LCD12864實時顯示濃度和溫度,可以調節(jié)濃度值,并且有聲光報警功能。附件中是原理圖以及ADC采集電壓源碼。
單片機源程序如下:
- //****************************************STC12C5A60S2 AD轉換***********************************************//
- #include <reg60.h>
- #include <intrins.h> //包含_nop_()函數(shù)定義的頭文件
- #include <stdio.h>
- //------------------------------------------------------------------------------
- void AD_init();
- void serial_init();
- void delay(unsigned int a);
- float AD_work(unsigned char channel);
- unsigned int AD_get(unsigned char channel);
- //------------------------------------------------------------------------------
- void main()
- {
- AD_init(); //A/D轉換初始化
- serial_init(); //串口初始化
- while(1)
- {
- // unsigned char i;
- // for(i=0;i<8;i++) //循環(huán)發(fā)送P1.0-P1.7的轉換數(shù)值
- // {
- // TI=1; //使用printf函數(shù)前須先將發(fā)送標志位TI置1
- // printf("The P1.%bd voltage is %f\n",i,AD_work(i));
- // TI=0;
- // delay(1000); //延時約1s
- // }
- TI=1; //使用printf函數(shù)前須先將發(fā)送標志位TI置1
- printf("The P1.%bd voltage is %f\n",7,AD_work(7));
- TI=0;
- delay(1000); //延時約1s
- }
- }
- //------------------------------------------------------------------------------
- unsigned int AD_get(unsigned char channel)
- {
- ADC_CONTR=0x88|channel; //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
- _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器
- while(!(ADC_CONTR&0x10)); //等待轉換完成
- ADC_CONTR&=0xe7; //關閉AD轉換,ADC_FLAG位由軟件清0
- return(ADC_RES*4+ADC_RESL); //返回AD轉換完成的10位數(shù)據(jù)(16進制)
- }
- //------------------------------------------------------------------------------
- float AD_work(unsigned char channel)
- {
- float AD_val; //定義處理后的數(shù)值AD_val為浮點數(shù)
- unsigned char i;
- for(i=0;i<100;i++)
- AD_val+=AD_get(channel); //轉換100次求平均值(提高精度)
- AD_val/=100;
- AD_val=(AD_val*5)/1024; //AD的參考電壓是單片機上的5v,所以乘5即為實際電壓值
- return AD_val;
- }
- //------------------------------------------------------------------------------
- void delay(unsigned int a) //延時約1ms
- {
- unsigned int i;
- while (--a!=0)
- for(i=600;i>0;i--); //1T單片機i=600,若是12T單片機i=125
- }
- //------------------------------------------------------------------------------
- void serial_init()
- {
- TMOD=0x20;
- TH1=0xfd;
- TL1=0xfd; //設置9600波特率
- SCON=0x50; //串口方式1,允許接收
- TR1=1;
- }
- //------------------------------------------------------------------------------
- void AD_init()
- {
- P1ASF=0xcf; //P1口全部作為模擬功能AD使用
- ADC_RES=0; //清零轉換結果寄存器高8位
- ADC_RESL=0; //清零轉換結果寄存器低2位
- ADC_CONTR=0x80;//開啟AD電源
- delay(2); //等待1ms,讓AD電源穩(wěn)定
- }
- /*程序編寫:落葉
- 2010.11.03*/
復制代碼
所有資料51hei提供下載:
BS.pdf
(366.43 KB, 下載次數(shù): 38)
2020-4-14 19:29 上傳
點擊文件名下載附件
原理圖 下載積分: 黑幣 -5
ADC源碼.rar
(37.21 KB, 下載次數(shù): 34)
2020-4-14 19:31 上傳
點擊文件名下載附件
STC12C5A60S2ADC采集電壓源碼 下載積分: 黑幣 -5
|
|