STM8片上集成了10位逐次比较型模数转换器,在开发板上有个电位器接到了AIN3,但没有可以显示数据的LED数码管或LCD液晶显示屏,怎么办呢?可以把AD采集数据通过UART发送到电脑上显示。
#i nclude
void CLK_init(void)
{
CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M
}
void GPIO_init(void)
{
PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出
PD_CR1 = 0x08; // 设置PD3为推挽输出
PD_CR2 = 0x80; // 使能PD7外部中断
}
void EXTI_init(void)
{
EXTI_CR1 = 0x80; // PD口下降沿触发中断
}
#pragma vector=0x02
__interrupt void EXTI_PD7_TLI(void)
{
unsigned int value;
ADC_CSR &= ~0x80;//清除EOC转换结束标志
ADC_CR1 |= 0x01; //开始单次转换
while(!(ADC_CSR&0x80)); //等待单次转换完成
value = ((int)ADC_DRH<<2); // 先读高8位,默认设置数据左对齐
value |= ADC_DRL; // 再读低8位
while(!UART3_SR_TXE);
UART3_DR = value;// 通过UART3发送AD采样结果
while(!UART3_SR_TXE);
UART3_DR = value>>8;
}
void ADC_init(void)
{
ADC_CSR = 0x03; // ADC输入引脚AIN3
ADC_CR1 = 0x01; // ADC开启
}
void UART3_init(void)
{
UART3_BRR2 = 0x01;
UART3_BRR1 = 0x34; // 8M/9600 = 0x341
UART3_CR2 = 0x0C; // 允许接收,允许发送
}
void init_devices(void)
{
asm("sim");//禁止中断
CLK_init();
GPIO_init();
EXTI_init();
ADC_init();
UART3_init();
asm("rim"); //使能中断
}
void main( void )
{
init_devices();
//主循环里没有程序需要执行
while(1);
}
在本例中仅使用了ADC的单次转换模式,每按一次按键进行一次AD转换,并把转换结果通过UART发送,这样可以在电脑上通过超级终端或串口调试软件查看数据。
通过这次测试,还发现一个现象,如果把清除EOC转换结束标志放在读取数据之后,那么在下次启动单次转换后,EOC标志位会自动置位,此时必须人为的等待7us后才能读到正确的数据,否则只能读到上一次的转换数据,可能这是STM8的ADC与其他MCU不同之处。
关键字:STM8 单片机 ADC应用 IAR
引用地址:
STM8单片机ADC应用(IAR)
推荐阅读最新更新时间:2024-11-11 09:26
8051系列单片机Basic开发环境
BasIC语言已经发展到QuickBASIC以后,已经具备了很多结构化思想和编程方式,如函数、模块、局部变量、全局变量、数据传递等。 早期的BASIC语言由于生成的代码不是最终目标机器的代码,而是经过一个RNUTIME程序解释后运行的,因而执行效率低。而 单片机 的BASIC编译器直接将代码编译成相应芯片的机器码,不需要在单片机的内存中驻留RNUTIME程序,执行效率与其他编译器编译出来的一样。 MCS EleCTRonics公司开发的BASCOM-8051开发环境是以Basic语言为基础的 单片机 编程系统,具有易学易用、功能强大、开发周期短等特点。 一、命令分类 1.伪指令 伪指令是一些对开发环境的设置指令,如:$Large
[单片机]
用MCU打造智能恒温器,功耗/通讯/人机介面逐个击破
在 物联网 风潮的驱动下,恒温器已朝向联网与智慧化发展。微控制器( MCU )开发商遂推出低功耗,且具备段式LCD显示控制与Wi-Fi/蓝牙/ZigBee无线连结支援能力,以及256位元AES先进加密功能的新方案,助力智慧型恒温器应用发展。 目前,市场上涌现出越来越多的物联网(IoT)恒温器产品。本文阐述如何使用微控制器(MCU)打造IoT恒温器,并以爱特梅尔(Atmel)SMART SAM L22 MCU为例,同时也介绍此MCU作为段式液晶显示器(LCD)控制器平台实现恒温器应用的功能。该MCU内置一个主频32MHz的ARM Cortex-M0+处理器,拓展该公司现有的低功耗MCU系列。它专为本文描述的恒温器等人机介面(HMI)
[嵌入式]
第1节:单片机到底是学什么?我的两个比喻和一个规则
从业十年,教你单片机入门基础 第1讲: 开篇第一节,我问大家一个问题,跟我学单片机到底是学什么?我的回答是像驾驶汽车一样驾驭单片机。我教给大家的是驾驶汽车的技术而不是研发汽车的技术。因此每当别人问我学51单片机,PIC,AVR,stm32哪个更加有前途,应该先学哪个再学哪个时,我的回答是既然你是学驾驶技术,那么你用桑塔纳车来学还是用宝马车来学有差别吗?差别很小的,它们只是不同的厂家而已,只要会一种其它的就触类旁通了。把学单片机当作考驾照这是我所说的第一个比喻。 学单片机最核心的是程序,程序跟单片机芯片是什么关系?我的回答是像歌曲跟MP3播放器的关系。我们写的程序就像预先录制好的歌曲,单片机芯片就是一个MP3播放器。把不同的歌曲下载
[单片机]
51单片机的中断源入口地址是程序存储器空间的5个单元
程序存储器低端的一些地址被固定地用作特定程序的入口地址: (1) 0000H——单片机复位后的程序入口地址。 (2) 0003H——外部中断 0 的中断服务子程序入口地址。 (3) 000BH——定时/计数器 0 的中断服务子程序入口地址。 (4) 0013H——外部中断 1 的中断服务子程序入口地址。 (5) 001BH——定时/计数器 1 的中断服务子程序入口地址。 (6) 0023H——串行口的中断服务子程序入口地址。 (7) 002BH——定时器 2 的中断服务子程序入口地址。 编程时,通常在这些入口地址开始的二三个单元中,放入一条转移指令,以使相应的 服务与实际分配的程序存储器区域中的程序段相对应(仅在中断服务子程
[单片机]
IAR编译器的常见问题
最近因为项目需要开始使用IAR for AVR,我用的是5.40版本的,主要是5.40以上才包括了aTtiny87,至于安装文件和和谐文件,大家自己找吧,很好找的。 1.编译报错如图所示: 很显然你没有使能寄存器的位定义。方法如下:Project —— Option —— General Options —— System(如下图所示),勾选 Enable bit definitions in I/O-Include files即可 2.MCU型号选择 如果和我一样都次都是以空工程创建的话,不过忘了第一步先进Project —— Option —— General Options —— Target选择所使用的
[单片机]
51单片机定时闹钟仿真程序
仿真原理图如下 定时闹铃的基本功能 1.定时闹铃的基本功能: 使用3位七段显示器来显示定时时间和所剩的时间(以秒为单位) 具有3个按键来设置定时的时间: 操作键K1:开始定时(默认为60秒) 操作键K2:增加定时时间(以一秒为单位递增) 操作键K3:减少定时时间(以一秒为单位递减) 定时时间到时蜂鸣器发出蜂鸣声一分钟后停止 2.定时闹铃的可选功能: 3位七段显示器采用动态显示。 当操作键K2被长时间按下(超过3秒)则以十秒为单位增加定时时间 当操作键K3被长时间按下(超过3秒)则以十秒为单位减少定时时间 buzzer蜂鸣器需要把它设置里
[单片机]
stm32单片机如何将数组中的转换成一个数值或者数据
if(UartHandle- Instance == USART3) //stm32的串口中断 { gizPutData((uint8_t *)&mudbusRxBuffer, 1); rx_buf =mudbusRxBuffer; HAL_UART_Receive_IT(&huart3, (uint8_t *)&mudbusRxBuffer, 1);//这里用的是hal库,开启下一次接收中断 if(rx_buf == 'A') //A在这里我设置为结束符,假如从串口发送10A, { for(int i=0;i num;i++) { x=x*10+(int)rx
[单片机]
51单片机定时器/计数器,中断
Hz是频率单位。频率是指电脉冲,电磁波,声波和机械的振动周期循环时,1秒钟重复的次数 1Hz 代表每秒钟振动 1次 60Hz 代表每秒钟振动 60次 1KHz 代表每秒钟振动 1,000次 1MHz 代表每秒钟振动 1,000,000次 频率的常用单位:Hz KHz MHz GHz 对于声音,人类的听觉范围为 20Hz~2000Hz,低于这个范围叫次声波,高于这个范围叫超声波。 单片机外接12MHz晶振时: 12MHz = 12,000KHz = 12,000,000Hz 1S = 1,000ms = 1,000,000us 12Mhz晶振时钟周期: 12,000,000Hz
[单片机]