历史上的今天
返回首页

历史上的今天

今天是:2025年02月01日(星期六)

2018年02月01日 | STC89LE516AD单片机A/D转换功能程序

2018-02-01 来源:eefocus

STC89LE52AD、54AD、58AD、516AD这几款89系列的STC单片机 内部自带有8路8位的AD转换器,分布在P1口的8位上,当时钟在40MHz以下时,每17个机器周期可完成一次AD转换。

与AD相关的几个寄存器如表1所示。

表1 STC89系列 单片机 AD相关寄存器



名称



地址



功能描述



D7



D6



D5



D4



D3



D2



D1



D0



复位值



P1_ADC_EN



97H



允许P1.X成为AD口



AD_P17



AD_P16



AD_P15



AD_P14



AD_P13



AD_P12



AD_P11



AD_P10



0000 0000



ADC_CONTR



C5H



AD转换控制寄存器



--



--



--



ADC_FLAG



ADC_START



CHS2



CHS1



CHS0



xxx0 0000



ADC_DATA



C6H



AD转换结果寄存器



--



--



--



--



--



--



--



--



0000 0000




P1_ADC_EN:P1.X口的AD使能寄存器。

                   相应位设置为“1”时,对应的P1. X口作为AD转换使用,内部上拉电阻自动断开。


ADC_CONTR:AD 转换控制寄存器。


ADC_START:AD转换启动控制位,设置为“1”时,AD开始转换。



ADC_FLAG:AD转换结束标志位,当AD转换完成后,ADC_FLAG=1。


CHS2、CHS1、CHS0:为模拟输入通道选择,如表2所示。

表2 
STC89系列 单片机 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输入来用



1



0



1



选择P1.5作为AD输入来用



1



1



0



选择P1.6作为AD输入来用



1



1



1



选择P1.7作为AD输入来用




ADC_DATA:AD 转换结果寄存器。模拟/数字转换结果计算公式如下:

结果=256×Vin / VCC


Vin为模拟输入通道输入电压,Vcc为 单片机 实际工作电压,用单片机工作电压作为模拟参考电压。

         下面一个例程演示STC89LE516AD/X2系列 单片机 的A/D转换功能。 时钟11.0592MHz, 转换结果以16进制形式输出到串行口,可以用串行口调试程序观察输出结果。(本代码摘自宏晶科技芯片手册,经作者调试可正常运行)。

         新建文件part3.4.5.c,程序代码如下:



#include

#include

// 定义与 ADC 有关的特殊功能寄存器

sfr P1_ADC_EN = 0x97; //A/D转换功能允许寄存器

sfr ADC_CONTR = 0xC5; //A/D转换控制寄存器

sfr ADC_DATA = 0xC6;
//A/D转换结果寄存器

typedef unsigned char INT8U;

typedef unsigned int INT16U;

void delay(INT8U delay_time) // 延时函数

{


INT8U n;


INT16U m;


for (n=0;n


{


for(m=0;m<10000;m++);


}

}

void initiate_RS232(void)
//串口初始化

{


ES = 0;


// 禁止串口中断


SCON = 0x50;
// 0101,0000 8 位数据位, 无奇偶校验


T2CON = 0x34;
// 0011,0100, 由T2 作为波特率发生器


RCAP2H = 0xFF; // 时钟11.0592MHz, 9600 波特率


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)

{


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;


while ( AD_finished == 0 ) // 等待A/D 转换结束


{


AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==1测试A/D转                  换结束否


}


ADC_CONTR &= 0xF7; //1111,0111 令 ADC_START = 0, 关闭A/D 转换,


return (ADC_DATA); // 返回 A/D 转换结果

}

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 内部上拉电阻


while(1)


{


Send_Byte(get_AD_result(0)); //P1.0 为 A/D 当前通道, 测量并发送结果


delay(0x200);


Send_Byte(get_AD_result(1)); //P1.1 为 A/D 当前通道, 测量并发送结果


delay(0x200);


Send_Byte(get_AD_result(5)); //P1.5 为 A/D 当前通道, 测量并发送结果


delay(0x200);


Send_Byte(get_AD_result(6)); //P1.6 为 A/D 当前通道, 测量并发送结果


delay(0x200);


Send_Byte(0); // 连续发送 4 个 00H, 便于观察输出显示


Send_Byte(0);


Send_Byte(0);


Send_Byte(0);


delay(0x200); // 延时


delay(0x200);


delay(0x200);


delay(0x200);


delay(0x200);


delay(0x200);


}

}


知识点:typedef与#define的区别


typedef:类型定义,其功能是用户为已有数据类型取“别名”。


如:typedef 
int 
INT; 意思是将int重新定义为INT,以后使用INT a;就相当于int 
a;


用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单,而且使意义更为明确,因而增强了可读性。例如:typedef int a[10];表示a是整型数组类型,数组长度为10,然后就可用a定义变量,如:a s1,s2;完全等效于:int s1[10],s2[10];

define:宏定义。


如:#define PI 3.14 意思是以后程序中出现PI的地方将用3.14代替,这个替换是在编译预处理阶段完成的,注意#define最后没有分号,否则编译时将分号一同带入PI中。


推荐阅读

史海拾趣

DuPont公司的发展小趣事

