STC12C5A60S2单片机给EEPROM存一个float型,然后读出来发送到串口。为啥串口接收到的都是0.0?求大神帮助!

2019-07-15 11:29发布

#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 ",i,iap_READ(iap_ADDRESS+i)); //在串口上输出
         delay(500);
         }
    }
}
请各位大神看看,是哪有问题呀?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
人中狼
1楼-- · 2019-07-15 16:32
先往EEPROM里写一个字节数据,或四个单字节数据,看看读写有没有问题,然后再找其他的原因
左耳朵的耗子
2楼-- · 2019-07-15 17:27
串口只能发送uchar数据,你可以使用printf来输出
hanlie2345678
3楼-- · 2019-07-15 20:33
  本公司专业做台湾麦肯单片机销售及方案开发;专注于小家电及消费类电子产品开发已有8年时间,需要的请联系本人!电话:15889377840 微信: hanlie2345678 韩生!QQ:459023641
0o丨丨丨o0
4楼-- · 2019-07-16 00:12
人中狼 发表于 2017-04-04 21:38
先往EEPROM里写一个字节数据,或四个单字节数据,看看读写有没有问题,然后再找其他的原因

好的
0o丨丨丨o0
5楼-- · 2019-07-16 03:35
 精彩回答 2  元偷偷看……
1030402679
6楼-- · 2019-07-16 09:24
虽然不知道你在说什么  但是浮点是四字节32位的数据 如果没记错的话是 符号位31  指数位30-24 小数位 23-0   所以说如果是字符发送的话需要发送四个字符  最后还要把四字节转化成浮点

一周热门 更多>