下列程序,已经经过实验,可以满足题目要求。KEY1 EQU P3.0 KEY2 EQU P3.1 LED1 EQU P3.2 LED2 EQU P3.3 Flag1 EQU 20H.0 Flag2 EQU 20H.1 L_F1 EQU 20H.2 L_F2 EQU
while(1) /* 主循环 */ { if( Key ==0){ for( i = 0; i < 1; i++ ){ LED= 0; /* 端口送高电平,LED熄亮 */ DelayMs(500); /* 延时大概0.5S */ LED = 1; /* 端口送低电平,
再次读取IO口,判断是否为低电平,如果是则表示有有效的按键按下,接着用while判断等待按键释放,然后让连接led的IO口电平取反以控制其亮灭(是强电的灯可以通过此处控制继电器的合、闭来控制灯的亮灭)。
循环点亮LED灯,也就是流水灯效果的控制,可以用定时器来控制,这样做相对代码量较少而时间比较精确,外部中断0接以按键,可以控制动态效果的启停。程序如下:ORG 0000H LJMP MAIN ORG 0003H LJMP EXT0 ;外部中断0,
//打开LED灯点亮 while(1){ if(KEY0_01 == 0)//检测按键是否按下 { Delay_1ms(10);//延时去抖动 if(KEY0_01 == 0)//确定按键按下 { LED1_01 = ~LED1_01;//取反LED灯 [亮 .灭 ]} while(KEY0_0
如下即可:;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口程序
不懂再追问,你只需要把主程序里面的灯定为一个状态,外部中断里面再定一个状态。要亮2次,加个延时,就行了。
P2IFG =0; //中断标志清除,防止配置过程中出现中断标志为1 _EINT(); //开总中断 LPM4; //进低功耗4 } /***端口中断程序***/ pragma vector = PORT2_VECTOR __interrupt void port2(void){ switch
} void main(){while(1){ if(Key==0){ Delay(10); //软件防抖,延时10ms if(Key==0){ LED_1=0; //第一个灯亮 LED_2=1; // Key=1;Delay(250);if(Key==0){ Delay(10); //软件防抖,延
JNZ INT01 ; 8盏全亮后 按一下按键全灭 MOV P1,#0FFH JMP INT02 INT01: RRC A ; 按一下加一个 LED 亮 ( 这是一种方法)MOV P1, A INT02: POP ACC POP PSW RETI
求将C程序变成汇编,功能是利用外部中断0,按一下按键亮一盏LED,在按一下亮2盏,直到亮8盏。
输出控制 如图所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出
方法:1:设定一个变量i,可以从0到3循环的变化 2:检测一个经过消抖处理的按键,按一下,i+1 3:当i值为各个值时,执行相应的花样。流水灯参考程序 include include define uchar unsigned char uchar j,temp;void
; P1口接8个LED.上拉电阻1K ORG 0000H AJMP STARTUP ORG 0030H STARTUP:MOV SP,#60H MOV A,#0AAH LOOP: MOV P1,A ACALL DELAY RLC A SJMP LOOP; 延时的多少决定灯移动速度的快慢 DELAY:MOV R7,#5 DL2:MO
最好还是自己写,有成就感啊。依次点亮的话可以用循环移位加延时的方法,同时亮只要相应位输出相应电平即可,闪亮的话只要同时亮与全灭间加个延时可以解决。当然也可以用定时中断来定时移位或闪亮,一定要自己想法写出来的才能
DJNZ R4,SLCHG LJMP REPEAT ;程序结束,完成一次串并转换 END
void int0_int() interrupt 0 //外部中断0中断后程序会自动跳到这里来执行 { led0 = ~led0; //led0的状态取反 } void main(){ EX0 = 1; //开放外部中断0 EA = 1; //开放总中断 IT0 = 1; //
[高分]求8051单片机外中断控制发光二极管闪烁的程序及其设计图。
首先定义变量类似于P1_2 = P1^2这种,先把这八个管脚全部定义好,之后给个for循环,让P1(假设的你LED灯连接的是P1口)口的P1^0~P1^7相关标志位依次等于0或者1(0还是1需要看你在LED等上给的是高电位亮还是低电位
bit flag=1; //状态1处于灭灯还是亮灯状态的变量,1为依次亮灯,0为依次亮灯 sbit key=P3^7; //按键控制 void init(); //初始化函数 void delay(unsigned int N); //延时函数 void keyscan(); //键盘扫
{ int i=10000; //这个值调整亮灯灭等快慢,越小越快越大越慢 while(i--)return;} //从上到下亮灯 void LED_a(void){ LED_IO1 = 0;delay();LED_IO2 = 0;delay();LED_IO3 = 0;delay();LED_IO4 =
MOVie,#82h;设置中断允许寄存器 MOV30h,#10;MOV31h,#6;30H和31H是两个软件计数器。SETBtr0;启动定时 AJMP$;原地踏步 int_timer:;定时器0中断服务程序。MOVth0,#high(65536-10000);MOVtl0,#low(65536-10000);重设1
如果你用的是89C51单片机的话,外部中断是在P3.2和P3.3引脚,P1口是没有的。所以,如果你既想用外部中断又想用P1口做控制输入端,就需要用“与(或)”逻辑电路从P1口导出中断信号给P3.2和P3.3引脚。P1口是输出
while(1){ P3=0xfe; //第一个灯亮 delay(); //调用延时函数 P3=0xfd; //第二个灯亮 delay(); //调用延时函数 P3=0xfb; //第三个灯亮 delay(); //调用延时函数 P3=0xf7; //第
LED8=1;//LED初始状态为全灭 } void INT0() interrupt 0 { uint i;for(i=0;i<4;i++){ LED8=0;Delay(500);LED8=1;} } void INT1() interrupt 1 { uint i;for(i=0;i<4;i++){ LED1=0;LED
C51单片机程序。利用外部中断INT0,INT1,当INT0产生中断时,使LED8亮8灭闪烁4次;
#include #include void delay_ms(unsigned int x) //误差 0us { unsigned char a,b,c; for(c=x;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void main(void) { ET0=1;//外部中断0、1下降沿中断 ET1=1; EX0=1; EX1=1; EA=1; while(1) P0=0xFF; // P1的8个LED,高电平亮 } void int0_int() interrupt 0 { unsigned char i ,j, tmp=0x01; for(i=3; i>0; i--) for(j=8; j>0; j--) { P0=tmp; delay_ms(500); //500ms闪烁 tmp = _crol_(tmp,1); } } void int1_int() interrupt 2 { unsigned char i ,j, tmp=0x80; for(i=3; i>0; i--) for(j=8; j>0; j--) { P0=tmp; delay_ms(500); //500ms闪烁 tmp = _cror_(tmp,1); } }是外部中断期间当前亮着的LED灯继续亮着,流水不动?很好办呀,进入外部中断时你保存流水灯当前的状态就可以了。比如: ORG 0000H LJMP MAIN ORG 0003H LJMP EXTI0 LED EQU 30H ORG 0030H MAIN: MOV SP,#5FH SETB EX0 SET IT0 SETB EA MOV LED,#FEH LOOP: MOV P0,LED LCALL DELAY MOV A,LED RL A SJMP LOOP DELAY: MOV R2,#100 DELAY1: MOV R3,#250 DJNZ R3,$ DJNZ R2,DELAY1 RET EXTI0: PUSH ACC PUSH LED .....;加入你的中断程序。 POP LED POP ACC RETI
这个很简单的,做毕业设计时间一般充足,建议你复习一下单片机知识很快就能自己写出来了,也可以在网上搜些相关的程序和资料参考,不难的
这个电路很简单,我说一下就可以了。数字式温度传感器用最常用的DS18B20,它只有3个管脚,一个接电源,一个接地,另一个接8051单片机就可以了。温度值用数码管显示。这样整个电路就接好了。如果楼主觉得我回答的可以别忘了给我加分哦,为了你的问题我花费了半天的时间啊。程序如下: #include #include #define uchar unsigned char #define uint unsigned int #define Self_Define_ISP_Download_Command 0x3D sfr IAP_CONTR=0xE7; sbit DQ = P3^5; //DS18B20接入口 uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90} ; char bai,shi,ge; //定义变量 void Init_Com(void) { TMOD = 0x20; SM0=0; SM1=1; REN=1; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; EA=1; ES=1; } /*延时子函数*/ void delay(uint num) { while(num--) ; } /*************DS18b20温度传感器函数*********************/ Init_DS18B20(void) //传感器初始化 { uchar x=0; DQ = 1; //DQ复位 delay(10); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us //450 DQ= 1; //拉高总线 delay(20); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(30); } //读一个字节 ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(8); } return(dat); } //写一个字节 WriteOneChar(unsigned char dat) { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(10); DQ = 1; dat>>=1; } delay(8); } //读取温度 int ReadTemperature(void) { uchar a,b; uint t; float tt; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar();//低位 b=ReadOneChar();//高位 tt=(b*256+a)*0.0625*100;//2个8位合成16位 t=(int)tt; /*t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; */ return(t); } /*显示子函数*/ void display(int bai,int shi,int ge) { int temp; temp=ReadTemperature();//读温度 bai=temp/1000;//显示百位 shi=temp%1000/100;//显示十位 ge=temp%100/10;//显示个位 //xiao=temp%10; P2=0xfd; //位选 P0=0X7f; //显示小数点 delay(500); P2=0xfe; P0=table[bai];//显示千位 delay(500);//一小段延时动态显示 P2=0xfd; P0=table[shi];//显示百位 delay(500); P2=0xfb; P0=table[ge];//显示十位 delay(500); P2=0xf7;// 显示° P0=0x9c; // delay(50); } void main() { Init_Com(); while(1) { display(bai,shi,ge);//显示函数 } } void UART_Interrupt_Receive(void) interrupt 4 { unsigned char k=0; unsigned int a,b; if(RI==1) { RI=0; k=SBUF; if(k==Self_Define_ISP_Download_Command) { for(a=1000;a>0;a--) for(b=100;b>0;b--); //延时约1S IAP_CONTR = 0x60; } } else { TI=0; } }
循环点亮LED灯,也就是流水灯效果的控制,可以用定时器来控制,这样做相对代码量较少而时间比较精确,外部中断0接以按键,可以控制动态效果的启停。程序如下: ORG 0000H LJMP MAIN ORG 0003H LJMP EXT0 ;外部中断0,控制流水灯启停 ORG 000BH LJMP T0ISR ;定时0控制流水灯循环点亮 ORG 0030H MAIN: MOV TMOD,#01H ;设置定时器0工作模式 MOV TH0,#HIGH(65536-60000) ;60毫秒定时 MOV TL0,#LOW(65536-60000) SETB ET0 SETB EA MOV A,#0FEH ;LED等初始化 MOV P0,A SJMP $ EXT0: CPL TR0 RETI T0ISR: CLR TR0 MOV TH0,#HIGH(65536-60000) MOV TL0,#LOW(65536-60000) SETB ET0 RL A MOV P0,A ;循环点亮LED灯 RETI END
main() { // CLK_CKDIVR=0x00; CLK_Init(); IO_Init(); led_on=0; //timer1_init(); EXTI_DeInit();?/初始化外部中断IO口 _asm("rim"); while(1) { cbi(PA_ODR,4); } } @far @interrupt void TIM1_UPD_OVF_IRQHandler(void) { TIM1_SR1 = 0x00; // 清除更新标志 } @far @interrupt void EXTI0 (void)//外部中断子函数 { if(PA_on) { sbi(PA_ODR,4);PA_on=0;}//PA4为灯亮 else { cbi(PA_ODR,4);PA_on=1;}//PA4为灯灭 EXTI_CR1=0x00 ; } 不懂再追问,你只需要把主程序里面的灯定为一个状态,外部中断里面再定一个状态。要亮2次,加个延时,就行了。
解:信号量初值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(); //调用子函数 } } }