stc12C5A60S2内部AD应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

系统说明:本人想用STC12C5A60S2自带的A/D对电源电压进行检测(暂定3.3V),晶振:12M,电压从P1.0口输入,检测后的电压值在1602上进行显示,附上硬件大致原理图,硬件部分是照STC12C5A60S2芯片资料上设计,大家看看有错没?

硬件原理简图(原文件名:clip_image001.gif)

程序的A/D部分也是从官网资料上搬下来的,只自己稍微改了一下对读取到的A/D转换结果的数据处理,液晶部分是前阵子写的搬过来的。大家帮我看看哪出问题了?

程序如下:

#include

#include "intrins.h"

#define uchar unsigned char

#define uint unsigned int

uchar Vo; //A/D转换后换算的电压值

/*Declare SFR associated with the ADC */

sfr ADC_CONTR = 0xBC; //ADC control register

sfr ADC_RES = 0xBD; //ADC high 8-bit result register

sfr ADC_RESL = 0xBE;

//sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register

sfr P1ASF = 0x9D; //P1 secondary function control register

/*Define ADC operation const for ADC_CONTR*/

#define ADC_POWER 0x80 //ADC power control bit

#define ADC_FLAG 0x10 //ADC complete flag 模数转换结束标志位

#define ADC_START 0x08 //ADC start control bit 模数转换启动控制位

//转换速度控制位SPEED0和SPEED1,共四种状态,对应四种转换速度

#define ADC_SPEEDLL 0x00 //540 clocks

#define ADC_SPEEDL 0x20 //360 clocks

#define ADC_SPEEDH 0x40 //180 clocks

#define ADC_SPEEDHH 0x60 //90 clocks

uchar tCount;

sbit RS = P0^4;

sbit RW = P0^5;

sbit EN = P0^6;

void DelayMS(uint ms)

{

uint i;

while(ms--)

{

for(i=0;i<120;i++);

}

}

/*----------------------------

Software delay function

----------------------------*/

void Delay(uint n)

{

uint x;

while (n--)

{

x = 5000;

while (x--);

}

}

/*----------------------------

Initial ADC sfr

----------------------------*/

void InitADC()

{

P1ASF = 0x01; //选择P1.0作为A/D输入通道

ADC_RES = 0; //清0

ADC_CONTR = ADC_POWER | ADC_SPEEDLL; //0x10|0x00=0x10:开电源和设置A/D转换速度

Delay(2); //ADC power-on and delay

}

/*----------------------------

Get ADC result

----------------------------*/

uchar GetADCResult(uchar ch)

{

ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//0x00|0x00|ch|0x08:选择A/D输入通道,开始A/D转换

_nop_(); //Must wait before inquiry ,

_nop_(); //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器

_nop_();

_nop_();

while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag

ADC_CONTR &= ~ADC_FLAG; //Close ADC

Vo=ADC_RES*5*10/256; //Return ADC result(为显示整数,这里将电压值扩大了十倍)

return Vo;

}

uchar Read_LCD_State()

{

uchar state;

RS=0;

RW=1;

EN=1;

DelayMS(1);

state=P2;

EN = 0;

DelayMS(1);

return state;

}

void LCD_Busy_Wait()

{

while((Read_LCD_State()&0x80)==0x80);

DelayMS(5);

}

void Write_LCD_Data(uchar dat) //写数据到1602

{

LCD_Busy_Wait();

RS=1;

RW=0;

EN=0;

相关文档
最新文档