找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1071|回复: 5
打印 上一主题 下一主题
收起左侧

恳请大家帮我检查一下我这个连续读取EEPROM再输出到串口的单片机程序哪里有问题

[复制链接]
跳转到指定楼层
楼主
ID:625292 发表于 2019-10-23 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"
#include "I2C.h"
#define EEPROM_ADDR_Write 0xa0
#define EEPROM_ADDR_Read 0xa1
#define PCF_ADDR_Write 0x90
#define PCF_ADDE_Read 0x91
#define uchar unsigned char
#define uint unsigned int
uchar music[100];
uchar ack, i;
void EEPROM_Read(uchar address);
void main(){
SDA = SCL = 1;
//读取EEPROM
EEPROM_Read(0x00);

//串口验证
TMOD = 0x20;//定时器1设定为工作模式2
TR1 = 1;//打开定时器1,这时有了一个波特率,但不是我们设置的波特率,单片机会检测到数据,却不是我们所发的数据
TH1 = 0xfd, TL1 = 0xfd;//波特率9600
REN = 1;//串口允许接收
SM0 = 0, SM1 = 1;//串口工作方式为模式一,收到停止位才会RI = 1,没有这一步,RI会不停自动置1
i=0;
while(1){
  SBUF = music[ i];
  while(!TI);
  TI = 0;
  if(music[ i] == 0x00)
   break;
  i++;
}

}
void EEPROM_Read(uchar address){
uchar i;
I2C_Start();
I2C_SendByte(EEPROM_ADDR_Write);
I2C_WaitAck();
I2C_SendByte(address);
I2C_WaitAck();
I2C_Start();
for(i=0; i<100; i++){
  music[ i] = I2C_RcvByte();
  if(music[ i] == 0x00){
   I2C_Ack(0);
   I2C_Stop();
   break;
  }
  else{
   I2C_Ack(1);
  }
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:625292 发表于 2019-10-23 17:39 | 只看该作者
从串口会不停读出0x00,但是我代码里面是遇到0x00直接终止啊。。
回复

使用道具 举报

板凳
ID:419968 发表于 2019-10-23 17:41 | 只看该作者
在主程序里,没有调用EEPROM_Read函数
回复

使用道具 举报

地板
ID:419968 发表于 2019-10-23 17:42 | 只看该作者
在主程序里没有调用EEPROM_Read函数
回复

使用道具 举报

5#
ID:213173 发表于 2019-10-23 18:14 | 只看该作者
你的程序不能约束在主循环中运行,一旦跳出while(1),CPU必须从main()入口重新进入,相当于一次热复位。
回复

使用道具 举报

6#
ID:625292 发表于 2019-10-23 20:06 | 只看该作者
wulin 发表于 2019-10-23 18:14
你的程序不能约束在主循环中运行,一旦跳出while(1),CPU必须从main()入口重新进入,相当于一次热复位。

蟹蟹蟹蟹,涨姿势了。。。我都不知道原来还有热复位这种说法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表