『壹』 求STC12C5204單片機AD功能如何使用,例如,用其中一個I/O做為AD采樣一個2V左右的電壓,並通過數碼管顯示
//本程序主要演示了
//1、12864液晶的編程與使用,包括顯示定位、4位整數、顯示浮點數等
//2、STC12C5A32S2單片機的ADC 采樣功能(以第0、1通道為例)
//
//註:本示例僅僅演示如何進行ADC 和顯示,每ADC 一次就顯示一次,實際應用時,
//應多次ADC 並進行相應處理,比如取平均值後,才能得到比較穩定的AD 值
//廣西民族大學物電學院李映超2010.5.26
/* 板子的硬體連接
1、1602液晶顯示模塊的連接:RS:P2.4、EN:P2.5、數據口: P0
2、蜂鳴器:P2.3 低電平有效(發出聲音)
3、繼電器:P2.2 低電平有效(繼電器吸合、兩輸出腳短路)
4、18B20數據輸出腳(DQ):P2.1
5、紅外遙控輸出腳:P2.0
6、直流電壓精密可調電阻輸出:P1.0 可通過跳線帽斷開
7、光敏電阻:P1.1 可通過跳線帽斷開
8、按鍵:均通過二極體連接到P3.2(外部中斷0口),低電平有效,下降沿觸發
K0:P3.3、K1:P3.4、K2:P3.5、K3:
P3.6、K4:P3.7
9、24C02連接:
SDA:P2.7 (上拉有發光二極體,低電平亮)
SCL:P2.6 (上拉有發光二極體,低電平亮)
*/
#include <reg52.h>
#include<intrins.h>
#include<lcd12864s.h>
#define uint unsigned int
#define uchar unsigned char
sbit light=P2^7;//定義工作指示燈與單片機的連接腳
//---------與STC12C5A32S2單片機ADC 相關的寄存器聲明------------------
sfr P1ASF =0x9d; //P1口模數轉換功能控制寄存器
sfr ADC_CONTR =0xbc; //AD 轉換控制寄存器
sfr ADC_RES =0xbd; //AD 轉換結果寄存器高
sfr ADC_RESL =0xbe; //AD 轉換結果寄存器低
sfr AURX1 =0xa2; //AD 轉換結果存儲方式控制位
//------------------------------------------------------------------
//P1ASF 寄存器:8位,對應P1口8根口線,用於指定哪根口線用作ADC 功能
//哪個口用作ADC 就應置相應的位為「1」,注意:不能位定址
//------------------------------------------------------------------
#define ADC_POWER 0x80 //ADC 電源開
#define ADC_SPEED 0x60 //設為90個時鍾周期ADC 一次
#define ADC_START 0x08 //ADC 啟動控制位設為開
#define ADC_FLAG 0x10 //ADC 結束標志位
/*
ADC_CTRL 寄存器:
ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_STAR CHS2 CHS1 CHS0
1 2 3 4 5 6 7 8
第1 位: =1 打開ADC 電源;=0 關閉ADC 電源; ADC 前要一定要打開
第2-3位: =1 1 90個時鍾周期ADC 一次; =1 0 180個時鍾周期ADC 一次;
=0 1 360個時鍾周期ADC 一次; =0 0 540個時鍾周期ADC 一次;
第4位: ADC 結束標志位,每次ADC 結束時自動=1,需要用軟體清零才可以進行下一次ADC
第5位: ADC 啟動控制位,置「1」則ADC 轉換開始,轉換結束後為0
第6-7-8位:ADC 通道選擇000-->P1.0 ........111-->P1.7
*/
//-------------------------------------------------------------
void ADC_int(uchar n) //第n 通道ADC 初始化函數
{
n&=0x07; //確保n=0----7通道
AURX1|=0x04; //轉換結果存儲格式:數據的高2位放ADC_RES,低8位放ADC_RESL
P1ASF=1<<n; //將P1.n 設為ADC 采樣功能
}
//---------------------------------------------------------------
uint ADC_GET(unsigned char n) //第n 通道ADC 采樣函數
{
unsigned int adc_data;
n&=0x07; //確保n=0----7通道
ADC_RES=0; //清零
ADC_RESL=0; //清零
ADC_CONTR=0; //清零,以便重構
ADC_CONTR|=(ADC_POWER|ADC_SPEED|n|ADC_START); //打開AD 轉換電源,設定轉換速度、設定通道號、AD 轉換開始
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //延時4個時鍾周期左右
while(!(ADC_CONTR&ADC_FLAG)); //等待轉換結束=0x10 ADC_FLAG 位=1
adc_data=(ADC_RES&0x03)*256+ADC_RESL; //轉換結果計算,取高位結果存儲器的低2位+ 低位結果存儲器
ADC_CONTR&=~ADC_FLAG;//清零轉換結束標志位(ADC_FLAG 位=0)
return adc_data; //返回ADC 的值(0----1023)
}
void lcd_4_char(unsigned int data_4_char) //在1602LCD 上顯示一個4位的整數
{
unsigned char lcd_table[4];
lcd_table[0]=data_4_char/1000; //獲得千位的數字
lcd_table[1]=data_4_char%1000/100; //獲得百位的數字
lcd_table[2]=data_4_char%100/10; //獲得十位的數字
lcd_table[3]=data_4_char%10; //獲得個位的數字
Lcd_WriteData(lcd_table[0]+0x30); //顯示千位
Lcd_WriteData(lcd_table[1]+0x30); //顯示百位
Lcd_WriteData(lcd_table[2]+0x30); //顯示十位
Lcd_WriteData(lcd_table[3]+0x30); //顯示個位
}
void main()
{ unsigned int ad_0,ad_1;
ad_0=0;
ad_1=0;
Lcd_Init(); //12864液晶模塊初始化
light=0;delayms(1000);light=1; //燈閃一下,表示上電准備工作
ADC_int(0); //ADC 通道0初始化
ADC_int(1); //ADC 通道1初始化
while(1)
{
ad_0=ADC_GET(0);//第0通道進行ADC 采樣
ad_1=ADC_GET(1);
hanzi_disp(0,1,"單片機轉換");
hanzi_disp(1,0,"通道0:");
lcd_4_char(ad_0);
//while(1){;};
//delay_ms(30000);
hanzi_disp(2,0,"通道1:");
lcd_4_char(ad_1);
hanzi_disp(3,1,"--------");
//delayms(1000); //適當延時後再進行下一循環
}
}
『貳』 STC12LE5204AD(3.3V單片機)——AD的參考電壓是多少,是3.3V嗎
STC12C5204AD 與 STC12LE5204AD 只是電源電源 不同,基本功能是一樣的
用 AD 功能 其測量基準都為電源電壓,測量最大值也是 電源電壓。
如果 同時檢測 3 V 電壓 得到的數值 5V單片機 為 135.6 ,3V單片機 為 256
如果 電源 3.3V 則為 232.7,其結果應該是 (256/VCC)*被檢測電壓
256 是 8位AD, 如果10位AD 為1024, 12位AD 為4096