STC12C5A60S2单片机给EEPROM存一个float型,然后读出来发送到串口。为啥串口接收到的都是0.0?求大神帮助!
时间:10-02
整理:3721RD
点击:
#include <STC12C5A.H>
#include"intrins.h"
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define CMD_IDLE 0 //IAP等待
#define CMD_READ 1 //读flash
#define CMD_PROGRAM 2 //写入
#define CMD_ERASE 3 //擦除
#define IAP_EN 0x83
#define iap_ADDRESS 0x0000 //地址
void delay(int k) //延时函数
{
int i,j;
for(i=0;i<184;i++)
for(j=0;j<k;j++);
}
//使硬件或软件操作停止
void iap_IDLE()
{
IAP_CONTR=0; //禁止IAP读写擦除
IAP_CMD=0; //等待
IAP_TRIG=0; //命令未触发
IAP_ADDRH=0x80; //高位数据地址
IAP_ADDRL=0; //低位
}
//从数据里面读取数据
uchar iap_READ(uint addr)
{ uchar datas;
IAP_CONTR=IAP_EN; //控制允许位
IAP_CMD=CMD_READ; //写入读命令
IAP_ADDRL=addr; //自定义地址
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a; //命令有效
IAP_TRIG=0xa5;
_nop_();
datas=IAP_DATA;
iap_IDLE();
return datas; //返回读出的数据
}
//写一个比特ISP写到某个地方
void iap_PROGRAM(uint addr,uchar datas)
{
IAP_CONTR=IAP_EN;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=datas;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_IDLE();
}
//擦掉某个区域
void iap_ERASE(uint addr)
{
IAP_CONTR=IAP_EN;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_IDLE();
}
void uart_init(void) //串口的初始化
{
TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2
TH1=0xfd;//设置波特率为9600
TL1=0xfd;
TR1=1;//启动定时器/计数器1
SCON=0x50; //0101 0000.串口工作方式1,允许串行控制
PCON=0x00;//设置SMOD=0
IE=0x90; //CPU允许中断,串行允许中断
TI=1;//直接使用printf必须加入此句才能实现发送
}
main()
{
int i;
union
{
float x;
uchar s[4];
}fasong;
fasong.x=3.4;
iap_ERASE(iap_ADDRESS); //擦除扇区
for(i=0;i<4;i++)
{
iap_PROGRAM(iap_ADDRESS+i,fasong.x);//向这个区间512字节里面写东西
}
uart_init(); //串口初始化
while(1)
{
for(i=0;i<4;i++)
{
printf("iap_READ[%d]=%.1f \n",i,iap_READ(iap_ADDRESS+i)); //在串口上输出
delay(500);
}
}
}
请各位大神看看,是哪有问题呀?
#include"intrins.h"
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define CMD_IDLE 0 //IAP等待
#define CMD_READ 1 //读flash
#define CMD_PROGRAM 2 //写入
#define CMD_ERASE 3 //擦除
#define IAP_EN 0x83
#define iap_ADDRESS 0x0000 //地址
void delay(int k) //延时函数
{
int i,j;
for(i=0;i<184;i++)
for(j=0;j<k;j++);
}
//使硬件或软件操作停止
void iap_IDLE()
{
IAP_CONTR=0; //禁止IAP读写擦除
IAP_CMD=0; //等待
IAP_TRIG=0; //命令未触发
IAP_ADDRH=0x80; //高位数据地址
IAP_ADDRL=0; //低位
}
//从数据里面读取数据
uchar iap_READ(uint addr)
{ uchar datas;
IAP_CONTR=IAP_EN; //控制允许位
IAP_CMD=CMD_READ; //写入读命令
IAP_ADDRL=addr; //自定义地址
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a; //命令有效
IAP_TRIG=0xa5;
_nop_();
datas=IAP_DATA;
iap_IDLE();
return datas; //返回读出的数据
}
//写一个比特ISP写到某个地方
void iap_PROGRAM(uint addr,uchar datas)
{
IAP_CONTR=IAP_EN;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=datas;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_IDLE();
}
//擦掉某个区域
void iap_ERASE(uint addr)
{
IAP_CONTR=IAP_EN;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_IDLE();
}
void uart_init(void) //串口的初始化
{
TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2
TH1=0xfd;//设置波特率为9600
TL1=0xfd;
TR1=1;//启动定时器/计数器1
SCON=0x50; //0101 0000.串口工作方式1,允许串行控制
PCON=0x00;//设置SMOD=0
IE=0x90; //CPU允许中断,串行允许中断
TI=1;//直接使用printf必须加入此句才能实现发送
}
main()
{
int i;
union
{
float x;
uchar s[4];
}fasong;
fasong.x=3.4;
iap_ERASE(iap_ADDRESS); //擦除扇区
for(i=0;i<4;i++)
{
iap_PROGRAM(iap_ADDRESS+i,fasong.x);//向这个区间512字节里面写东西
}
uart_init(); //串口初始化
while(1)
{
for(i=0;i<4;i++)
{
printf("iap_READ[%d]=%.1f \n",i,iap_READ(iap_ADDRESS+i)); //在串口上输出
delay(500);
}
}
}
请各位大神看看,是哪有问题呀?
先往EEPROM里写一个字节数据,或四个单字节数据,看看读写有没有问题,然后再找其他的原因
串口只能发送uchar数据,你可以使用printf来输出
本公司专业做台湾麦肯单片机销售及方案开发;专注于小家电及消费类电子产品开发已有8年时间,需要的请联系本人!电话:15889377840 微信: hanlie2345678 韩生!QQ:459023641
好的
(⊙o⊙)…是用的printf输出,串口显示的全是0.0。
虽然不知道你在说什么 但是浮点是四字节32位的数据 如果没记错的话是 符号位31 指数位30-24 小数位 23-0 所以说如果是字符发送的话需要发送四个字符 最后还要把四字节转化成浮点
应该是读的方式和写的方式的差异,送入数据时以float类型送入,送出时不注意,传递的时以char形式传递。就有可能造成这种情况,在送入时,应该将float转换成char类型送入,然后在以char送出,再转换成float类型,就可以解决。
好的,我试试,谢谢哈!