最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

EMC 编程技巧

IT圈 admin 40浏览 0评论

2024年3月30日发(作者:尧思彤)

一、C编程技巧

1. 注意WDT的溢出,如果程序开了WDT,但是没有定时执行WDTC指令的话,

程序就回出错误,可以在调试阶段不开WDT,在程序最终完成的时候,在最后一

步加入WDT功能.

2. C中定义的位识符,不可以直接用C语言操作,必须用汇编操作.比如:

Static unsigned char flag1@0x08;

Static bit key_valid@0x08@0;

…………

key_valid=1;(不能执行)

_asm

{BS %flag1,0}(可以执行)

3. 对于端口进行位操作时候,以下表达式不能执行:

if((P7_2= =0)||(P7_1= =0))

必须改写为:

if((P7&0x06)= =0x04)||(P7&0x06)= =0x02))

4. 下面语言不能执行:

temp6=(P7&0x07) (为什么?)

必须用汇编改写成:

_asm

{

MOV A,%P7

AND A,0x07

MOV %temp6,A

}

5.所有的位标志,都不能直接操作,必须先转换成字节类型再操作。

6.中断的设置TCC,CONT,ISR,IMR,之类的操作都必须用汇编,用C直接

执行时,常常出错误。

7.在中断保护和中断服务程序中,最好使用汇编,不要使用C,否则出现错误。

8.通过对CONT的bit6赋值可以开关总中断,但是不能当ENI和DISI使用,

因为CONT不可进行位操作,一旦操作CONT,整个CONT寄存器就会重新赋

值,而使得预分频器和分频比被重新设置。一般程序中只使用CONTW一次,

用于设置预分频器等;在这一次设置中,bit6的值可以确定在设置CONTW后,

全局中断是被打开还是关闭,如果bit6为0,则打开全局中断,否则则关闭全局

中断。然后不管在这里是打开还是关闭全局中断,都可以在后面的程序中使用

ENI和DISI来打开和关闭全局中断。

9.IOCF(IMR)是对于各个分中断的,允许和禁止设定。

10.0X3F(ISR)用于存储产生的中断标志。中断后需要将标志位清0。

11.使用中断前的操作顺序:设置CONTW(设置TCC)设置IOCFENI

进入中断后:DISIISR判断(TCC重新赋值)清ISR标志位

12. 虽然可以支持32bit数据类型,但是不支持32bit乘除法,不过32bit数据可

以做移位操作。

13. 在做充电放电检测时候,在外中断产生后的中断服务程序中,用放电电阻放

电是最有效的方式。

14. 子程序调用前需要指定子程序的页面,但是子程序执行完后,会自动返回原

来的调用页,所以调用子程序后,不需要使用页面返回指令。

15.最好少用移位指令,好象问题多多。

16.注意所使用的数据类型,如果数据长度超出范围,就会出现IDE很容易死

掉。特别在做乘法和除法的时候。

17. 注意程序中出现如果错误连续使用了两个“@”,IDE将会崩溃或者无法编译。

如:static bit moto_oprating@@0x20@3;

18.尽量少用乘法,除法,取模等运算。对于RAM稍多的MCU还可以接受,

但是对于153,156之类的MCU,尽量不用。极易出错误。

19.对于使用了多个if—else的中断服务程序中,如果多次调用一个延时程序,

IDE仿真时候很易出错。可以尝试调用另个延时程序,并在另一个延时程序中使

用另一个变量。

二、汇编编程技巧

1.当程序多于1K时,将出现跳页情况,这时如果有开中断处理程序,在进入中

断后,一定要把STATUS的PS0、PS1位复位为0(即回到第0页ROM),否则

当遇到有JMP或CALL等跳转指令时,程序将会出错!!!

2.当程序多于1K而使用跳转指令BS STATUS PS0或BS STATUS,PS1时,将会

影响到中断程序的中断时间,期分频系数不预计(即TCON受影响);并且中断

自动关闭。跳转返回后,一定要重新开中断(如ENI)。

3.注意子程序的嵌套级数。一般硬件所允许的X级堆栈至少减去一个中断程序所

用,即子程序最好使用X-1个嵌套;否则将会出错。

4.任何对R2(即PC)进行直接修改的指令,如:ADD R2,A | MOV R2,A | BC R2,x

等都将会使PC的第9位、10位清零,因此产生的跳转只限于一个程序的前256

个地址。TBL指令即除外,不会改变PC的9位、10位;执行TBL==PC+1+A;

可以解决以前对R2(即PC)直接修改所产生的后果。一般查表子程序放于程序

最前端,就是为了避开9位、10位清零。

5.八位单片机的高电平一般为4.5~5V,而低电平一般为1V以下;如何让单片

机产生一个2.5V电压呢?可以把要输出2.5V电平的I/O口设置为输出状态,并

置为高电平;接着把该输出口设置为输入状态,这时将输出一个2.5V电平电压。

5. 由于一个中文为两个字节,所以在注释时应当小心注意,避免在程序的注释

出现半个中文字的乱码现象;一旦出现这样的问题,可以导致编译出错或功

能不正常。

6. 对于P6.2口,需要先执行MOV A,@0x00;CONTW将TS bit设置为0后才

可以将它作为普通IO口使用。

