我是一个自学stc单片机的一开始使用的at公司的89s51后来发现资源可以用的太少了。就开始接触stc的找了一个名气最大的STC12C5A60S串口什么的都一个个被我攻克了。现在遇到一个最大的问题。就是芯片原带的ad转换功能,我几乎是把官网的源代码一个字一个字的抄下了的,结果通过串口输出,但是就是数据不正常。我在要测试的接口上接上电位器,可是结果要么就是最大也就是ff,要么就是最小00我来回检查还几遍也不知道哪里出了问题求高手解决这到底是怎么回事,(注意我主要使用P17口。其他都是悬空的)这是代码
#include<reg51.h>
#include<intrins.h>
#define FOSC 18432000L //
#define BAUD 9600 //
typedef unsigned char BYTE;//
typedef unsigned int WORD; //
sfr ADC_CONTR=0xBC;//定义ad转换电源,周期,标致,开启,转换口,数据存储位置
sfr ADC_RES=0xBD; // 定义转换完毕数据高高八位数据位置
sfr ADC_LOW2=0xBE; //定义转换完毕的低八位数据存放位置
sfr PIASF=0x9D; //定义ad转换的总开关位置
#define ADC_POWER 0X80 //
#define ADC_FLAG 0X10 //
#define ADC_START 0X08 //
#define ADC_SPEEDLL 0X00 //主要用来设置转换周期540周期
#define ADC_SEEDL 0X20 // 360周期
#define ADC_SEEDH 0X40 // 180周期
#define ADC_SPEEDHH 0X60 // 90个周期
void InitUart(); //这个函数主要是用来设置串口的
void Delay(WORD n); //这个函数用来延时使用
void SendData(BYTE dat); //这个函数主要用来把就收到的数据通过串口发送出去
void InitADC(); // 这个函数为了设置ad转换 电源,周期,标致,开启喂,io等设置
BYTE ch=0; //ch主要是为了用于控制那个ad选为下一个转换口
void Delay900ms();
void main() // 主函数开始
{
InitUart(); // 设置串口函数
InitADC(); // 开始转换函数 .ad转换使用的是中断方式。所以还有一个中断处理函数
IE=0XA0;
//
while(1)
;
}
void adc_isr() interrupt 5 using 1 //stc12ad转换中断例程
{
ADC_CONTR&=!ADC_FLAG;//将ad转换完成标志致0. 此位与11101111相与得到的结果会是除了第4位是0其他为让保持原来的数据
P2=~P2;
P0=~P0;
SendData(ch); //将正在转换的ad输入口的名字牌号通过串口输出
SendData(ADC_RES); // 将数据高八位输出通过串口
SendData(ADC_LOW2); //将数据的低8位通过串口输出
ch++;
if(ch>8)
ch=0; //将开启下一个ad转换口
Delay900ms(); //降低转换速度延迟函数
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //将最高位的ad转换电源打开。设置波特率,开启转换,设置转换口
}
//=================================================
void InitADC()
{
PIASF=0XFF; //把p1口全部设为ad转换
ADC_RES=0; //把以前的转换结果清零
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //将最高位的ad转换电源打开。设置波特率,开启转换,设置转换口
Delay(2); //适当的延时
}
//========================================================
void InitUart() //初始化函数串口
{
SCON=0X5A;
TMOD=0X20;
TH1=TL1=0XFD;
TR1=1;
}
//===========================================
void SendData(BYTE dat)//通过串口把测量的数据发送出去
{
while(!TI);
TI=0;
SBUF=dat;
}
//====================================================
void Delay(WORD n)//延时函数
{
WORD x;
while(n--)
{
x=5000;
while(x--);
}
}
//==========================================
void Delay900ms() //@11.0592MHz //这个函数我自己用来降低转换速度的因为ad转换太快了为了观察方便我这个降低速度。大概一秒转换一个ad口。
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
|