大型硬件实验周总结

1)经常出现的问题是内存不够,即提示address overflow或者“data” segment too large时,建议把所有int类型的数据改为unsigned char或者char,因为unsigned char的取值范围刚好是0~255,即0x00~0xff;据说可以用xdata区来存储数据,但是我每次编译成功后在仿真时都出错。另外就是改用其他同系列的芯片。我本来使用的是AT89C51,最后改成了AT89C55,程序完全兼容,而且内存较之前有提高(data区128B不变)。MCS51系列单片机基本都兼容。

2)加入按键后发现没有一触发就响应,而是按上一段时间才响应。这是因为没有扫描到,建议把keyScan()放到计时器中断函数里。

3)经常会出现这样的问题:程序自己基本看不出问题,编译也没有问题,但是一仿真就出错。尤其是在加入外部中断的时候,不管怎么按键都没响应。我初步猜想是应为外部中断函数里面嵌套的函数过于复杂而导致栈溢出,后面在这里改进了就没出过问题了。具体方案是设置一个全局变量,中断函数里面只改变这个变量的值,另在其他基本函数中用死循环的方式监测这个值的变化。

4)不能直接访问某一个引脚的值,一定要先sbit定义一下,如 sbit key_w=P3^0;

5)

void delay1ms(void)
{
    unsigned char a,b;
    for(a=199;a>0;a--)
        for(b=1;b>0;b--);
}
void delay100ms(void)
{
    unsigned char a,b,c;
    for(c=7;c>0;c--)
        for(b=74;b>0;b--)
            for(a=95;a>0;a--);
}

6)结构体可以直接给结构体赋值,但不能直接比较。如果没有在定义时初始化就只能在之后对结构体里面的元素分别赋值。

原文地址:https://www.cnblogs.com/viaduct/p/5852315.html