随着全球环保意识的提高,对于环保型电子材料的需求也日益增长。DuPont公司积极响应这一趋势,致力于环保型电子材料的研发和生产。公司采用先进的环保技术和生产工艺,开发出了一系列低污染、低能耗的电子材料。这些材料不仅具有良好的性能,而且对环境友好,符合可持续发展的要求。DuPont公司的这一举措,不仅提升了公司的竞争力,也为电子行业的可持续发展做出了积极贡献。

Colibrys SA公司的发展小趣事

Colibrys在MEMS技术方面拥有深厚的专业知识,这得益于公司长期的研发积累和不断创新的精神。许多客户委托公司建造最苛刻的航空航天、能源、铁路或汽车测试设备,这些成功案例进一步巩固了公司在行业内的领先地位。无论是用于汽车安全气囊的MEMS加速度计,还是用于引导钻头的高温加速度计,都体现了Colibrys在专业知识应用方面的卓越能力。

Hamamatsu公司的发展小趣事

Colibrys SA公司的故事始于2001年,它作为瑞士科技孵化器的衍生公司诞生。瑞士以其精密制造和微机械技术闻名于世,这为Colibrys的起步提供了得天独厚的条件。初期,公司专注于MEMS(微机电系统)技术的研发,凭借对专业知识的深入理解和不懈探索,逐步在行业内崭露头角。

Dawning Precision Co Ltd公司的发展小趣事

随着市场竞争的加剧,Dawning意识到只有不断创新才能在行业中立于不败之地。公司加大了对研发的投入,聘请了一批在电子制造领域具有丰富经验的专家。在专家团队的带领下,Dawning成功开发出了多款具有自主知识产权的高精度电子产品,这些产品不仅在性能上领先同行,而且在价格上也更具竞争力。这些创新产品的推出,极大地提升了Dawning在市场上的竞争力。

AZ Displays公司的发展小趣事

AZ Displays公司最初是一家专注于研发和生产TFT面板与LCD模块的初创企业。在电子行业激烈的竞争中,AZ Displays凭借其专业的技术团队和对市场的敏锐洞察,成功开发出一系列具有竞争力的产品。公司不断追求技术创新,持续优化生产工艺,逐渐在行业中树立起良好的口碑。

Axiomtek公司的发展小趣事

随着公司规模的扩大和市场份额的提升,AZ Displays开始实施全球化战略。公司在全球范围内建立销售网络和分支机构,积极开拓国际市场。通过与国际知名企业的合作,AZ Displays成功将产品打入国际市场,进一步提升了公司的品牌影响力和市场竞争力。

问答坊 | AI 解惑

PIC 8位单片机的分类和特点

PIC 8位单片机的分类和特点 …

查看全部问答>

大赛用芯片资料

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 芯片资料  …

查看全部问答>

2010年的汽车电子趋势预测

中国的汽车产业在今年很有可能触及或跨越年产销一千万辆这个门槛,事实上在实现这个目标以前,中国就已经成为仅次于美国的全球第二大汽车市场。在当前的汽车中,汽车电子系统所占的比重越来越大,很多特色化的功能都是依赖汽车电子技术来实现的,如 ...…

查看全部问答>

淘宝上的linux开发板能买不??

我是新手,以前都是跟着导师做单片机的。感觉单片机有点“不过瘾”的感觉,想往高深的学。想学linux下嵌入式编程,但是身边又没有的这方面的资源。于是想买一块开发板子。请问:淘宝上的那种便宜的开发板比如像2410、2440板子能买不?? 问题1:开 ...…

查看全部问答>

请问一般公司会招聘底层开发(驱动开发)的应届生吗

本人在校学生,最近做的项目都用到了一些驱动的开发,感觉底层这方面的编程比普通的软件开发难度大一点。如果是软件公司招聘的话,他们会招聘新手吗?个人感觉做这方面的真正开发,都是有多年经验的老手。…

查看全部问答>

ce下怎么获取ESN码还有怎么获取是手机的型号啊。。

ce下怎么获取ESN码还有怎么获取是手机的型号啊。。 …

查看全部问答>

伺服系统小结(连续上篇)

三、伺服系统调试   接通伺服驱动器的电源, 先进入测试调整模式,测试调整模式可以执行伺服驱动器的测试操作,报警复位和参数编辑等等.其数字操作器的按键说明如表1: 键 出现的情况 MOD 在不同模式 ...…

查看全部问答>

2812调试时关于看门狗的一些问题

2812调试时关于看门狗的一些问题 大家好, 我目前正在调试一块自己做的2812的板子,遇到关于看门狗的一些问题: 一点连续运行按钮程序就跳到3FFC00处(此处应该是复位向量),而点单步运行的时候程序可以走的.点连续运行的时候用示波器观察reset引脚,发 ...…

查看全部问答>

机械电能表到电子式电能表讲义

机械电能表到电子式电能表讲义,从事电能表行业可以看看哦! [ 本帖最后由 aishuang 于 2011-7-16 12:22 编辑 ]…

查看全部问答>

请大家看看我这个串口的程序哪里不对??很多乱码

单片机的接收端是连接的GPS信号, 发送端连接的是GPRS的接收。 单片机就是把收到的经纬度找出来传给GPRS,用UDP发送。 只要不连GPS, 发送的数据就完全正确。 连了GPS之后,数据就乱了,GPS是一直在发送,速度很快 #include #include #incl ...…

查看全部问答>