1.unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; 这是定义了一个一维数组dispbit,可是code在这里是什么意思啊???
2.void T1zd(void) interrupt 3 //3定时器1的中断号 1定时器0的中断号 0外部中断1 2外部中断2 4串口中断
{
TH1 = 0x1c; //12.000
TL1 = 0x18;
LedNumVal++;
如上是一个定时响应程序,我的问题是interrupt 3是怎么定义的,我并没有定义过啊,而且头文件中#include <reg52.H>,#include <intrins.h>好像也没有定义过,求人解惑下,谢谢!!
1。“code”是单片机C语言特有的关键字
在单片机中RAM的空间特别小,特别珍贵。RAM空间,存放变量。而一些常量,比如码表等常量放在ROM中。所以单片机中code就是告诉单片机这个数据放入ROM中。
本例中dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; 数组内容为常量,故加上code,以节约RAM的空间。
其实code放在unsigned char 前也可以,比如code unsigned char dispbit[8]效果一样。
2.关于void T1zd(void) interrupt 3
“interrupt ”是单片机c语言中断关键字,至于后面的0,1,2,3,4,5,分别表示
0-外部中断0
1-定时器0
2-外部中断1
3-定时器1
4-串口中断
5-定时器2
“interrupt ”是单片机c语言中断关键字,是c51 语言在单片机中规定的,在程序编译时指明中断的类型。当相应的中断发生时,并执行这个中断函数。
本例中当定时器计数时间一到(即 TH1和TL1全部计满,并溢出 ),便执行下面程序,将0x1c放到 TH1中 0x18放到TL1 中,再开始重新计数(不断加1),每计满一次 LedNumVal值 加1。如此下去。。。
在单片机中RAM的空间特别小,特别珍贵。RAM空间,存放变量。而一些常量,比如码表等常量放在ROM中。所以单片机中code就是告诉单片机这个数据放入ROM中。
本例中dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; 数组内容为常量,故加上code,以节约RAM的空间。
其实code放在unsigned char 前也可以,比如code unsigned char dispbit[8]效果一样。
2.关于void T1zd(void) interrupt 3
“interrupt ”是单片机c语言中断关键字,至于后面的0,1,2,3,4,5,分别表示
0-外部中断0
1-定时器0
2-外部中断1
3-定时器1
4-串口中断
5-定时器2
“interrupt ”是单片机c语言中断关键字,是c51 语言在单片机中规定的,在程序编译时指明中断的类型。当相应的中断发生时,并执行这个中断函数。
本例中当定时器计数时间一到(即 TH1和TL1全部计满,并溢出 ),便执行下面程序,将0x1c放到 TH1中 0x18放到TL1 中,再开始重新计数(不断加1),每计满一次 LedNumVal值 加1。如此下去。。。
温馨提示:答案为网友推荐,仅供参考
第1个回答 2011-03-01
1.code 是把数组固定到ROM里面,而不是放在RAM里面,减少RAM的使用量,例如使用51单片机的时候如果数组大于256B,那么RAM就不够用了,所以把不会改变的数组放到ROM里面,当然,如果是会时常变化的数组,是不能固定到ROM中的;
2.都是这么用,应该是编译器设定的,你就当成是在KEIL编译器下编写51中断程序的模块吧。
2.都是这么用,应该是编译器设定的,你就当成是在KEIL编译器下编写51中断程序的模块吧。
第2个回答 2011-03-02
1,code的意思就是告诉编译器将这个一维数组做为常量存放在程序存储器ROM或flash里面
2,不用定义,直接写就好就像写调用的子程序一样
2,不用定义,直接写就好就像写调用的子程序一样
第3个回答 2011-03-02
举个例子给你说明:
这个二进制数为0010000000010000
其中21H=00100000 20H=00010000
CLR C ;C清零
XCH A,21H ;交换A与21H的值,A=00100000
RRC A ;将A中值右移一位高位补0(C),A=00010000
XCH A,21H ;交换A与21H的值,21H=00010000
XCH A,20H ;交换A与20H的值,A=00010000
RRC A ;将A中值右移一位高位补0(C),A=00001000
XCH A,20H ;交换A与20H的值,20H=00001000
此时原二进制数变成了0001000000001000
可见:
1、程序完成的逻辑功能是使21H和20H中的16位二进制数右移一位,并使最高位为0,一般称为逻辑右移一位。
2、可以用MOV指令,修改后程序段如下:
CLR C
MOV A,21H
RRC A
MOV 21H,A
MOV A,20H
RRC A
MOV 20H,A
3、有所差别。虽然从16位右移功能来说两者的功能是相同的,但第一个程序段执行后,累加器A的内容仍维持原值,而第二个程序段执行后将改变A中的数值。
这个二进制数为0010000000010000
其中21H=00100000 20H=00010000
CLR C ;C清零
XCH A,21H ;交换A与21H的值,A=00100000
RRC A ;将A中值右移一位高位补0(C),A=00010000
XCH A,21H ;交换A与21H的值,21H=00010000
XCH A,20H ;交换A与20H的值,A=00010000
RRC A ;将A中值右移一位高位补0(C),A=00001000
XCH A,20H ;交换A与20H的值,20H=00001000
此时原二进制数变成了0001000000001000
可见:
1、程序完成的逻辑功能是使21H和20H中的16位二进制数右移一位,并使最高位为0,一般称为逻辑右移一位。
2、可以用MOV指令,修改后程序段如下:
CLR C
MOV A,21H
RRC A
MOV 21H,A
MOV A,20H
RRC A
MOV 20H,A
3、有所差别。虽然从16位右移功能来说两者的功能是相同的,但第一个程序段执行后,累加器A的内容仍维持原值,而第二个程序段执行后将改变A中的数值。
第4个回答 2018-07-05
空气传感器一般使用GP2Y1010AU0F,proteus里面是没有的,你可以用一个电位器来模拟,GP2Y1010AU0F传回的是一个模拟信号。本回答被网友采纳