❶ 求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); //適當延時後再進行下一循環
}
}
❷ STC單片機 ADC按鍵 求助!!
while(1)
{
adz1= GetADCResult(0);
if(adz1<238)break; //有按來鍵按下
}
adbz=0;
for(adjs1=0;adjs1<20;adjs1++) //連續源採集20次AD值,求出平均值作為判斷的依據
{
Delay1();
ad0=GetADCResult(0);
if((adz1>ad0-5)&&(adz1<ad0+5))
{
adz1=ad0;
adbz++;
}
}
if((adbz>5)&&(adz1<30))LED0=~LED0;
if((adbz>5)&&(adz1>=30)&&(adz1<60))LED1=~LED1;
........