求助,AD转换数据不能通过串口发送。。
时间:10-02
整理:3721RD
点击:
功能是用光敏传感器输入模拟量信号,通过采集模拟信号,然后转化成数字信号,然后通过串口助手反馈一个值,用hex模式显示,但是问题不知道出哪里了,串口没有数据接收,请各位帮忙看看,谢谢
#include <stc12c5a60s2.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#define ADC_POWER 0x80
//#define ADC_SPEEDLL 0x00
//#define ADC_START 0x08
//#define ADC_FLAG 0x10
void Delay(uint n)
{
uint x;
while (n--)
{
x = 5000;
while (x--);
}
}
/*----------------------------
串口初始化
----------------------------*/
void UartInit() //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
BRT = 0xDC; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}
/*----------------------------
串口发送函数
----------------------------*/
void SendData(uchar dat)
{
SBUF = dat;
while (!TI);
TI = 0;
}
/*----------------------------
ADC初始化
----------------------------*/
void InitADC()
{
P1ASF = 0x80; //设置P1.7作为模拟口使用
ADC_RES = 0; //清除之前的结果
ADC_CONTR|=0X80;//打开ADC电源
ADC_CONTR|=0X08;//启动ADC转换
ADC_CONTR|=0X07;//选择P1.7作为AD输入口
ADC_CONTR|=0X60;//选择AD转换速度
Delay(2);
}
void main()
{
UartInit(); //Init UART, use to show ADC result
InitADC(); //Init ADC sfr
IE = 0xa0; //Enable ADC interrupt and Open master interrupt switch //Start A/D conversion
while (1);
}
/*----------------------------
ADC 中断服务程序
----------------------------*/
void adc_isr() interrupt 5
{
ADC_CONTR|=0X80;//打开ADC电源
ADC_CONTR|=0X08;//启动ADC转换
ADC_CONTR|=0X07;//选择P1.7作为AD输入口
ADC_CONTR|=0X60;//选择AD转换速度
if(ADC_CONTR|=0x10)
{
ADC_CONTR &=0X10; //清除标志位
SendData(ADC_RES); //得到ADC高8位数据发送到串口
}
}
#include <stc12c5a60s2.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#define ADC_POWER 0x80
//#define ADC_SPEEDLL 0x00
//#define ADC_START 0x08
//#define ADC_FLAG 0x10
void Delay(uint n)
{
uint x;
while (n--)
{
x = 5000;
while (x--);
}
}
/*----------------------------
串口初始化
----------------------------*/
void UartInit() //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
BRT = 0xDC; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}
/*----------------------------
串口发送函数
----------------------------*/
void SendData(uchar dat)
{
SBUF = dat;
while (!TI);
TI = 0;
}
/*----------------------------
ADC初始化
----------------------------*/
void InitADC()
{
P1ASF = 0x80; //设置P1.7作为模拟口使用
ADC_RES = 0; //清除之前的结果
ADC_CONTR|=0X80;//打开ADC电源
ADC_CONTR|=0X08;//启动ADC转换
ADC_CONTR|=0X07;//选择P1.7作为AD输入口
ADC_CONTR|=0X60;//选择AD转换速度
Delay(2);
}
void main()
{
UartInit(); //Init UART, use to show ADC result
InitADC(); //Init ADC sfr
IE = 0xa0; //Enable ADC interrupt and Open master interrupt switch //Start A/D conversion
while (1);
}
/*----------------------------
ADC 中断服务程序
----------------------------*/
void adc_isr() interrupt 5
{
ADC_CONTR|=0X80;//打开ADC电源
ADC_CONTR|=0X08;//启动ADC转换
ADC_CONTR|=0X07;//选择P1.7作为AD输入口
ADC_CONTR|=0X60;//选择AD转换速度
if(ADC_CONTR|=0x10)
{
ADC_CONTR &=0X10; //清除标志位
SendData(ADC_RES); //得到ADC高8位数据发送到串口
}
}
串口只识别字符串型的数据,不能读取单纯的数值型数据
大师们,在哪里啊,真心求助
求大师指教啊,
串口感觉没有启动……直接附值就能传输么?
是数据发送不出去还是发送出的数据有问题(注意单片机只能发送8位数据)。你可以单独测试一下发送数据(随便发送个数据),如果单独发送数据没问题的话,那问题就是出在adc转换了。
那单片机是10位adc,不知你是发8位数据还是直接发10位数据(这样肯定有问题)
可以发10位,也可以发8位,只不过8位没有10位的精度高
串口助手上面显示没有接收,但是我测试串口发送没有问题
我看手册就是可以的,你看看那stc12c5a60s2的手册,就是可以的
发送函数可以直接用print()函数可以发送
同问,大神你是如何解决的啊
可以告知一下么
进入中断服务之后先清除标志位,然后串口发送,最后再重新开启下次转换试试看。
大神,还是不好使啊
还是不能通过串口发送啊