stc12C5A60S2内部AD应用Word格式.docx
《stc12C5A60S2内部AD应用Word格式.docx》由会员分享,可在线阅读,更多相关《stc12C5A60S2内部AD应用Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
/*DeclareSFRassociatedwiththeADC*/
sfrADC_CONTR
=
0xBC;
//ADCcontrolregister
sfrADC_RES
0xBD;
//ADChigh8-bitresultregister
sfrADC_RESL
=
0xBE;
//sfrADC_LOW2
//ADClow2-bitresultregister
sfrP1ASF
0x9D;
//P1secondaryfunctioncontrolregister
/*DefineADCoperationconstforADC_CONTR*/
#defineADC_POWER
0x80
//ADCpowercontrolbit
#defineADC_FLAG
0x10
//ADCcompleteflag
模数转换结束标志位
#defineADC_START
0x08
//ADCstartcontrolbit
模数转换启动控制位
//转换速度控制位SPEED0和SPEED1,共四种状态,对应四种转换速度
#defineADC_SPEEDLL0x00
//540clocks
#defineADC_SPEEDL
0x20
//360clocks
#defineADC_SPEEDH
0x40
//180clocks
#defineADC_SPEEDHH0x60
//90clocks
uchartCount;
sbitRS=P0^4;
sbitRW=P0^5;
sbitEN=P0^6;
voidDelayMS(uintms)
{
uinti;
while(ms--)
for(i=0;
i<
120;
i++);
}
/*----------------------------
Softwaredelayfunction
----------------------------*/
voidDelay(uintn)
uintx;
while(n--)
{
x=5000;
while(x--);
}
InitialADCsfr
voidInitADC()
P1ASF=0x01;
//选择P1.0作为A/D输入通道
ADC_RES=0;
//清0
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
//0x10|0x00=0x10:
开电源和设置A/D转换速度
Delay
(2);
//ADCpower-onanddelay
GetADCresult
ucharGetADCResult(ucharch)
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
//0x00|0x00|ch|0x08:
选择A/D输入通道,开始A/D转换
_nop_();
//Mustwaitbeforeinquiry,
//设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器
while(!
(ADC_CONTR&
ADC_FLAG));
//Waitcompleteflag
ADC_CONTR&
=~ADC_FLAG;
//CloseADC
Vo=ADC_RES*5*10/256;
//ReturnADCresult(为显示整数,这里将电压值扩大了十倍)
returnVo;
ucharRead_LCD_State()
ucharstate;
RS=0;
RW=1;
EN=1;
DelayMS
(1);
state=P2;
EN=0;
returnstate;
voidLCD_Busy_Wait()
while((Read_LCD_State()&
0x80)==0x80);
DelayMS(5);
voidWrite_LCD_Data(uchardat)
//写数据到1602
LCD_Busy_Wait();
RS=1;
RW=0;
EN=0;
P2=dat;
voidWrite_LCD_Command(ucharcmd)
//写命令
LCD_Busy_Wait();
P2=cmd;
voidInit_LCD()
//1602
初始化
Write_LCD_Command(0x38);
Write_LCD_Command(0x01);
//清屏
Write_LCD_Command(0x06);
//
Write_LCD_Command(0x0c);
voidSet_LCD_POS(ucharp)
Write_LCD_Command(p|0x80);
voidDisplay_LCD_String(ucharp,uchar*s)//1602显示
uchari;
Set_LCD_POS(p);
16;
i++)
Write_LCD_Data(s);
voidFormat_DateTime(uchard,uchar*a)
a[0]=d/10+'
0'
;
a[1]=d%10+'
//写入液晶第二行
voiddisplay(ucharadd,uchardate)
ucharshi,ge;
shi=date/10+'
ge=date%10+'
Write_LCD_Command(0x80+0x40+add);
Write_LCD_Data(shi);
Write_LCD_Data(ge);
//写入液晶第一行
voiddisplay1(ucharadd,uchardate)
shi=date/10;
ge=date%10;
Write_LCD_Command(0x80+add);
Write_LCD_Data(0x30+shi);
//0x30即48(十进制)对应的ASCAII码为字符‘0’
Write_LCD_Data(0x30+ge);
voidmain()
Init_LCD();
InitADC();
while
(1)
GetADCResult(0);
Display_LCD_String(0,"
dianya:
"
);
display1(7,Vo);
Display_LCD_String(9,"
V
DelayMS(1000);
程序二:
*文件名:
AD_CAIYANG.C
*功能:
使用AD采