开关控制LED点亮AT89S52单片机程序讲解

开关控制LED点亮AT89S52单片机程序讲解,第1张

#include"reg51.h"

#include"stdio.h"

sbit led=P1^0//LED灯接P1.0口,低电平有效。

sbit key=P1^1//按键接P1.1口,低电平有效。

bit key_flag=0//给你定义一个按键标志,为后面点亮LED保持使用

void main(void)//进入主程序

{

led=1开机的时候保持LED不亮

while(1)//进入主程序循环状态,一直在这个while循环里检测

{

if(key==0)//如果有按键被按下

{

key_flag = ~key_flag//将这个标志取反,如果在按下前,他是1,则变为0,如果是0,则变为1.

while(!key)//按键是否松开,如果松开,上面的取反有效,否则一直不变LED的状态。

}

if(key_flag)//如果这个标志为1,则LED=0,就是点亮了。

{led=0}//点亮

else{led=1}//否则就是熄灭LED指示灯。

}

}

}

如果原来的程序还能运行,那么,最大的可能是烧写端口的某一个管脚被静电烧坏了。

程序调试过程中,因为需要经常接触电路和芯片,很容易出现这样的状况。

注意防静电。

以下程序仿真成功,你试试看。

#include

<reg52.h>

#define

uchar

unsigned

char

#define

TL_0SET

(256

-

25)

sbit

P1_0=P1^0

sbit

P1_1=P1^1

sbit

P1_2=P1^2

sbit

P1_3=P1^3

sbit

P1_6=P1^6

sbit

P1_7=P1^7

bdata

uchar

x=0

sbit

p16=x^0

sbit

p17=x^1

sbit

flag=x^2

uchar

i,

j

void

e0int()

interrupt

0

//用外部中断0作控制开关,控制四选一数据选择器的输出

{

x++

if(x

==

4)

x

=

0

P1_7

=

p16

P1_6

=

p17

}

void

time0()

interrupt

1

{

//T0定时25us,T0的中断服务程序

TL0

=

TL_0SET

+

8//加8,是对程序做一个误差补偿,因为从进入定时中断,到执行中断里的第一句程序,是有时间间隔的,在此做一个误差补偿

i++

P1

=

i

P1_7

=

p16

P1_6

=

p17

}

void

main()

{

TR0

=

0

TMOD

=

0x02

TL0

=

TL_0SET

TR0

=

1

//T0定时器开始工作

ET0

=

1

EX0

=

1//外部中断0允许

IT0

=

1//外部中断0由下降沿触发

EA

=

1

P1_0

=

0

P1_1

=

0

P1_2

=

0

P1_3

=

0

flag

=

0

while(1)

{}

}


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

原文地址: http://outofmemory.cn/yw/7764597.html

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

发表评论

登录后才能评论

评论列表(0条)

保存