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

2020-01-21 21:46发布

单片机是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
中间那么多的发送都被吃了?????
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
Edwardwei
1楼-- · 2020-01-22 10:59
oktek 发表于 2014-8-14 09:46
iaddr=sector_addr & 0xfe00;
你这句为什么要和0xfe00运算?
你擦除和写入的地址都不一样。 ...

这个是看郭天祥的书的。 擦除是擦除一个扇区,然后每个扇区的前七位是一样的,所以用的0xfe00,我是这样理解的。
oktek
2楼-- · 2020-01-22 11:14
 精彩回答 2  元偷偷看……
Edwardwei
3楼-- · 2020-01-22 13:19
oktek 发表于 2014-8-14 09:59
我记得STC的每扇区是512字节,只要擦除地址在这个扇区中任意一个字节都会擦除整个扇区。
你去查下手册,看 ...

我把地址都改成一样的还是不行。。 而且我最奇怪的是为啥中间那么多的发送都没有了?!!
oktek
4楼-- · 2020-01-22 17:07
Edwardwei 发表于 2014-8-14 10:02
我把地址都改成一样的还是不行。。 而且我最奇怪的是为啥中间那么多的发送都没有了?!! ...

不知道你的代码是不是全写在一个文件里?如果在不同的文件里的话要包含头文件。
笨一点的办法就是你的函数只保留发送那一句,看下问题到底是出在哪。
Edwardwei
5楼-- · 2020-01-22 20:35
oktek 发表于 2014-8-14 10:06
不知道你的代码是不是全写在一个文件里?如果在不同的文件里的话要包含头文件。
笨一点的办法就是你的函 ...

我搜到别人写的一个,发现能用。看样子郭天祥这书里的代码有问题。。
oktek
6楼-- · 2020-01-22 22:35
Edwardwei 发表于 2014-8-14 10:15
我搜到别人写的一个,发现能用。看样子郭天祥这书里的代码有问题。。

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

一周热门 更多>