51系列单片机的按键中断控制程序

51系列单片机的按键中断控制程序,第1张

void External_Interrupt_0() interrupt 0

{

Count_A = ~ Count_A;

LED1 = ~ LED1;

}

你用外部中断0,是否是想按住按键时就停在哪里,是就这样改一下!void External_Interrupt_0() interrupt 0

{

Count_A = ~ Count_A;

LED1 = ~ LED1; while(!P32);

}

假如P32按下时下降沿或低电平触发,进入外部中断,执行完2条指令取反后,一直等待按键松开。

D2亮(其它灯不亮)→MOV P1,#11111101B

D4亮(其它灯不亮)→MOV P1,#11110111B

D6亮(其它灯不亮)→MOV P1,#11011111B

D8亮(其它灯不亮)→MOV P1,#01111111B

D7不亮(其它灯亮)→MOV P1,#01000000B

D5不亮(其它灯亮)→MOV P1,#00010000B

D3不亮(其它灯亮)→MOV P1,#00000100B

D1不亮(其它灯亮)→MOV P1,#00000001B

并且以此循环。

3次后结束,每个灯点亮1S。

 

别忘了采纳。

1:C51编译器如何区分位地址和字节地址

是靠预定义实现的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者声明了P0端口地址位于0x80,后者说明了P0端口的bit0,即P00位于位地址空间0x80处。这2个0x80具有完全不同的含义,靠关键字sfr和sbit来区别。这样当程序被编译时,编译器会依此编译成相应的汇编语言。例如:

C51语句: P0 = 1;

P0声明为sfr,因此编译成:mov 80h,01h,将把0x01数据送入0x80单元,由于0x80单元物理上对应P0端口,因此,P00脚将输出高电平(其实是呈现高阻态,P0口独有的),其他1-7脚输出低电平。

C51语句: P0_0 = 1;

P0_0声明为sbit,因此编译成:setb 80h,这将把位地址空间的0x80地址的bit的值置1。这个位正是P0口的bit0,执行后,P00将输出高阻态。而P01-7不会变化。

2:C51为什么要嵌套汇编

51单片机一个显著优点就是指令执行时间固定,因此可以适应时序要求严格的场合。例如符合ISO7816协议的cpu卡的读写,对时序要求比较严格。其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就带来几个问题:如何声明函数、参数如何传递等。限于篇幅,不能说得很细。下面举例:

汇编程序单独保存一个文件,加入到工程中,函数如下:

_proc_a:

mov a, r7

inc a

mov r7, a

ret

用c语言在h文件中声明: extern unsigned char proc_a(unsigned char val);

调用时形如: retvalue = proc_a(0x11);

说明:

a:汇编程序如果带参数,则需要在汇编程序前多加一个下划线。而声明它的地方不用加(伟福编译器这么要求的)。

b:函数的形参中第一参数用R7传递,函数返回值用R7返回,这是C51的通用规范。其他参数都有相应规定。函数可以返回一个位,用psw的c位返回。c:上面的语句,执行顺序是把0x11给R7,然后跳转子程序,子程序将它加1后送回。

d:函数跳转到汇编程序时,本区的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考虑调用后是否要恢复这些常规资源。上例中,A的值被函数使用了,编程者不必恢复调用前的值。

以上就是关于51系列单片机的按键中断控制程序全部的内容,包括:51系列单片机的按键中断控制程序、51单片机程序,急救、51单片机的编程问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9280284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存