利用单片机P1口接8个发光二极管,P0口接8个开关,编程实现,当开关动作时,对应发光二极管的亮或灭 #includ

利用单片机P1口接8个发光二极管,P0口接8个开关,编程实现,当开关动作时,对应发光二极管的亮或灭

#include<reg51.h>
void main(void)
{
unsigned char i;
p0=0xff;
for(;;) {i=p0;p1=i;}
}

我的疑问是: 为什么程序中要引进一个变量i,而不是直接把P0赋值给P1.
为什么要有一个for的死循环。

i=P0;//是检测P0端口的值1或0;以便将检测完的数据赋值给P1,从而实现P1口对应的二极管点亮;
P1=i;//是将检测到的值用发光二极管点亮显示出来。

死循环是一直执行上面两条操作,因为程序一直在检测按键操作,
我只要将开关按下,则对应的P0端口变成0,
同时(P1=i)P1对应的二极管点亮。

你追问的这个这个是用的定时器中断,计数器是在不断的计数的当满值后就产生中断,进入中断重新赋值TL和TH寄存器,再次进行计数,记满后再次中断,如此循环不息。还有就是计数器是一直在不停的计数的,不会因为while(1);而停止!
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-01-15
一般不这样接,应该是led正极接vcc,然后负极接到单片机引脚上。像你那种接法也是可以的。
第2个回答  2012-05-21
可以不用变量,直接P1=P0;
死循环,这个是必须的。因为要不停的用P0来指示P1。
P1=P0 这句执行一次,只是把此时的P0值赋值给P1。而P0的值是可能会变化的。所以要不停的循环赋值。

单片机程序都会是一个死循环程序,因为不死循环,程序终究会执行完,此时程序并不会停止不动,还是要继续执行,此时就会乱跑,所以用个死循环,让程序永远不会执行完。追问

这个程序的意思是P1.1口产生500ms的电平后有产生一个500ms的低电平如此反复的构成一个周期为1S的方波。我的疑问是在每个500ms为什么不用对P1.1口进行死循环保证P1.1口电平的稳定

追答

前面一个例子,死循环不是用来保证稳定的,而是要把真实的状态时时反映出来。前面的例子中,P0何时变化未知,也很随机,所以要时时去读它的状态。
后面这个例子,输出状态很明确,500ms变化一次,那只需要过500ms改变一次就好了。在这500ms内,P1口的状态不用变化,就不需要去给它赋值,它会一直保持这个状态的。

本回答被网友采纳
第3个回答  2012-05-24
越问越乱 多看点书吧

.利用单片机的P1口接8个发光二极管(对应8位二进制数),P3.1接1个开关...
uchar key_scan(void){ if(P3^1==0) \/\/当按键按下是低电平时 { delay_ms(12);\/\/消抖 if(P3^1==0) return 1;} return 0;} void main(){ uchar cnt=0,key;uchar led[9]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};while(1){ key=key_scan();if(key==1) ...

用五一单片机c语言编程,p1口控制八个发光二极管,实现每隔一秒,两两点亮...
P0 = 0x00; \/\/P0.0~P0.7分别接八个发光二极管,刚开始全灭 while(1){ delay(1000);P0 = 0xc0;\/\/点亮前两个发光二极管P0.0和P0.1;delay(1000);\/\/延时1秒 P0 = 0x30;\/\/点亮第三个和第四个LED delay(1000);P0 = 0x0c;delay(1000);P0 = 0x03;} } 二、include <reg52.h>...

怎么写一个开关开关开,就显示八个流水灯闪烁,开关关八个流水灯全灭的...
NEX7: JB P1.7,NEXT8 ;位-为1转移到 接口1第7位,NEXT8 CLR P0.7 ;清0 接口0第7位,SJMP NEX8 ;短转移到 NEX8,NEXT8: SETB P0.7 ;位-置1 接口0第7位,NEX8: SJMP START ;短转移到 START,END ;END 第二种:先说硬件连接 将8个灯接到P1口的8根线法 灯的排列为 1 2 3 ...

设计用8031单片机P1口为输出口控制8只发光二极管循环点亮。1、 画出接...
P1<<=1; \/\/左移一位 该语句等效于 P1=P1<<1 P1|=0x01; \/\/最后一位补1,该语句等效于 P1=P1|0x01 符号"|"表示"或"if(P1==0x7f) \/\/检测是否移到最左端?"=="表示检测符号2端的值是否相等 { delay(30000);P1=0xfe; \/\/重新赋值 } } } ...

设计用8031单片机P1口为输出口控制8只发光二极管循环点亮。1、 画出接...
P1<<=1; \/\/左移一位 该语句等效于 P1=P1<<1 P1|=0x01; \/\/最后一位补1,该语句等效于 P1=P1|0x01 符号"|"表示"或" if(P1==0x7f) \/\/检测是否移到最左端?"=="表示检测符号2端的值是否相等 { delay(30000); P1=0xfe; \/\/重新赋值 } }} 本回答由网友推荐 举报| 答案纠错 | 评论 0 0 ...

单片机的P0口接了8个发光二极 要求使用定时器T0中断实现流水灯操作流水...
include <reg52.h>#define uInt unsigned int#define uChar unsigned char#define TFCNT 46080\/\/经计算,11.0592MHZ,0.05秒需要计数次数uInt timeCnt=0;void init();void main(){uChar leds[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe},*p=leds;init();while(1){if(timeCnt>=10...

在单片机中如何用8个发光管演示出8位二进制数字自减过程?(用c语言...
P1 = abc; \/\/在P1口外接8个LED,低电平发光.abc++; \/\/加,负逻辑将显示为自减.delay(500); \/\/延时,供观察现象.} } === 要求由最高位P0^0作为二进制的最高位。这个新要求,可以在焊接LED器件的时候进行调整。更改一下程序,也不难,如下:include "reg51.h"unsigned char ...

用c语言编写单片机流水灯程序,(8个发光二极管从左至右循环点亮)_百度...
\/\/第一个灯亮 delay();\/\/延时 P3=0xfd;\/\/第二个灯亮 delay();P3=0xfb;\/\/第三个灯亮 delay();P3=0xf7;\/\/第四个灯亮 delay();P3=0xef;\/\/第五个灯亮 delay();P3=0xdf;\/\/第六个灯亮 delay();P3=0xbf;\/\/第七个灯亮 delay();P3=0x7f;\/\/第八个灯亮 delay();} } ...

实现P0口驱动8个发光二极管流水灯点亮,设置三个按键 c51单片机 急...
\/\/按键连接到p2.0、p2.1、p2.2、P2.3,均为开漏输出 unsigned char key_in(void){ XBR0 =0X00;P2=0xff;if(key1==0){ key1=1;delay();\/\/延时 if(key1==0){ while(key1==0);XBR0 =0X02;return(0x32);\/\/返回字符"1"表示按键SW1按下 } } if(key2==0){ key2=1;del...

用51单片机控制八个发光二极管
\/\/ 51单片机控制八个发光二极管 左右循环。include<reg52.h> define uchar unsigned char define uint unsigned int unsigned char TAB[]= {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff}; \/\/ 改变这里 LED 各种花样 uchar t...

相似回答