文档介绍:编译器选择8级优化时,可能会出现错误。刚写好的程序,建议先用0级优化看能否正常运行,再用更高的优化等级进行优化.
a、、2、3组都可以,不能是0,否则可能会main()函数冲突。从一个中断程序中调用函数必须和中断使用相同的寄存器组(摘自《Keil Cx51 编译器用户手册中文版》P129).建议把原本中断函数需要调用的函数直接写在中断函数里,无须调用.
  b、51单片机的中断有两个优先级。一个中断不会打断另一个相同优先级的中断。:低优先级的中断函数都用 using 1,高优先级的中断都用 using 2 。这样不会冲突。
C语言无符号数容易犯的错误。若定义成有符号数char,则不会陷入死循环。
main()
{
unsigned char i;
for (i = 2; i>=0; i--)
{
    printf(”%d",i);
  }
}
C51忌讳使用绝对定位_at_,因为只要定义变量和变量的作用域,编译器就会把一个固定地址给这个变量,无须人工将其绝对定位,这样可能引发其他问题。
bit与sbit的区别:bit定义的位标量的地址是随机的,—2FH,而sbit可以访问芯片内部RAM中的可寻址位和特殊功能寄存器中的可寻址位。注意不能直接在程序里用P1^0等位变量,需要经过sbit定义才可以使用。
例如:
bit tem ;
sbit led=P1^0 ;
tem的地址是随机分配的,而led的地址则固定为0x90。0 。sbit变量后面需要跟等号=。
为了避免由于使用参数宏而带来意外的错误,需要注意以下几点:
宏的参数必须带括号,例如 #define CIRCLE_SQUARE(R) *(R)*(R)
对所使用的参数宏进行简单地展开检查;
使用简单表达式、对参数加括号、避免节外生枝的使用方式(例如“++”、“—-"一类都属于不必要的附件运算);
在参数宏定义时,对于运算顺序通过括号进行明确的限定,只要遵循以上几点,就可以避免大多数应用场合的意外错误。
手把手教你写程序
内容:从最简单的程序入手,手把手教你写程序,让同学们拿到一个复杂的程序或者任务,能快速找到切入点,写出程序,再在此基础上优化程序。当拿到一个单片机任务时,不要急于动手写程序,先仔细分析它的以下几个点:
1、它要单片机整体实现什么功能
2、功能细分(模块化),先干什么,再干什么,最后干什么
3、画初步流程图,(把几个模块画出即可)
4、模块之间的分析:一个模块到另一个模块之间,怎么变换,怎么连接(优化流程图)
5、单个模块分析:每个模块要做什么(流程图细化)
6、所有模块结合连接,细化所有流程图
7、分析单个模块每步要用到的方法或者指令
8、总流程图定型
9、纸上写程序,对照流程图分析其可行性,若不可行则返回
10、上机调试,加注释
11、从小到大,一个功能一个功能地调试;
以上十一步,缺一不可(小程序例外)
切记:流程图的确定很重要,需反复修改
大忌:拿到任务,不仔细分析就写程序。即使是小程序,我们也要养成良好的编程习惯,不要一味的追求结果。写小程序可能比别人快,若是大程序,一旦出现思维混乱,或者出现程序调试不出结果,那么你花在调试上的时间,要比别人的多。           !!!!!!磨刀不误砍柴工!!!!!!
程序的优化:属于后期工作,只有调试出来后,才去优化,如果一开始优化和写程序同时进行,一是加重你的思考量,,写一个程序,本身头脑就处于紧张的状态,思考的问题就很多,如果此时把优化程序也考虑进去,你脑袋的负荷无疑加重,若你头脑精明,你可以把优化的地方,先在纸上记下来,等到调试结果正常,再把你想到的,优化的地方加进去。
7、如果在中断程序中改变了多字节类型的变量,那么中断程序以外的程序中(主程序,子函数)要使用该多字节类型变量的话,读写前要关中断,.(实质为资源冲突)
举一反三:
其他的数据类型也可能有这种影响。例如:长整型、浮点型。
例如:
unsigned int ms_counter;                      
void T0()
{       
    //定时器程序每100毫秒中断一次,程序略     
    if (ms_counter〈1000) ms_counter++;
}
void main(void)
{
//初