STC系列单片机内部AD应用

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void main()
initiate_RS232();
P1 = P1 | 0x63; // 0110,0011,要设置为A/D转换地P1.x口,先设为高
P1_ADC_EN=0x63; //0110,0011, P1地P1.0,P1.1,P1.5,P1.6设置为A/D转换输入脚
//断开P1.0,P1.1,P1.5,P1.6内部上拉电阻
新建文件part3.4.5.c,程序代码如下:
#include <reg52.H>
#include <intrins.H>
//定义与ADC有关地特殊功能寄存器
sfr P1_ADC_EN=0x97; //A/D转换功能允许寄存器
sfr ADC_CONTR=0xC5; //A/D转换控制寄存器
sfr ADC_DATA=0xC6; //A/D转换结果寄存器
1
0
1
选择P1.5作为AD输入来用
1
1
0
选择P1.6作为AD输入来用
1
1
1
选择P1.7作为AD输入来用
ADC_DATA AD转换结果寄存器.模拟/数字转换结果计算公式如下:
结果=256XVin/Vcc
Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工 作电压作为模拟参考电压•
下面一个例程演示STC89LE516AD/X系列单片机地A/D转换功能•时钟11.0592MHz,转换结果以16进制形式输出到串行口,可以用串行口调试程 序观察输出结果.(本代码摘自宏晶科技芯片手册,经作者调试可正常运行).
}
}
void initiate_RS232(void)//串口初始化
{
ES= 0;//禁止串口中断
SCON=0x50;// 0101,0000 8位数据位,无奇偶校验
T2CON=0x34;// 0011,0100, 由T2作为波特率发生器
RCAP2H=0xFF;//时钟11.0592MHz,9600波特率
ADC_FLAG AD
CHS2 CHS1 CHS0
表2STC89系列单片机AD模拟通道选择设置
CHS2
CHS1
CHS0
模拟输入通道选择
0
0
0
选择P1.0作为AD输入来用
0
0
1
选择P1.1作为AD输入来用
0
1
0
选择P1.2作为AD输入来用
0
1
1
选择P1.3作为AD输入来用
1
0
0
选择P1.4作为AD输入来用
int a[10];表示a是整型数组类型,数组长度为10,然后就可用a定义变量,如:a si, s2;完全等效于:int s1[10], s2[10];
define:宏定义.
女口:#define PI 3.14意思是以后程序中出现PI地地方将用3.14代替,这个替换是 在编译预处理阶段完成地,注意#define最后没有分号,否则编译时将分号一同带入PI
while(1)
{
delay(0x200);
Send_Byte(0);//连续发送4个00H,便于观察输出显示
Send_Byte(0);
Send_Byte(0);
Send_Byte(0); delay(0x200); //延时delay(0x200);
delay(0x200);
delay(0x200);
名称
地址
功能描述
D7
D6
D5
D4
D3
D2
D1
D0
复位值
P1_ADC_EN
Biblioteka Baidu97H
允许P1.X
AD P17
AD P16
AD P15
AD P14
AD P13
AD P12
AD P11
AD P10
0000
成为AD口
0000
ADC_CONTR
C5H
AD转换控
--
--
--
ADC_FLAG
ADC_START
CHS2
STC系列单片机内部AD地应用
STC89LE52AD 54AD 58AD、516AD这几款89系列地STC单片机内部 自带有8路8位地AD转换器,分布在P1口地8位上,当时钟在40MHz以 下时,每17个机器周期可完成一次AD转换.
与AD相关地几个寄存器如表1所示.
表1STC89系列单片机AD相关寄存器
while(AD_finished== 0 ) //等待A/D转换结束
{
AD_finished=(ADC_CONTR&0x10);〃0001,0000,ADC_FLAG==测试A/D转
换结束否
ADC_CONTR&=0xF7;//1111,0111令ADC_START= 0,关闭A/D转换,
return (ADC_DATA);//返回A/D转换结果
{
INT8U AD_finished= 0; //存储A/D转换标志
ADC_DATA= 0;
ADC_CONTR=channel; //选择A/D当前通道
delay(1);//使输入电压达到稳定
ADC_CONTR|=0x08;//0000,1000令ADC_START= 1启动A/D转换
AD_finished= 0;
delay(0x200);
delay(0x200);
}
}
知识点:
typedef与#define地区别
typedef:类型定义,其功能是用户为已有数据类型取“别名”
女口:typedef int INT;意思是将int重新定义为INT,以后使用INT
a;就相当于inta;
用typedef定义数组、指针、结构等类型将带来很大地方便,不仅使 程序书写简单,而且使意义更为明确,因而增强了可读性•例如:typedef
RCAP2L=0xDB;
ES= 1;//允许串口中断
}
void Send_Byte(INT8U one_byte)//发送一个字节
{
TI= 0;//清零串口发送中断标志
SBUF=one_byte;
while (TI== 0);
TI = 0;//清零串口发送中断标志
}
INT8U get_AD_result(INT8U channel)
typedef unsigned char INT8U;
typedef unsigned int INT16U;
void delay(INT8U delay_time) //延时函数
{
INT8U n;
INT16U m;
for (n=0;n<delay_time;n++)
{
for(m=0;m<10000;m++);
CHS1
CHS0
xxx0
制寄存器
0000
ADC_DATA
C6H
AD转换结
--
--
--
--
--
--
--
--
0000
果寄存器
0000
P1_ADC_EN P1.X
相应位设置为“1”时,对应地P1.X口作为AD转换使用,内部上拉 电阻自动断开•
ADC_CONTR AD
ADC_STARTAD转换启动控制位,设置为“1”时,AD开始转换.
相关文档
最新文档