专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
串口助手显示接收到数据,但是界面却没有显示
2019-07-15 07:28
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
11132
9
1452
ATOS实验箱中测量节点温度,并显示出来,程序运行正确,也成功下载,但是在串口助手却只能显示接收到数据,界面上啥都没有,改成16进制显示,界面上显示的全部是0,不知道是是怎么回事?求大神解答~
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
shsfsdfsg
1楼-- · 2019-07-15 13:42
精彩回答 2 元偷偷看……
加载中...
shsfsdfsg
2楼-- · 2019-07-15 14:01
/* initUART_Timer.h */
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0 //定义LED1为P10口控制
#define LED2 P1_1 //定义LED2为P11口控制
#define LED3 P1_4 //定义LED3为P14口控制
// Data
typedef unsigned char BYTE;
// Unsigned numbers
typedef unsigned char UINT8;
typedef unsigned char INT8U;
typedef unsigned short UINT16;
typedef unsigned short INT16U;
typedef unsigned long UINT32;
typedef unsigned long INT32U;
// Signed numbers
typedef signed char INT8;
typedef signed short INT16;
typedef signed long INT32;
#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)//三个
/**************************
系统时钟 不分频
计数时钟 32分频
**************************/
void InitClock(void)
{
CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振
while(CLKCONSTA & 0x40); // 等待晶振稳定
CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ
}
/****************************
//初始化程序
*****************************/
void InitLed(void)
{
P1DIR |= 0x13; //P1_0、P1_1定义为输出
LED1 = 0; //LED1灯熄灭
LED2 = 0;
LED3 = 0;
}
/****************************
T3初始化
****************************/
void InitT3(void)
{
T3CCTL0 = 0X44; // T3CCTL0 (0xCC),CH0 中断使能,CH0 比较模式
T3CC0 = 0xFA; // T3CC0设置为250
T3CTL |= 0x9A; // 启动T3计数器,计数时钟为16分频。使用MODULO模式
IEN1 |= 0X08;
IEN0 |= 0X80; //开总中断,开T3中断
}
/*****************************************
串口初始化函数:初始化串口 UART0
*****************************************/
void InitUART0(void)
{
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
void UartTX_Send_String(char *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
U0DBUF = 0x0A; // 换行
while(UTX0IF == 0);
UTX0IF = 0;
}
void Delay(uint n)
{
uint i;
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
}
void Delayms(uint xms) //i=xms 即延时i毫秒 (16M晶振时候大约数,32M需要修改,系统不修改默认使用内部16M)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
/* main.c */
#include <ioCC2530.h>
#include "InitUART_Timer.h" //注意在option里设置路径
#include "stdio.h"
void initTempSensor(void)
{
DISABLE_ALL_INTERRUPTS(); //关闭所有中断
InitClock(); //设置系统主时钟为 32M
TR0=0X01; //set '1' to connectthe temperature sensorto the SOC_ADC.
ATEST=0X01; // Enablesthe temperature sensor
}
float getTemperature(void)
{
uint value;
ADCCON3 = (0x3E); //选择1.25V为参考电压;12位分辨率;对片内温度传感器采样
ADCCON1 |= 0x30; //选择ADC的启动模式为手动
ADCCON1 |= 0x40; //启动AD转化
while(!(ADCCON1 & 0x80)); //等待 AD 转换完成
value = ADCL >> 4; //ADCL 寄存器低 4位无效
value |= (((UINT16)ADCH) << 4);
return (value-1367.5)/4.5-5; //根据AD值,计算出实际的温度,温度系数应该是4.5 /℃
//进行温度校正,这里减去5℃(不同芯片根据具体情况校正)
}
void main(void)
{
// char i;
char TempValue[6];
float Temp;
InitUART0(); //初始化串口
initTempSensor(); //初始化 ADC
while(1)
{
/*AvgTemp = 0;
for(i = 0 ; i < 64 ; i++)
{
AvgTemp += getTemperature();
AvgTemp=AvgTemp/2; //每次累加后除 2
}
*/
Temp=getTemperature();
/****温度转换成ascii码发送****/
TempValue[0] = (unsigned char)(Temp)/10 + 48; //十位
TempValue[1] = (unsigned char)(Temp)%10 + 48; //个位
TempValue[2] = '.'; //小数点
TempValue[3] = (unsigned char)(Temp*10)%10+48; //十分位
TempValue[4] = (unsigned char)(Temp*100)%10+48; //百分位
TempValue[5] = ' '; //字符串结束符
UartTX_Send_String( TempValue,6);
Delayms(2000); //使用32M晶振,故这里2000约等于1S
}
}
代码如上,是否代码上有什么问题?
加载中...
ggfvxv
3楼-- · 2019-07-15 15:18
TempValue[0] = (unsigned char)(Temp)/10 + 48; //十位
这个有问题。干吗不用sprintf? 或者更安全的snprintf?
snprintf(TempValue, 6, "%.2f", Temp);
UartTX_Send_String( TempValue,6);
加载中...
shsfsdfsg
4楼-- · 2019-07-15 18:59
使用snprintf(TempValue, 6, "%.2f", Temp);函数的话,调试时会出现这个错误:
不知道怎么弄,在头文件中有申明:
#include "stdio.h"
#include"stdlib.h"
加载中...
ggfvxv
5楼-- · 2019-07-15 21:23
是链接错误,检查库文件设置。另外需要打开浮点数打印支持。检查你的链接配置
加载中...
zhangminmin
6楼-- · 2019-07-16 00:06
精彩回答 2 元偷偷看……
加载中...
1
2
下一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0 //定义LED1为P10口控制
#define LED2 P1_1 //定义LED2为P11口控制
#define LED3 P1_4 //定义LED3为P14口控制
// Data
typedef unsigned char BYTE;
// Unsigned numbers
typedef unsigned char UINT8;
typedef unsigned char INT8U;
typedef unsigned short UINT16;
typedef unsigned short INT16U;
typedef unsigned long UINT32;
typedef unsigned long INT32U;
// Signed numbers
typedef signed char INT8;
typedef signed short INT16;
typedef signed long INT32;
#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)//三个
/**************************
系统时钟 不分频
计数时钟 32分频
**************************/
void InitClock(void)
{
CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振
while(CLKCONSTA & 0x40); // 等待晶振稳定
CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ
}
/****************************
//初始化程序
*****************************/
void InitLed(void)
{
P1DIR |= 0x13; //P1_0、P1_1定义为输出
LED1 = 0; //LED1灯熄灭
LED2 = 0;
LED3 = 0;
}
/****************************
T3初始化
****************************/
void InitT3(void)
{
T3CCTL0 = 0X44; // T3CCTL0 (0xCC),CH0 中断使能,CH0 比较模式
T3CC0 = 0xFA; // T3CC0设置为250
T3CTL |= 0x9A; // 启动T3计数器,计数时钟为16分频。使用MODULO模式
IEN1 |= 0X08;
IEN0 |= 0X80; //开总中断,开T3中断
}
/*****************************************
串口初始化函数:初始化串口 UART0
*****************************************/
void InitUART0(void)
{
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
void UartTX_Send_String(char *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
U0DBUF = 0x0A; // 换行
while(UTX0IF == 0);
UTX0IF = 0;
}
void Delay(uint n)
{
uint i;
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
}
void Delayms(uint xms) //i=xms 即延时i毫秒 (16M晶振时候大约数,32M需要修改,系统不修改默认使用内部16M)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
/* main.c */
#include <ioCC2530.h>
#include "InitUART_Timer.h" //注意在option里设置路径
#include "stdio.h"
void initTempSensor(void)
{
DISABLE_ALL_INTERRUPTS(); //关闭所有中断
InitClock(); //设置系统主时钟为 32M
TR0=0X01; //set '1' to connectthe temperature sensorto the SOC_ADC.
ATEST=0X01; // Enablesthe temperature sensor
}
float getTemperature(void)
{
uint value;
ADCCON3 = (0x3E); //选择1.25V为参考电压;12位分辨率;对片内温度传感器采样
ADCCON1 |= 0x30; //选择ADC的启动模式为手动
ADCCON1 |= 0x40; //启动AD转化
while(!(ADCCON1 & 0x80)); //等待 AD 转换完成
value = ADCL >> 4; //ADCL 寄存器低 4位无效
value |= (((UINT16)ADCH) << 4);
return (value-1367.5)/4.5-5; //根据AD值,计算出实际的温度,温度系数应该是4.5 /℃
//进行温度校正,这里减去5℃(不同芯片根据具体情况校正)
}
void main(void)
{
// char i;
char TempValue[6];
float Temp;
InitUART0(); //初始化串口
initTempSensor(); //初始化 ADC
while(1)
{
/*AvgTemp = 0;
for(i = 0 ; i < 64 ; i++)
{
AvgTemp += getTemperature();
AvgTemp=AvgTemp/2; //每次累加后除 2
}
*/
Temp=getTemperature();
/****温度转换成ascii码发送****/
TempValue[0] = (unsigned char)(Temp)/10 + 48; //十位
TempValue[1] = (unsigned char)(Temp)%10 + 48; //个位
TempValue[2] = '.'; //小数点
TempValue[3] = (unsigned char)(Temp*10)%10+48; //十分位
TempValue[4] = (unsigned char)(Temp*100)%10+48; //百分位
TempValue[5] = ' '; //字符串结束符
UartTX_Send_String( TempValue,6);
Delayms(2000); //使用32M晶振,故这里2000约等于1S
}
}
代码如上,是否代码上有什么问题?
这个有问题。干吗不用sprintf? 或者更安全的snprintf?
snprintf(TempValue, 6, "%.2f", Temp);
UartTX_Send_String( TempValue,6);
不知道怎么弄,在头文件中有申明:
#include "stdio.h"
#include"stdlib.h"
一周热门 更多>