STC 12C5A60S2单片机内部A/D转换程序
时间:10-02
整理:3721RD
点击:
这是STC给的一个例子,该如何读通道一的数据我打算去测一个24V电压。
#include "stc12c5a60s2.h"
#include "intrins.h"
#define FOSC 18432000L
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
/********************************************************************
初始化设置
*********************************************************************/
sfr ADC_CONTR = 0xBC; //ADC 控制寄存器
sfr ADC_RES = 0xBD; //ADC 转换结果寄存器
sfr ADC_LOW2 = 0xBE; //ADC 低2位结果寄存器
sfr P1ASF = 0x9D; //Pl口模拟功能控制寄存器
/********************************************************************
ADC 数据转换函数
*********************************************************************/
#define ADC_POWER 0x80 //ADC 电源控制位
#define ADC_FLAG 0x10 //ADC 转换结束标志位
#define ADC_START 0x08 //ADC 开始转换控制位
#define ADC_SPEEDLL 0x00 //420 个时钟周期转换一次
#define ADC_SPEEDL 0x20 //280 个时钟周期转换一次
#define ADC_SPEEDH 0x40 //140 个时钟周期转换一次
#define ADC_SPEEDHH 0x60 //70 个时钟周期转换一次
/********************************************************************
延时函数
*********************************************************************/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
/********************************************************************
串口初始化
*********************************************************************/
void InitUart()
{
SCON = 0x50;
TMOD = 0x20;
TH1 = TL1 = 0xfd;
TR1 = 1;
}
/********************************************************************
串口数据输出函数
*********************************************************************/
void SendData(BYTE dat)
{
while (!TI); //等待数据
TI = 0; //清零标志位
SBUF = dat; //发送数据
}
/********************************************************************
ADC 初始化
*********************************************************************/
void InitADC()
{
P1ASF = 0xff; //设置P1口为开漏模式,使用AD功能
ADC_RES = 0; //AD数据寄存器清空
ADC_CONTR = ADC_POWER | ADC_SPEEDLL; //打开AD电源,转换周期420
Delay(2); //延时
}
/********************************************************************
ADC 数据转换函数
*********************************************************************/
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//开始转换
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
ADC_CONTR &= ~ADC_FLAG; //关闭AD转换
return ADC_RES; //返回数据
}
/********************************************************************
编辑数据函数
*********************************************************************/
void ShowResult(BYTE ch)
{
SendData(ch); //发送显示通道
SendData(GetADCResult(ch)); //发送对应通道的数据
// SendData(ADC_LOW2); //如果你想显示10位结果,选择下一行
}
/********************************************************************
主函数
*********************************************************************/
void main()
{
InitUart(); //串口初始化
InitADC(); //AD转换初始化
while (1)
{
ShowResult(0); //显示第一通道的数值
ShowResult(1); //显示第二通道的数值
}
}
#include "stc12c5a60s2.h"
#include "intrins.h"
#define FOSC 18432000L
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
/********************************************************************
初始化设置
*********************************************************************/
sfr ADC_CONTR = 0xBC; //ADC 控制寄存器
sfr ADC_RES = 0xBD; //ADC 转换结果寄存器
sfr ADC_LOW2 = 0xBE; //ADC 低2位结果寄存器
sfr P1ASF = 0x9D; //Pl口模拟功能控制寄存器
/********************************************************************
ADC 数据转换函数
*********************************************************************/
#define ADC_POWER 0x80 //ADC 电源控制位
#define ADC_FLAG 0x10 //ADC 转换结束标志位
#define ADC_START 0x08 //ADC 开始转换控制位
#define ADC_SPEEDLL 0x00 //420 个时钟周期转换一次
#define ADC_SPEEDL 0x20 //280 个时钟周期转换一次
#define ADC_SPEEDH 0x40 //140 个时钟周期转换一次
#define ADC_SPEEDHH 0x60 //70 个时钟周期转换一次
/********************************************************************
延时函数
*********************************************************************/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
/********************************************************************
串口初始化
*********************************************************************/
void InitUart()
{
SCON = 0x50;
TMOD = 0x20;
TH1 = TL1 = 0xfd;
TR1 = 1;
}
/********************************************************************
串口数据输出函数
*********************************************************************/
void SendData(BYTE dat)
{
while (!TI); //等待数据
TI = 0; //清零标志位
SBUF = dat; //发送数据
}
/********************************************************************
ADC 初始化
*********************************************************************/
void InitADC()
{
P1ASF = 0xff; //设置P1口为开漏模式,使用AD功能
ADC_RES = 0; //AD数据寄存器清空
ADC_CONTR = ADC_POWER | ADC_SPEEDLL; //打开AD电源,转换周期420
Delay(2); //延时
}
/********************************************************************
ADC 数据转换函数
*********************************************************************/
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//开始转换
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
ADC_CONTR &= ~ADC_FLAG; //关闭AD转换
return ADC_RES; //返回数据
}
/********************************************************************
编辑数据函数
*********************************************************************/
void ShowResult(BYTE ch)
{
SendData(ch); //发送显示通道
SendData(GetADCResult(ch)); //发送对应通道的数据
// SendData(ADC_LOW2); //如果你想显示10位结果,选择下一行
}
/********************************************************************
主函数
*********************************************************************/
void main()
{
InitUart(); //串口初始化
InitADC(); //AD转换初始化
while (1)
{
ShowResult(0); //显示第一通道的数值
ShowResult(1); //显示第二通道的数值
}
}
这就是通道一的数据啊
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//开始转换
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
ADC_CONTR &= ~ADC_FLAG; //关闭AD转换
return ADC_RES; //返回数据
}
我定义个变量 uint vin; vin=BYTE GetADCResult(0); 用keli 编译不对