stc12C5A60S2内部AD应用.docx
- 文档编号:3114532
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:15
- 大小:27.49KB
stc12C5A60S2内部AD应用.docx
《stc12C5A60S2内部AD应用.docx》由会员分享,可在线阅读,更多相关《stc12C5A60S2内部AD应用.docx(15页珍藏版)》请在冰豆网上搜索。
stc12C5A60S2内部AD应用
系统说明:
本人想用STC12C5A60S2自带的A/D对电源电压进行检测(暂定3.3V),晶振:
12M,电压从P1.0口输入,检测后的电压值在1602上进行显示,附上硬件大致原理图,硬件部分是照STC12C5A60S2芯片资料上设计,大家看看有错没?
硬件原理简图(原文件名:
clip_image001.gif)
程序的A/D部分也是从官网资料上搬下来的,只自己稍微改了一下对读取到的A/D转换结果的数据处理,液晶部分是前阵子写的搬过来的。
大家帮我看看哪出问题了?
程序如下:
#include
#include"intrins.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharVo; //A/D转换后换算的电压值
/*DeclareSFRassociatedwiththeADC*/
sfrADC_CONTR = 0xBC; //ADCcontrolregister
sfrADC_RES = 0xBD; //ADChigh8-bitresultregister
sfrADC_RESL = 0xBE;
//sfrADC_LOW2 = 0xBE; //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,
_nop_(); //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器
_nop_();
_nop_();
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;
DelayMS
(1);
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;
EN=1;
DelayMS
(1);
EN=0;
}
voidWrite_LCD_Command(ucharcmd) //写命令
{
LCD_Busy_Wait();
RS=0;
RW=0;
EN=0;
P2=cmd;
EN=1;
DelayMS
(1);
EN=0;
}
voidInit_LCD() //1602 初始化
{
Write_LCD_Command(0x38);
DelayMS
(1);
Write_LCD_Command(0x01); //清屏
DelayMS
(1);
Write_LCD_Command(0x06); //
DelayMS
(1);
Write_LCD_Command(0x0c);
DelayMS
(1);
}
voidSet_LCD_POS(ucharp)
{
Write_LCD_Command(p|0x80);
}
voidDisplay_LCD_String(ucharp,uchar*s)//1602显示
{
uchari;
Set_LCD_POS(p);
for(i=0;i<16;i++)
{
Write_LCD_Data(s);
DelayMS
(1);
}
}
voidFormat_DateTime(uchard,uchar*a)
{
a[0]=d/10+'0';
a[1]=d%10+'0';
}
//写入液晶第二行
voiddisplay(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10+'0';
ge=date%10+'0';
Write_LCD_Command(0x80+0x40+add);
Write_LCD_Data(shi);
Write_LCD_Data(ge);
}
//写入液晶第一行
voiddisplay1(ucharadd,uchardate)
{
ucharshi,ge;
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采
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stc12C5A60S2 内部 AD 应用