搜索
bottom↓
回复: 17

51单片机会自己跳过一段程序不执行而执行后面的程序?

[复制链接]

出0入0汤圆

发表于 2014-8-14 09:29:20 | 显示全部楼层 |阅读模式
单片机是STC89C52RC,昨天在做它的内置EEPROM实验时,发现怎么弄都读不出正确值。而且调试时发现很奇怪的现象:
void main()
{
        Init_Uart();
        Send_Byte('K');
        s2=0x35;
        ISP_Sector_Erase(0x2002);
        Send_Byte('w');
        ISP_Write(0x2002,s2);
        s3=ISP_Read(0x2002);
        while(1);
}
这是主程序,开头串口发送了K,中间也有发送w,然后再这三个函数里:
void ISP_Sector_Erase(uint sector_addr)
{
        uint iaddr;
        Send_Byte('E');
        iaddr=sector_addr & 0xfe00;
        ISP_ADDRH=(uchar)(iaddr>>8);
        ISP_ADDRL=0x00;
        ISP_CMD=ISP_CMD & 0xf8;
        ISP_CMD=ISP_CMD & EraseCmd;
        ISPgoon();
        ISP_IAP_disable();
}
开头有发送E
void ISP_Write(uint byte_addr,uchar dat)
{
        ISP_ADDRH=(uchar)(byte_addr>>8);
        ISP_ADDRL=(uchar)(byte_addr & 0x00ff);
        ISP_CMD=ISP_CMD & 0xf8;
        ISP_CMD=ISP_CMD | PrgCmd;
        ISP_DATA=dat;
        Send_Byte('J');
        Send_Byte(ISP_DATA);
        ISPgoon();
        ISP_IAP_disable();
}
里面有发送J和写入值
uchar ISP_Read(uint byte_addr)
{
        ISP_ADDRH=(uchar)(byte_addr>>8);
        ISP_ADDRL=(uchar)(byte_addr & 0x00ff);
        ISP_CMD=ISP_CMD & 0xf8;
        ISP_CMD=ISP_CMD | RdCmd;
        ISPgoon();
        ISP_IAP_disable();
        Send_Byte(ISP_DATA);
        Send_Byte('G');
        return (ISP_DATA);
}
最后有发送 读取值和G

理论说串口发送的数据应该是KEwJ55G
然后从串口助手上看到的只有KG
中间那么多的发送都被吃了?????

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-8-14 09:40:27 | 显示全部楼层
是不是要等上一次发送完成再发送下一个

出0入0汤圆

发表于 2014-8-14 09:42:23 | 显示全部楼层
你的sendbye()程序是怎么写的,有没有等待发送完成呢?会不会是后面的数据把前面的给冲掉了。

出0入0汤圆

发表于 2014-8-14 09:44:08 | 显示全部楼层
串口程序有问题吧?

出0入0汤圆

发表于 2014-8-14 09:44:12 | 显示全部楼层
有完整的工程吗?
把Send_Byte的代码弄出来看看

出0入0汤圆

 楼主| 发表于 2014-8-14 09:46:12 | 显示全部楼层
void Init_Uart(void)                 //11.0592
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        SCON=0x50;
        ES=1;
        EA=1;
}

void Send_Byte(uchar byte)
{
        SBUF=byte;
        while(!TI);
        TI=0;
}

这是串口函数的。应该不会有问题啊

出0入0汤圆

发表于 2014-8-14 09:46:49 | 显示全部楼层
iaddr=sector_addr & 0xfe00;
你这句为什么要和0xfe00运算?
你擦除和写入的地址都不一样。

出0入0汤圆

 楼主| 发表于 2014-8-14 09:48:26 | 显示全部楼层
oktek 发表于 2014-8-14 09:46
iaddr=sector_addr & 0xfe00;
你这句为什么要和0xfe00运算?
你擦除和写入的地址都不一样。 ...

这个是看郭天祥的书的。 擦除是擦除一个扇区,然后每个扇区的前七位是一样的,所以用的0xfe00,我是这样理解的。

出0入0汤圆

发表于 2014-8-14 09:59:07 | 显示全部楼层
本帖最后由 oktek 于 2014-8-14 10:02 编辑

我记得STC的每扇区是512字节,只要擦除地址在这个扇区中任意一个字节都会擦除整个扇区。
你去查下手册,看你用的MCU EEPROM的地址表,保证你擦除、写入、读取的是同一个扇区。

另:你直接下载STC最新的下载软件,里面有示例程序,很详细的。

出0入0汤圆

 楼主| 发表于 2014-8-14 10:02:14 | 显示全部楼层
oktek 发表于 2014-8-14 09:59
我记得STC的每扇区是512字节,只要擦除地址在这个扇区中任意一个字节都会擦除整个扇区。
你去查下手册,看 ...

我把地址都改成一样的还是不行。。 而且我最奇怪的是为啥中间那么多的发送都没有了?!!

出0入0汤圆

发表于 2014-8-14 10:06:36 | 显示全部楼层
Edwardwei 发表于 2014-8-14 10:02
我把地址都改成一样的还是不行。。 而且我最奇怪的是为啥中间那么多的发送都没有了?!! ...

不知道你的代码是不是全写在一个文件里?如果在不同的文件里的话要包含头文件。
笨一点的办法就是你的函数只保留发送那一句,看下问题到底是出在哪。

出0入0汤圆

 楼主| 发表于 2014-8-14 10:15:52 | 显示全部楼层
oktek 发表于 2014-8-14 10:06
不知道你的代码是不是全写在一个文件里?如果在不同的文件里的话要包含头文件。
笨一点的办法就是你的函 ...

我搜到别人写的一个,发现能用。看样子郭天祥这书里的代码有问题。。

出0入0汤圆

发表于 2014-8-14 10:23:21 | 显示全部楼层
Edwardwei 发表于 2014-8-14 10:15
我搜到别人写的一个,发现能用。看样子郭天祥这书里的代码有问题。。

你用STC的单片机的话就直接去STC官网下载stc-isp-15xx-v6.77.exe
里面的示例代码很全。

出0入0汤圆

发表于 2014-8-14 10:28:22 | 显示全部楼层
可以试试我这个串口程序,直接用printf()就行。
51单片机串口人机交互调试器

出0入0汤圆

 楼主| 发表于 2014-8-14 10:35:32 | 显示全部楼层
oktek 发表于 2014-8-14 10:23
你用STC的单片机的话就直接去STC官网下载stc-isp-15xx-v6.77.exe
里面的示例代码很全。 ...

嗯嗯,感谢~

出0入0汤圆

发表于 2014-8-14 13:25:02 | 显示全部楼层

stc-isp工具里面的示例代码也不是拿来就能用的,要根据实际改动

出0入0汤圆

发表于 2014-8-14 21:17:57 | 显示全部楼层
串口初始化有问题, 可能串口初始化为,直接发送, 无缓冲.

出0入0汤圆

发表于 2014-11-1 02:45:57 | 显示全部楼层
ES=1;改成 ES=0;
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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