KEY EQU P1.0 LED EQU P1.4 ORG 0000H LJMP MAIN ORG 0030H MAIN:SETB LED LP:JB KEY,LP JNB KEY,CPL LED SJMP LP END
(2. 设计方法 从上面的要求我们可以看出,L1到亮灭受开关K1来控制,我们给L1亮灭定义出不同的ID号,当L1在亮时,ID=0;当L1在灭时,ID=1;分别给出不同的ID号我们就能够完成上面的任务了 4.汇编程序: ID EQU 30H K1 BIT P3.2 L1 BIT P0.0 ORG 0000H CLR P1.7 MOV ID,#00H
{ //按下相应的按键,led显示相应的按键 delay(1000);if(!key3){ LED3=0;//led3灯亮 } } else {LED3=1;}//led3灯灭 if(!key4){ //按下相应的按键,led显示相应的按键 delay(1000);if(!key4){ LED4=0;//led4灯亮 } } else {LED4=1;}//led4灯灭 } } 这个是可以
可以用外部中断来控制;如果单片机中断是低有效,将按钮设置成按下时为低电平,触发中断,在中断中设置一个标志位,然后退出中断;主程序来判断这个标志位,如果为1,则退出led跑灯程序; 如果为0,则继续跑灯。如果单片机中断是高有效,将按钮设置成按下时为高电平,同理。 设置一个全局变量a,并且赋
用单片机写一个LED彩灯跑动的循环程序,用按键控制一个标志,由这个标志来判断是不是进入彩灯的循环程序。
1,程序开始准备 2,标志位为0?是则等待中断,为1则执行下一步 3,亮灯,延时一秒,灭灯,延时一秒 4,跳到第二步步 中断程序:1,标志位取反 2,reti 还有就是你按键接错了,你那样是查询方法,不是中断。
KEY2 BIT P2.4 ORG 0000H LJMP START ORG 000BH LJMP Timer0Interrupt START:MOV SP,#60H MOV R2,#20 SETB LED SETB KEY1 CLR KEY2 CLR TR0 LCALL InitTimer0 LOOP:;add your code here!JNB KEY1,DELAY10MS JB KEY1,CPL TR0 JNB TR0,D1 CLR LED MOV TH0,
如图 我想用单片机汇编语言来编写中断程序,要求是 LED灯初始化是灭的,当按下按钮灯亮一秒灭一秒,
8个开关分别接P1.0-P1.7 控制输出是P0.0-P0.7LED灯 还有开关延时6S和按住一个按钮锁住其它按钮 例如:按下P0.0松开按钮 然后延时5s灯亮并且在5s之内锁住P0.1-P0.7的输入 --P0.0,是接的按键? 前面不是说接到 LED 的吗?--延时 5s ?前面不是说 6s 吗?
你这个程序错误太多了,用汇编时关键的几个程序段都未分清:主程序、定时器T0中断、定时器T1中断等,因MOV IE,#8AH语句说明用的是中断方式,显然漏了 ORG 0000H、ORG 000BH和ORG 001BH伪指令。要改时间可改 CJNE R7,#160,JW中的160。
我写的这个程序应该可以,按一下灯亮,再按一下灯灭 include "REG52.H"sbit LED1_01 = P1^1; //LED灯 sbit KEY0_01 = P1^2; //按键 void Delay_1ms(unsigned int Time){ unsigned int x, y;for(x = Time; x > 0; x--)for(y = 120; y > 0; y--);} int ma
用AT89C2051单片机(可以换成任意的51单片机)仿真,控制一个LED灯闪烁,LED灯接在P1.7脚上。程序如下 LED1 BIT P1.7 MAIN:CPL LED1 ACALL DELAY SJMP MAIN DELAY:MOV R7,#0;延时子程序 MOV R6,#0 LOP:DJNZ R6,DJNZ R7,LOP RET END 仿真图如下
如何用汇编语言控制led灯闪烁?
加409031101,可以讨论下
利用二台微机进行串口通信,要求甲(乙)机在屏幕上输入的字符能显示在乙(甲)机上。二、设计内容 1. 二台微机的串口互连(用零MODEM方式,只需三条线)。2. 用汇编语言编程,设计一个对话输入、输出框,在甲(乙)机的输入框中输入的字符能显示在乙(甲)机的输出框中。3. 串口为全双工通
//发送端 include "common.h"uchar keyStatusList[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar keyValueList[]={1,2,3,4,5,6,7,8};void main(){ uchar keyStatus=0,i;TMOD=0x20;TH0=0xFD;TL0=0xFD;TR1=1;SCON=0x40;while(1){ keyStatus=P1;for(i=0;i<8;i+
甲机很简单,自己做吧,乙机程序:LED1 BIT P1.0LED2 BIT P1.1ORG 0000HLJMP MAINORG 0023HLJMP UARTIORG 0030HMAIN: MOV TMOD,#20H MOV TH1,#0FDH MOV TL1,#0FDH MOV SCON,#50H SETB TR1 SETB ES SETB EA CLR ALOOP: CJNE A,#'A',LOOP1 CPL
CJNE A, B, LOOP ;消抖 MOV SBUF, A ;向串口发送 MOV P1, A ;在本机显示 JNB TI,CLR TI SJMP LOOP ;--- UART_INT:PUSH ACC JB TI, U_EXIT CLR RI MOV A, SBUF ;读出串口收到的信息 MOV P0, A ;送P0口显示 U_EXIT: POP ACC
汇编语言设计甲机通过串口控制乙机LED闪烁程序
;;AVR汇编程序实例 ;使用INT0、INT1控制LED数码管显示 ;Mega16 4MHz ;.include "m16def.inc".def temp = r23 ;临时变量 .def counter = r24 ;计数变量 .def flag=r25 ;中断向量区配置,FLASH空间$000~$028 .org $000 jmp RESET ; 复位处理 jmp EXT_INT0 ; IRQ0 中断向量 nop reti ;
;晶振12M LED BIT P1.0 KEY1 BIT P2.0 KEY2 BIT P2.4 ORG 0000H LJMP START ORG 000BH LJMP Timer0Interrupt START:MOV SP,#60H MOV R2,#20 SETB LED SETB KEY1 CLR KEY2 CLR TR0 LCALL InitTimer0 LOOP:;add your code here!JNB KEY1,DELAY10MS JB
COUNTEQU30H;定时计数值 KEYCTEQU31H;计时比较值 POINTEQU32H;按键次数 LEDEQU33H ORG0000H SJMPSTART ORG000BH LJMPT0ISR ORG0030H START:MOV SP,#5FH CLR EA MOV TL0,#LOW (65536-50000)MOV TH0,#HIGH(65536-50000);50ms中断一次 MOV COUNT,#0 MOV POINT,#0 MOV KEYCT,#10;0.5s M
用T0或T1定时器定时50ms就行了,并设置为中断方式,每次定时到,中断后对P1.1和P1.7取反,上面连接的二极管就会闪烁了。
你这个程序错误太多了,用汇编时关键的几个程序段都未分清:主程序、定时器T0中断、定时器T1中断等,因MOV IE,#8AH语句说明用的是中断方式,显然漏了 ORG 0000H、ORG 000BH和ORG 001BH伪指令。要改时间可改 CJNE R7,#160,JW中的160。
;P1.0 P1.1接2LED,P2.0接一按键。上电2LED不亮,按第1 次键2LED同时以1S周期闪烁,按第2 次 2LED轮流1S闪烁同此循环。;11 04 17 ORG 00H AJMP MAIN ORG 0BH AJMP T0INT ORG 30H MAIN:MOV TMOD,#01H ;MOV TH0,#3CH MOV TL0,#0B0H SETB EA SETB ET0 MOV R0,#10 K
假设p1.0,p1.1控制两个LED灯,高灭低亮 org 0000h ljmp start org 0030h start clr ea mov sp,#60h setb p1.0 setb p1.1 loop:lcall delay30 clrp1.0 lcall delay30 setb p1.0 lcall delay30 setb p1.1 sjmp loop delay30:延时30毫秒 mov r0,#60 delay1:mov r1,#250
单片机两个led不同频率闪烁 使用中断,汇编语言
main(){ P1=0x55; //P1口初始值 EA=1; //全局中断开 EX1=1; //外部中断0开 IT1=1; //边沿触发,IT1=0表示电平触发 while(1){ //在此添加其他程序 } } /*--- 外部中断程序 ---*/ void ISR_Key(void) interrupt 2 using 1 { //在此处可以添加去抖动程序,防止按键抖动造成错
D10mS:MOV R7,#50 ;延时的时间一般为 5-20mS D1:MOV R6,#100 ;D2:DJNZ R6,D2 ;DJNZ R7,D1 ;RET D10mS就是一个延时程序,调用它后再进行判断电平判断,就避开了按键按下时的抖动.
{ //按下相应的按键,led显示相应的按键 delay(1000);//去抖动 if(!key2) //检测按键确实按下,进行按键处理 { LED2=0;//led2灯亮 //这里可以添加按键按下所需要的操作,如数据加减乘除,蜂鸣器等设备开关 } } else {LED2=1;}//led2灯灭 if(!key3){ //按下相应的按键,led
程序里按键检测应该加延时消抖,在第一个if()下面加延时10毫秒,再检测按键是否按下,确定按下了再执行键值判断,你试试可不可以。
ORG 0030H MAIN:MOV SP,#5FH SETB IT0 SETB EX0 SETB EA MOV A,#0F0H MOV P2,A SJMP EXT0:CPL A MOV P2,A RETI END
如下即可:;ORG 0000H LJMP MAIN DJNZ R7,DJNZ R6, $ - 2 JB P3.2, $ + 8 CPL P1.0 ;LED JNB P3.2,RETI MAIN:MOV IE, #81H SJMP END
求用汇编语言中断用一个按键控制一个灯亮灭加防抖动,灯p2口,按键p3口程序
如下即可:;ORG 0000H LJMP MAIN DJNZ R7,DJNZ R6, $ - 2 JB P3.2, $ + 8 CPL P1.0 ;LED JNB P3.2,RETI MAIN:MOV IE, #81H SJMP END
思路:1,程序开始准备 2,标志位为0?是则等待中断,为1则执行下一步 3,亮灯,延时一秒,灭灯,延时一秒 4,跳到第二步步 中断程序:1,标志位取反 2,reti 还有就是你按键接错了,你那样是查询方法,不是中断。
MOV IE, #82H ;开中断 ;第一秒钟L0,L2亮,第二秒钟L1,L3亮,第三秒L4,L6亮,第四秒钟L5,L7亮,;第五秒L0,L2,L4,L6亮,第六秒钟,L1,L3,L5,L7亮,第七秒钟八个二极管全亮,第八秒钟全灭.MOV 30H, #11111010B MOV 31H, #11110101B MOV 32H, #10101111B MOV 33H,
每当2秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始L1指示灯以0.2秒的速率闪烁,当2秒定时到来之后,L2开始以0.2秒的速率闪烁,如此循环下去。0.2秒的闪烁速率也由定时/计数器T0来完成。p1口接LED。
LED1 EQU P1.0LED2 EQU P1.1ORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN: MOV TMOD,#01H MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) SETB TR0 SETB ET0 SETB EA CLR LED1 SETB LED2 MOV R2,#20 SJMP $T0ISR: CLR TR0
MOV R2,#20 SETB LED SETB KEY1 CLR KEY2 CLR TR0 LCALL InitTimer0 LOOP:;add your code here!JNB KEY1,DELAY10MS JB KEY1,CPL TR0 JNB TR0,D1 CLR LED MOV TH0,#3CH;50MS MOV TL0,#0B0H LJMP LOOP D1:SETB LED LJMP LOOP InitTimer0:MOV TMOD,#01H MO
out porta,temp ; 设置PORTA输出全1 ;设置中断方式 ldi temp, 0x0a out mcucr, temp ; INT0、INT1下降沿触发 ldi temp, 0xc0 out gicr, temp ; 允许INT0、INT1中断 out gifr, temp ; 清除INT0、INT1中断标志位 clr counter clr flag sei ; 使能中断 state: ldi zl, low(led_7 * 2
用汇编怎么实现利用中断控制LED灯定时!S的亮和灭.
;晶振为6MHZ,亮0.7s,灭0.3s,P1.0口输出 WSTA EQU 20H STA BIT WSTA.0 ;亮灭标志位 ORG 0000H LJMP MAIN ORG 000BH LJMP B_T0 ;定时器中断0入口 ORG 0030H MAIN: MOV R0,#20H ;20H-7FH清零 MOV R7,#60H CLR A M01: MOV @R0,A INC R0 DJNZ R7,M01 MOV TMOD,#01H ;方式1定时 MOV TH0,#9EH ;定时50ms MOV TL0,#58H MOV R7,#14 ;0.7s计数 SETB EA ;打开定时器总中断 SETB ET0 ;打开定时器0中断 SETB TR0 ;打开定时器0 CLR STA ;使标志位初始为0 CLR P1.0 ;刚开始为低电平 SJMP $ ;等待中断 B_T0: MOV TH0,#9EH ;定时50ms重设 MOV TL0,#58H JB STA,B01 DJNZ R7,B02 MOV R7,#6 ;0.3s计数 SETB STA SETB P1.0 ;灯灭 SJMP B02 B01: DJNZ R7,B02 MOV R7,#14 ;0.7s计数 CLR STA CLR P1.0 ;灯亮 B02: RETILED EQU P3.3 KEY EQU P3.7 ORG 0000H LJMP START ORG 000BH LJMP T0_INT ORG 0030H ;-------------------------------- START: MOV TMOD, #01H MOV TH0, #HIGH(65536-62500) MOV TL0, #LOW(65536-62500) MOV IE, #82H ;-------------------------------- LP1: SETB LED JB KEY, LP1 CALL DELAY JB KEY, LP1 JNB KEY, $ ;------------------- MOV R2, #160 SETB TR0 CLR LED LP2: JNB TR0, LP1 JB KEY, LP2 CALL DELAY JB KEY, LP2 JNB KEY, $ SJMP LP1 ;-------------------------------- T0_INT: MOV TH0, #HIGH(65536-62500) MOV TL0, #LOW(65536-62500) DJNZ R2, T0_E CLR LED CLR TR0 T0_E: RETI ;-------------------------------- DELAY: MOV R6, #20 DJNZ R7, $ DJNZ R6, $ - 2 RET ;-------------------------------- END
解:信号量初值S1=1,S2=0,S3=0,S4=0,MUTEX=1; int Count=0; repeat repeat repeat repeat P(S1) P(S2) P(S3) P(S4) Send message get message get message get message P(MUTEX) P(MUTEX) P(MUTEX) P(MUTEX) Count=0 Count=Count+1 Count=Count+1 Count=Count+1 V(S2) if(Count=3) if(Count=3) if(Count=3) V(S3) V(S1) V(S1) V(S1) V(S4) V(MUTEX) V(MUTEX) V(MUTEX) until false until false until false until false
把三个口全部赋值,应就可以了吧。 和您一起学习一下。错了的话,请多多包涵! void main() //主函数 { while(1) //大循环 { for(num=0;num<105;num++) //数组循环 { P1=table[num]; //调用数组 P2=table[num]; P3=table[num]; delay_1s(); //调用子函数 } } }
/程序:ex1_1.c //功能:控制一个信号灯闪烁程序 #include //包含头文件REG51.H,定义了MCS-51单片机的特殊功能寄存器 sbit P1_0=P1^0; //定义位名称 void delay(unsigned char i); //延时函数声明 void main() //主函数 { while(1) { P1_0=0; //点亮信号灯 delay(10); //调用延时函数,实际变量为10 P1_0=1; //熄灭信号灯 delay(10); //调用延时函数,实际变量为10 } } //函数名:delay //函数功能:实现软件延时 //形式参数:unsigned char i; // i控制空循环的外循环次数,共循环i*255次 //返回值:无 void delay(unsigned char i) //延时函数,无符号字符型变量i为形式参数 { unsigned char j,k; //定义无符号字符型变量j和k for(k=0;k<i;k++) //双重for循环语句实现软件延时 for(j=0;j<255;j++); }
顺序写也没问题,把他们的时序弄清就行了 。点亮第一组要亮的灯,延时,在改成第二组再延时,继续第三组。延时时还可以干别的,算好时间回来改灯就行了。
程序如下: ;---------------------------------------- ORG 0000H SJMP START ORG 0023H LJMP UART_INT ;---------------------------------------- START: MOV SP, #60H MOV SCON, #50H ;方式1,8-n-1 MOV TMOD, #20H MOV TH1, #0FDH ;波特率设置 MOV TL1, #0FDH ;9600@11.0592MHz SETB TR1 SETB ES ;开放中断 SETB EA LOOP: MOV A, P2 ;读出的拨码开关信息 DJNZ R7, $ ;延时 DJNZ R6, $ - 2 MOV B, P2 ;再读 CJNE A, B, LOOP ;消抖 MOV SBUF, A ;向串口发送 MOV P1, A ;在本机显示 JNB TI, $ CLR TI SJMP LOOP ;---------------------------------------- UART_INT: PUSH ACC JB TI, U_EXIT CLR RI MOV A, SBUF ;读出串口收到的信息 MOV P0, A ;送P0口显示 U_EXIT: POP ACC RETI ;---------------------------------------- END ;----------------------------------------
甲机很简单,自己做吧,乙机程序:LED1 BIT P1.0LED2 BIT P1.1ORG 0000HLJMP MAINORG 0023HLJMP UARTIORG 0030HMAIN: MOV TMOD,#20H MOV TH1,#0FDH MOV TL1,#0FDH MOV SCON,#50H SETB TR1 SETB ES SETB EA CLR ALOOP: CJNE A,#'A',LOOP1 CPL LED1 LCALL DELAY SJMP LOOPLOOP1: CJNE A,#'B',LOOP2 CPL LED2 LCALL DELAY SJMP LOOPLOOP2: CJNE A,#'C'LOOP CPL LED1 CPL LED2 LCALL DELAY SJMP LOOPDELAY: MOV R2,#200DLY: MOV R3,#250 DJNZ R3,$ DJNZ R2,DLY RETUARTI: JBC RI,U01 RETIU01: MOV A,SBUF RETI END
和我们的实验要求好像啊!
/程序:ex1_1.c //功能:控制一个信号灯闪烁程序 #include //包含头文件REG51.H,定义了MCS-51单片机的特殊功能寄存器 sbit P1_0=P1^0; //定义位名称 void delay(unsigned char i); //延时函数声明 void main() //主函数 { while(1) { P1_0=0; //点亮信号灯 delay(10); //调用延时函数,实际变量为10 P1_0=1; //熄灭信号灯 delay(10); //调用延时函数,实际变量为10 } } //函数名:delay //函数功能:实现软件延时 //形式参数:unsigned char i; // i控制空循环的外循环次数,共循环i*255次 //返回值:无 void delay(unsigned char i) //延时函数,无符号字符型变量i为形式参数 { unsigned char j,k; //定义无符号字符型变量j和k for(k=0;k<i;k++) //双重for循环语句实现软件延时 for(j=0;j<255;j++); }
ORG 0000HLJMP MAINORG 0003HLJMP EXT0ORG 000BHLJMP T0ISRORG 0030HMAIN: MOV TMOD,#01H MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) SETB ET0 SETB EX0 SETB IT0 SETB EA MOV P0,#0FFH MOV R2,#20 MOV A,#0FEH CLR 00H SJMP $EXT0 SETB TR0 RETIT0ISR: CLR TR0 MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) SETB ET0 DJNZ R2,T0E MOV R2,#20 CPL 00H JB 00H,T01 MOV P0,A SJMP T0ET01: MOV P0,#0FFHT0E: RETI END
思路: 1,程序开始准备 2,标志位为0?是则等待中断,为1则执行下一步 3,亮灯,延时一秒,灭灯,延时一秒 4,跳到第二步步 中断程序: 1,标志位取反 2,reti 还有就是你按键接错了,你那样是查询方法,不是中断。