帮忙看下12C5A60S2单片机AD转换程序有没有错误?
#include "reg51.h"#include "intrins.h"
#include "math.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
/*Declare SFR associated with the ADC */
sfr ADC_CONTR = 0xBC; //ADC control register
//ADC_POWER | SPEED1 | SPEED0 | ADC_FLAG | ADC_START | CHS2 | CHS1 | CHS0
sfr ADC_RES = 0xBD; //ADC hight 8-bit result register
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
sfr P1ASF = 0x9D; //P1 secondary function control register
sfr AUXR1 = 0XA2;
/*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
#define ADC_SPEEDLL 0x00 //540 clocks
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define ADC_SPEEDHH 0x60 //90 clocks
extern void Init_ST7920(); //液晶屏初始化
extern void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s);
extern void Write_Cmd(unsigned char Cmd);
extern void Write_Data(unsigned char Data);
unsigned char code Tab_LCD[]={0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39};
void Delay(WORD n);
void InitADC();
BYTE ch = 0; //ADC channel NO.
WORD Data;
WORD V_Data;
BYTE num=0;
bit flag=0;
unsigned char code Tab_BiaoTi[]={"12C5A60S2_A/D"};
unsigned char code Tab_Bit[]={"8bit_A/D:"};
unsigned char Tab_Count_Data[]={0,0,0,0};
extern void DelayMs(unsigned char t);
extern void LED_ScanDisplay(char Num);
extern void Count_Data(unsigned int Data);
/*----------------------------
Initial ADC sfr
----------------------------*/
void InitADC( )
{
P1ASF = 0xff; //SetP10 as analog input port
ADC_RES = 0; //Clear previous result
// ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
// Delay(2); //ADC power-on delay and Start A/D conversion
}
void LCD_Update_Screen()
{
Write_Cmd(0x8b);
Write_Data(Tab_LCD]);
Write_Data(Tab_LCD]);
Write_Data(Tab_LCD]);
Write_Data(Tab_LCD]);
DelayMs(5);
}
void Init_LCD_Screen()
{
LCD_PutString(0,1,Tab_BiaoTi);
LCD_PutString(0,2,Tab_Bit);
// LCD_Update_Screen();
}
void Count_Data(unsigned int Data)
{
Tab_Count_Data=Data/1000;
Tab_Count_Data=Data%1000/100;
Tab_Count_Data=Data%1000%100/10;
Tab_Count_Data=Data%10;
}
void main()
{
Init_ST7920(); //液晶屏初始化
Init_LCD_Screen();
InitADC();//Init ADC sfr
while (1)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2); //ADC power-on delay and Start A/D conversion
while(!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &= !ADC_FLAG;
Data=ADC_RES;
ADC_RES=0;
V_Data=Data*5/256;
Count_Data(V_Data);
LCD_Update_Screen();
}
}
/*----------------------------
Software delay function
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
} 大循环里面主要就是打开电源,启动AD转换,然后再判断转换标志位。转换成功后清除标志位。读ADC_RES的值,经过公式转换后,数值送给液晶屏显示。AD输入接电位器,旋转电位器,液晶屏个位只会显示0到1,其它位显示0 本帖最后由 xpxp 于 2013-7-30 18:01 编辑
不懂看程序。以下是我用在STC15F204EA上的AD读取函数:
uint GetADCResult(void)
{
uint AD_result;
ADC_CONTR=0xC1; //开AD电源,设置转换周期为180个时钟,设置P11为ADC通道
ADC_RES=0x00; //高8位清零
ADC_RESL=0x00; //低2位清零
_nop_(); //Must wait before inquiry
_nop_();
_nop_();
_nop_();
ADC_CONTR|=0x9; //启动AD转换
while ((0x10&ADC_CONTR)!=0x10);//等待转换完成
AD_result=(ADC_RES<<2)|(ADC_RESL&0x03);
ADC_CONTR&=0xE7; //清零ADC_FLAG标志位
return AD_result; //Return ADC result 10bit
}
补充,主程序中有这样的设置:
P1M0=0x2,P1M1=0x2; //设置P1口的P11为开漏,其余为默认 楼上一看就是高手! xpxp 发表于 2013-7-30 17:43 static/image/common/back.gif
不懂看程序。以下是我用在STC15F204EA上的AD读取函数:
uint GetADCResult(void)
{
我程序跟你这个差不多啊,虽然不是同样的MCU,有点区别。 端口要设置一下。
/******************************************************************************************
** 函数名称: Init_IO
** 函数描述: 初始化IO
** 输入参数: 无
** 输出参数: 无 //P20-27,P30-37,P00-03,P10-P17,
*******************************************************************************************/
void InitIo(void)
{
P4M1 = 0x00;
P4M0 = 0xff; //设置为输出口
P4 = 0;
P3M1 = 0x00;
P3M0 = 0xff; //p3.7,p3.6,p3.1,p3.0为输入口,其它设置为输出口
P3 = 0X03; //
P2M1 = 0x0; //p2口全部设置为输出口
P2M0 = 0xff; //p2口全部设置为输出口
P2 = 0Xff,
P1M1 = 0x27; //p1.3为输入口,p1.0 p1.1,P1.2,p1.5为ADC输入口
P1M0 = 0xe7; //p1.6-P1.7设置为输出口
P1 = 0x3f ;
P0M1 = 0; //p0.0-p0.7设置为输出口
P0M0 = 0Xff; //p0.0-p0.7设置为输出口
P0= 0X0c;
return;
}
GUOHUDONG 发表于 2013-7-30 21:42 static/image/common/back.gif
端口要设置一下。
/********************************************************************************** ...
谢谢哈,基本搞定了 想说的,是下载的工具有例子,可以参考 devcang 发表于 2013-7-31 08:26 static/image/common/back.gif
想说的,是下载的工具有例子,可以参考
{:handshake:} 谢谢,已搞定 我最近也在学这款单片机的AD装换,在这里受教了!
页:
[1]