x0为启动按钮,x1为停止按钮。y0~y7为8盏灯。程序在按下启动按钮后,灯1先亮,1秒(T0延时)后灭,1秒后(T1延时)灯2亮,依次循环。当按下x1后,循环结束。
按下x0后,m0得电为1并自保持,此时1秒计时器T0计时,1秒后T0常开点闭合1秒计时器T1计时,再过1秒T1计时结束常闭点断开T0线圈。
使用注意事项:
当M0为1时,在T0触点的上升沿来时k3M10这个二进制数乘以2再写入k3M10中。
K3M10代表M10~M21共12个辅助继电器的组合,那么可以将K3M10看作是一个二进制数。程序未启动时,M10~M21均为0。
此时M10~M21为1,当T0触点的上升沿来时k3M10(此时为1)这个二进制数乘以2再写入k3M10中(写入后为2)。
流程:1.点亮1个灯;
2.延时100毫秒
3.灭第一个灯,点亮第二个灯;
4延时100毫秒;
。。。
依次类推,直到灭第8个灯,再返回到1,重新开始。
设一个标志位flag, 以标志位的5种状态对应发光二极管的5种工作状态,如当flag=1发光二极管工作在1,当flag=2发光二极管工作在2,......!然后根据定时器定时功能,5秒到,刷新flag的值,程序如下/*程序功能:定时5S到切换LED显示状态.
作者:w418781840.2008.5.29 */
FLAG BIT 30H 定义标志位
ORG 0
LJMP MAIN
ORG 0BH
LJMP AGA
主程序
ORG 0030H
MAIN: MOV FLAG,#01H 标志位清0
MOV TMOD,#01H 赋值50MS
MOV TH0,#3CH
MOV TL0,#0B0H
MOV R0,#100 中断100*50=5S
SETB EA
SETB ET0
SETB TR0
SJMP $
中断服务程序
AGA: MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R0,LOOP 5S到否?否,返回
INC FLAG 到,标志加1
MOV A,FLAG
CJNE A,#05,L1 扫描5种状态了否?
MOV FLAG,#01H 是,归0,重新开始
切换程序
L1: CJNE A,#01H,L2 判断是否是状态1?否,转判断2
LCALL LED1 是,调有状态1
SJMP LOOP 返回
L2: CJNE A,#02H,L3 以下跟上面判断相同
LCALL LED2
SJMP LOOP
L3: CJNE A,#03H,L4
LCALL LED3
SJMP LOOP
L4: CJNE A,#04H,L5
LCALL LED4
SJMP LOOP
L5: CJNE A,#05H,LOOP
LCALL LED5
LOOP: RETI
LED子程序区
LED1: RET
LED2: RET
LED3: RET
LED4: RET
LED5: RET
/////////////////
///////////////////////////////
/*程序功能:定时5S到切换LED显示状态.
作者:w418781840.2008.5.29 */
//========声明区===========
#include <reg51.h>
unsigned char count=0
unsigned char flag=1
void led1(void)
void led2(void)
void led3(void)
void led4(void)
void led5(void)
//=========函数=========
main()
{ TMOD=0x01
TH0=(65536-50000)/256
TL0=(65536-50000)%256
EA=1
ET0=1
TR0=1
while(1)
{ switch(flag)
{ case 1:led1()break
case 2:led1()break
case 3:led1()break
case 4:led1()break
case 5:led1()break
}
}
}
//==========中断服务============
void timer0(void) interrupt 1
{ TH0=(65536-50000)/256
TL0=(65536-50000)%256
if(++count==100)
{ count=0
flag++
if(flag==5)
flag=1
}
}
//========5种状态函数区=========
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)