C8051F320內(nèi)部有一個(gè)10位逐次逼近型ADC,可以工作在單端方式或者差分方式。
完整例程下載地址:http://www.denmoz.com/f/c8051sad.rar
#include "c8051f3xx.h"
#include "12864.h"
#define uint unsigned int
sfr16 TMR2 = 0xcc; // Timer2 counter定時(shí)器2計(jì)數(shù)器
uchar adnum3,adnum2,adnum1; //打算用來(lái)顯示的數(shù)百位、十位和個(gè)位,在這里沒(méi)有進(jìn)行運(yùn)算,只是直接的AD結(jié)果
sbit led0=P0^5; //連了個(gè)發(fā)光二極管觀察有沒(méi)有死機(jī)。。
uchar code table[]="0123456789"; //顯示數(shù)據(jù)用
uchar code hang1[17]="1234567"; //以下四行為12864初始顯示的內(nèi)容,不重要
uchar code hang2[17]="123456789 ";
uchar code hang3[17]="2011-7-10 星期日";
uchar code hang4[17]=" 00:00:00 ";
void Timer2_ISR (void) interrupt 5 // T2只是用來(lái)溢出的,沒(méi)程序,清標(biāo)志位而已
{
TF2H = 0;
}
void Adc_ConvComplete_ISR (void) interrupt 10 //AD中斷程序,除了清標(biāo)志位,只是把數(shù)據(jù)送到12864第三行
{
AD0INT = 0;
lcd_pos(3,0);
adnum3 = ADC0H/100;
adnum2 = (ADC0H%100)/10;
adnum1 = (ADC0H%100)%10;
disp_only(tableaa[adnum3]);
disp_only(tableaa[adnum2]);
disp_only(tableaa[adnum1]);
}
void Port_Init (void) //端口初始化,哪個(gè)位要輸入,就要設(shè)為模擬,并跳過(guò)
{
P1MDIN = 0x7F;
P0MDIN = 0xff;
P2MDIN = 0xff;
P3MDIN = 0x00;
P0MDOUT |= 0xfF;
P1MDOUT |= 0x0F;
P2MDOUT |= 0x0C;
P1SKIP = 0x80;
P0SKIP = 0x00;
P2SKIP = 0x00;
XBR0 = 0x00;
XBR1 = 0x40;
}
void Timer_Init (void)
{
TMR2CN = 0x00;
CKCON &= ~0xF0;
TMR2RL = 0;
TMR2 = 0xffff;
ET2 = 1;
TR2 = 1;
}
void ADC0_Init (void)
{
REF0CN = 0x0E; // VDD作為基準(zhǔn)電壓,啟用內(nèi)部溫度傳感器
AMX0P = 0x10; // 10是P3.0,試過(guò)07(1.7)和1E(溫度),都沒(méi)問(wèn)題
ADC0CF = 0xFC; // 11111,32分頻? (*表示分頻數(shù)-1=31) D2為1,左對(duì)齊
AMX0N = 0x1F; // 單端方式
ADC0CN = 0xC2; // T2溢出作為啟動(dòng)信號(hào)
EIE1 |= 0x08; // 開(kāi)中斷
}
void System_Init (void)
{
PCA0MD &= ~0x40;
OSCICN |= 0x03;
Port_Init ();
Timer_Init ();
ADC0_Init ();
}
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=120;i>0;i--);
}
}
void main(void)
{
System_Init ();
lcd_init();
clr_screen();
DelayMS(100);
lcd_pos(0,0);
disp_chinese(hang1);
lcd_pos(1,0);
disp_chinese(hang2);
lcd_pos(2,0);
disp_chinese(hang3);
lcd_pos(3,0);
disp_chinese(hang4);
EA = 1;
while (1)
{
led0=~led0;
DelayMS(5500);
}
}
測(cè)試結(jié)果:
1、用開(kāi)發(fā)板上的電位器,可以讓高位結(jié)果在0~255之間變化
2、用溫度傳感器,室溫下顯示高位為65,*近筆記本風(fēng)扇數(shù)秒后變成66,說(shuō)明溫度有變化,因?yàn)槭歉呶唬幻黠@,也沒(méi)計(jì)算。
3、用全新的南孚電池一節(jié),顯示穩(wěn)定的121。
____________________________________________________________________________
一、修改程序,將10位數(shù)字量轉(zhuǎn)換成0~1023顯示在屏幕上
*用變位器,可以實(shí)現(xiàn)1~1023的變化,1和0之間無(wú)法穩(wěn)定,直接接地也無(wú)法顯示0
*用一節(jié)全新電池,顯示485,VDD為3V,偏差不大。
二、再修改程序,將正輸入設(shè)為溫度傳感器
*顯示263,稍微加熱后變成265,仍然覺(jué)得不夠明顯
*263對(duì)應(yīng)電壓約770mv,根據(jù)公式換算溫度是負(fù)數(shù)。。。。
在筆記本散熱口放了一會(huì)升到268,還是低!
