单片机常见延时与中断问题及解决方法
中断执行完了,就回到主程序中了。 4、我的单片机这个程序为什么不能完全执行整个程序谁能告诉我!就是没法执行3次亮暗的! 2010-10-20 21:40 提问者:3865203bin3 | 悬赏分:10 ORG 0000H AG:MOV A,#11111110B AG1:RL A MOV P0,A ACALL DELAY DJNZ R0,AG1 ACALL DELAY MOV A,#11111111B MOV P1,A ACALL DELAY MOV P0,#00000000B ACALL DELAY MOV P0,#11111111B ACALL DELAY MOV P0,#00000000B ACALL DELAY MOV P0,#11111111B ACALL DELAY SJMP AG DELAY:MOV R3,#10 D3:MOV R2,#200 D1:MOV R1,#250 D2JNZ R1,D2 DJNZ R2,D1 DJNZ R3,D3 RET END 我是想执行完流水灯亮.就然后执行全亮全暗3次 !可是就是不会跳到全亮全暗3次~~ 答: R0没有赋初值!另外建议不要使用前2B个地址,因为51中断矢量就在这个空间里。建议从0030H开始。以下程序在keil4中仿真成功。 ORG 0000H AJMP AG ORG 0030H AG:MOV A,#11111110B MOV R0,#8 AG1:RL A MOV P0,A ACALL DELAY DJNZ R0,AG1 ACALL DELAY MOV A,#11111111B MOV P1,A ACALL DELAY MOV P0,#00000000B ACALL DELAY MOV P0,#11111111B ACALL DELAY MOV P0,#00000000B ACALL DELAY MOV P0,#11111111B ACALL DELAY SJMP AG DELAY:MOV R3,#10 D3:MOV R2,#200 D1:MOV R1,#250 D2JNZ R1,D2 DJNZ R2,D1 DJNZ R3,D3 RET END 5、STC89C52通过两个外部中断P3.2和P3.3,来控制P1.0和P1.1的数码管亮和灭,一定keil C 说明:通过外部中断0,P1.0的数码管亮,中断结束后,数码管灭;再由外部中断1,P1.1的数码管亮,次中断结束后,数码管灭;简言之就是一个中断只控制一个数码管,中断之间在功能上没有必然的联系,编程环境keil C51。P1.0和P1.1口上接的都是普通LED小灯,数码管=LED小灯。 以下是我编的程序,就是一个中断控制一个数码管,但是当有两个中断时,我就抓瞎了 #include sbit D1=P1^0; void main() { D1=1; EA=1; EX0=1; } void exter() interrupt 0 { D1=0; } 求高手帮我改改程序,改成两个中断的那种,功能要求都写在上面了~3Q,我会去keil里面模拟的~~o()^))o 答: /*模块低电平有效、外部中断0、1为低电平出发*/ #include "reg52.h" void delay( char i) { unsigned char t; while(i--) { for(t=0;t108;t++); } } void INT0_ROUTING() interrupt 0//外部中断0子程序 { P0=0xfe;//LED0点亮 while((P3|0xfb)==0xff);//等待外部中断0口(P3^2松开) delay(10);//延时去抖动 P0=0xff;//LED0熄灭 } void INT0_ROUTING() interrupt 2 { P0=0xfd;//LED1点亮 while((P3|0xf7)==0xff);//等待外部中断1口(P3^3松开) delay(10);//延时去抖动 P0=0xff;//LED1熄灭 } void main() { EA=1;//中断总开关 EX0=1;//外部中断0开 EX1=1;//外部中断1开 /*默认低电平触发*/ while(1);//死循环 防止跑飞 } 6、单片机中断问题,下面这段程序不知道为什么只进一次中断,就没有反应了呢? #include #define uint unsigned int sbit key1=P1^4; sbit key2=P1^5; void delay1ms(uint i) { uchar j; while(i--) { for(j=0;j125;j++) //1ms基准延时程序 { ; } } } void init() { EA=1; //开总中断 ES=1; //开串口中断 TMOD= 0x21; //定时器1定时方式2,定时器1工作于8位自动重载模式, 用于产生波特率 SCON = 0x50; // 设定串行口工作方式1 允许接收 TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1= 0xfd; //11.0592M 波特率9600 TL1= 0xfd; PCON =0x00; // 波特率不倍增 TR1= 1; //启动定时器T1 TR0=1; //启动定时器T0 ET0=1; //打开T0中断 } void key() { if(key2==0) P0=0x3f; delay1ms(5000); P0=0xf3; } void mainxh() { while(1) { key(); P0=0x32; } } void keybreak() { P0=0xf1; delay1ms(5000); P0=0x1f; mainxh(); } void main(void) { init(); mainxh(); } void Time0(void) interrupt 1 { TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值 TL0=(65536-50000)%256; //定时器T0的高8位重新赋初值 if(key1==0) keybreak(); } 这个程序上电后P0口显示0x32;按下key2显示0x3f;key1用于中断,每20ms检测是否有按下key1键,有的话,P0口显示0xf1。 答 : ORG 0000H AJMP MAIN ORG 0001H LJMP INT_0 ORG 30H MAIN:MOV SP,#8FH MOV P0,#0FFH MOV P3,#0FFH SETB IT0 SETB EA SETB EX0 LJMP START START: MOV A,#10000000B LOOP: MOV P0,A RLC A LCALL DELAY LCALL DELAY LJMP LOOP LJMP START; 这句是多余的 根本不会执行 INT_0: PUSH ACC ; 由于p中1断中1A被设为10所以5中7断返回后对A移位没有意义,o A一e直为10 ,并不d是只能中断一1次 . 还有,不清楚key1是什么中断,貌似是键盘扫描吧, while(1) { key(); P0=0x32; } 都进入死
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)