基于STM8的ADC0832采集及蓝牙通信系统
#include "ADC0832.h"
extern uint8_t i;
uint8_t channel=1 ;
//接收寄存器溢出中断
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
//下面是我做的安卓上位机发送过来的数据判断,这里可以改成自己想要的程序
uint8_t tempData;
tempData = UART1_ReceiveData8();
if(tempData=='A')
{
channel = 0;
}
if(tempData=='Z')
{
channel = 1;
}
//清除UART1中断标识符
UART1_ClearITPendingBit(UART1_IT_RXNE);
}
//定时器4计数器溢出中断
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
//1*10m执行一次
i++;
if(i==10)
{
//进行ADC数模转换
//初始化ADC芯片,写入通道
AD_init(channel);
u8 u8_adc1_value;
//进行数据读出
u8_adc1_value = AD_read();
//发送8位数据
UART1_mysend8hex(u8_adc1_value);
//清除UART1中断标识符
UART1_ClearITPendingBit(UART1_IT_RXNE);
i=0;
}
TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
}
这里说说ADC0832的操作函数:ADC0832.c
程序包括初始化STM8的GPIO,初始化ADC0832和读取ADC0832数据
主要是DODI端口复用的问题,由于STM8端口作为输入输出,需要重新初始化GPIO,所以比一般51单片机的程序要复杂一点。最后读取数据先是从高位读出,再低位读出,进行校验,相同数值再输出。
附上时序图
ADC0832.c程序:
/**********************************************
程序名称:ADC0832子程序
作 者:devinzhang91
时 间:2014.10.04
**********************************************/
#ifndef ADC0832_H
#define ADC0832_H
#include "stm8s.h"
//端口设置
#define CLK_GPIO_PORT (GPIOC)
#define CLK_GPIO_PINS (GPIO_PIN_3)
#define DI_GPIO_PORT (GPIOC)
#define DI_GPIO_PINS (GPIO_PIN_4)
#define DO_GPIO_PORT (GPIOC)
#define DO_GPIO_PINS (GPIO_PIN_4)
#define CS_GPIO_PORT (GPIOC)
#define CS_GPIO_PINS (GPIO_PIN_1)
/********************************************************
函数名称:void ioInit(void)
函数作用:初始化GPIO
参数说明:null
********************************************************/
void ioInit(void)
{
{
//全为输出模式
GPIO_Init(CLK_GPIO_PORT, CLK_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(DI_GPIO_PORT, DI_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(DO_GPIO_PORT, DO_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(CS_GPIO_PORT, CS_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
}
/********************************************************
函数名称:void ioChange()
函数作用:初始化GPIO
参数说明:i=0,表示输出,i=1,表示输入
********************************************************/
void ioChange(uchar i)
{
if( i == 0)
GPIO_Init(DO_GPIO_PORT, (GPIO_Pin_TypeDef)DO_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
if( i == 1)
GPIO_Init(DI_GPIO_PORT, (GPIO_Pin_TypeDef)DI_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);
}
/********************************************************
函数名称:void AD_init(uchar i)
函数作用:初始化ADC0832
参数说明:i=0,表示通道0,i=1,表示通道1
********************************************************/
void AD_init(uchar i)
{
ioInit(); //初始化io
ioChange(0); //作为输出
GPIO_WriteLow(CLK_GPIO_PORT, (GPIO_Pin_TypeDef)CLK_GPIO_PINS); //形成下降沿
asm("nop");
asm("nop");
GPIO_WriteHigh(DO_GPIO_PORT, (GPIO_Pin_
- stm8s开发(六) EXIT的使用:做一个外部中断的按钮!(09-18)
- 如何设计基于STM8的ADC0832采集及蓝牙通信系统?(09-27)
- stm8s开发(五) TIMER的使用:定时!(09-18)
- stm8s开发(八) IIC的使用:IIC主机通信!(09-19)
- stm8s开发(四) CLOCK的使用:时钟控制!(09-14)
- stm8s开发(七) SPI的使用:SPI主机通信!(09-19)