微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC12C5A60S2单片机给EEPROM存一个float型,然后读出来发送到串口。为啥串口接收到的都是0.0?求大神帮助!

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);
         }
    }
}
请各位大神看看,是哪有问题呀?

先往EEPROM里写一个字节数据,或四个单字节数据,看看读写有没有问题,然后再找其他的原因

串口只能发送uchar数据,你可以使用printf来输出

  本公司专业做台湾麦肯单片机销售及方案开发;专注于小家电及消费类电子产品开发已有8年时间,需要的请联系本人!电话:15889377840 微信: hanlie2345678 韩生!QQ:459023641

好的

(⊙o⊙)…是用的printf输出,串口显示的全是0.0。

虽然不知道你在说什么  但是浮点是四字节32位的数据 如果没记错的话是 符号位31  指数位30-24 小数位 23-0   所以说如果是字符发送的话需要发送四个字符  最后还要把四字节转化成浮点

应该是读的方式和写的方式的差异,送入数据时以float类型送入,送出时不注意,传递的时以char形式传递。就有可能造成这种情况,在送入时,应该将float转换成char类型送入,然后在以char送出,再转换成float类型,就可以解决。

好的,我试试,谢谢哈!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top