2024年3月30日发(作者:尧思彤)

一、C编程技巧

1. 注意WDT的溢出,如果程序开了WDT,但是没有定时执行WDTC指令的话,

程序就回出错误,可以在调试阶段不开WDT,在程序最终完成的时候,在最后一

步加入WDT功能.

2. C中定义的位识符,不可以直接用C语言操作,必须用汇编操作.比如:

Static unsigned char flag1@0x08;

Static bit key_valid@0x08@0;

…………

key_valid=1;(不能执行)

_asm

{BS %flag1,0}(可以执行)

3. 对于端口进行位操作时候,以下表达式不能执行:

if((P7_2= =0)||(P7_1= =0))

必须改写为:

if((P7&0x06)= =0x04)||(P7&0x06)= =0x02))

4. 下面语言不能执行:

temp6=(P7&0x07) (为什么?)

必须用汇编改写成:

_asm

{

MOV A,%P7

AND A,0x07

MOV %temp6,A

}

5.所有的位标志,都不能直接操作,必须先转换成字节类型再操作。

6.中断的设置TCC,CONT,ISR,IMR,之类的操作都必须用汇编,用C直接

执行时,常常出错误。

7.在中断保护和中断服务程序中,最好使用汇编,不要使用C,否则出现错误。

8.通过对CONT的bit6赋值可以开关总中断,但是不能当ENI和DISI使用,

因为CONT不可进行位操作,一旦操作CONT,整个CONT寄存器就会重新赋

值,而使得预分频器和分频比被重新设置。一般程序中只使用CONTW一次,

用于设置预分频器等;在这一次设置中,bit6的值可以确定在设置CONTW后,

全局中断是被打开还是关闭,如果bit6为0,则打开全局中断,否则则关闭全局

中断。然后不管在这里是打开还是关闭全局中断,都可以在后面的程序中使用

ENI和DISI来打开和关闭全局中断。

9.IOCF(IMR)是对于各个分中断的,允许和禁止设定。

10.0X3F(ISR)用于存储产生的中断标志。中断后需要将标志位清0。

11.使用中断前的操作顺序:设置CONTW(设置TCC)设置IOCFENI

进入中断后:DISIISR判断(TCC重新赋值)清ISR标志位

12. 虽然可以支持32bit数据类型,但是不支持32bit乘除法,不过32bit数据可

以做移位操作。

13. 在做充电放电检测时候,在外中断产生后的中断服务程序中,用放电电阻放

电是最有效的方式。

14. 子程序调用前需要指定子程序的页面,但是子程序执行完后,会自动返回原

来的调用页,所以调用子程序后,不需要使用页面返回指令。

15.最好少用移位指令,好象问题多多。

16.注意所使用的数据类型,如果数据长度超出范围,就会出现IDE很容易死

掉。特别在做乘法和除法的时候。

17. 注意程序中出现如果错误连续使用了两个“@”,IDE将会崩溃或者无法编译。

如:static bit moto_oprating@@0x20@3;

18.尽量少用乘法,除法,取模等运算。对于RAM稍多的MCU还可以接受,

但是对于153,156之类的MCU,尽量不用。极易出错误。

19.对于使用了多个if—else的中断服务程序中,如果多次调用一个延时程序,

IDE仿真时候很易出错。可以尝试调用另个延时程序,并在另一个延时程序中使

用另一个变量。

二、汇编编程技巧

1.当程序多于1K时,将出现跳页情况,这时如果有开中断处理程序,在进入中

断后,一定要把STATUS的PS0、PS1位复位为0(即回到第0页ROM),否则

当遇到有JMP或CALL等跳转指令时,程序将会出错!!!

2.当程序多于1K而使用跳转指令BS STATUS PS0或BS STATUS,PS1时,将会

影响到中断程序的中断时间,期分频系数不预计(即TCON受影响);并且中断

自动关闭。跳转返回后,一定要重新开中断(如ENI)。

3.注意子程序的嵌套级数。一般硬件所允许的X级堆栈至少减去一个中断程序所

用,即子程序最好使用X-1个嵌套;否则将会出错。

4.任何对R2(即PC)进行直接修改的指令,如:ADD R2,A | MOV R2,A | BC R2,x

等都将会使PC的第9位、10位清零,因此产生的跳转只限于一个程序的前256

个地址。TBL指令即除外,不会改变PC的9位、10位;执行TBL==PC+1+A;

可以解决以前对R2(即PC)直接修改所产生的后果。一般查表子程序放于程序

最前端,就是为了避开9位、10位清零。

5.八位单片机的高电平一般为4.5~5V,而低电平一般为1V以下;如何让单片

机产生一个2.5V电压呢?可以把要输出2.5V电平的I/O口设置为输出状态,并

置为高电平;接着把该输出口设置为输入状态,这时将输出一个2.5V电平电压。

5. 由于一个中文为两个字节,所以在注释时应当小心注意,避免在程序的注释

出现半个中文字的乱码现象;一旦出现这样的问题,可以导致编译出错或功

能不正常。

6. 对于P6.2口,需要先执行MOV A,@0x00;CONTW将TS bit设置为0后才

可以将它作为普通IO口使用。

发布评论

评论列表 (0)

  1. 暂无评论