▂谋ァMou﹎ 发表于 2012-6-18 11:55:20

求高手帮我解释下这程序 本人是新手 解析详细。 求助

控制要求为:(1)正常情况下,8个发光二极管常亮。(2)按下K1时,第1个和第8个发光二极管闪烁,闪烁间隔时间为1s。(3)按下K2时,8个发光二极管闪烁,闪烁间隔时间为2s。(4)发光二极管由单片机P0口控制。 程序:#include<reg51.h>#include<stdio.h>#include<intrins.h>sbit P30=P3^0;sbit P31=P3^1;unsigned char count;void delay(unsignedi){    unsigned char a,b,c;for(;i>0;i--)    for(c=167;c>0;c--)      for(b=171;b>0;b--)            for(a=16;a>0;a--);      _nop_; }void main (void) {    P0=0XFF;while(1){     if (P31==0)   while(1){if (P31==1)break;P0=0X81;delay (1);P0=0;delay(1);}if(P30==0)while(1){count=0;if (P30==1)    break;P0=0;delay(2);P0=0XFF;delay(2); } }}

笨鸟不飞 发表于 2012-6-18 11:55:21

//只是要注释吗,不才,注释一下
//其实最好有电路图,单片机编程和电路图是一致的
#include<reg51.h>//包含的51单片机头文件

#include<stdio.h>//头文件

#include<intrins.h>//头文件

sbit P30=P3^0;//位定义,定义P30为P3口第0位,即当程序使用P30时候就是P3的第0位

sbit P31=P3^1;//位定义,定义P31为P3口第1位,即当程序使用P31时候就是P3的第1位

unsigned char count;//定义一个计数的

void delay(unsignedi)//延时程序

{

    unsigned char a,b,c;

for(;i>0;i--)

    for(c=167;c>0;c--)

      for(b=171;b>0;b--)

            for(a=16;a>0;a--);

      _nop_;

}

void main (void)

{
   //正常情况下
    P0=0XFF;//P0口初始化,全部置1,各位即 1111 1111,最好如这样写P0 = 0xff

while(1) //程序无限执行

{

    if (P31==0)//有按键按下,P3口第1位对应按键

   while(1)   //有按键按下时,执行

{

if (P31==1) //松开按键时

break;   //恢复原始状态

P0=0X81;    //P0口LED赋值 1000 0001即将第8位和第1位点亮

delay (1);//延时

P0=0;      //熄灭

delay(1);//延时

}

if(P30==0)//当P3对应的第0位按键按下

while(1) //程序执行

{

count=0; //计数,这个没用到吧

if (P30==1) //松开按键

    break;

P0=0;      //P00000 0000全灭

delay(2);//延时

P0=0XFF;   //P0   1111 1111全亮

delay(2); //延时

}
}

}

zty 发表于 2012-6-19 19:49:49

:D老兄
我看你还是编个PLC好得多

rencaixiaomeng 发表于 2012-6-20 17:30:50

程序看得似懂非懂哎那个P0是控制发光二极管的端口 有八个发光二极管,估计是个8位的二进制,每个位控制相应的二极管,main()函数的一开始就把0xff赋给P0 应该是P0的某位为1,则对应的二极管为亮的状态吧;然后进入一个死循环,循环一开始判断P31是否为0,是则执行一个循环,直到P31等于1跳出循环,每循环一次把0X81赋给P0,即把10000001赋给P0,这样八个二极管的第1个和第8个发光二极管亮,第2~7个发光二极管暗,然后调用delay函数,再把0赋给P0,这样发光二极管就全部为暗的状态,然后再调用delay函数,P31应该是K1的状态,K1按下时为0,K1没有按下时则为1,而delay函数应该是延迟函数,把一个n做实参发给delay( ),则延迟n秒再执行后面的语句,这里把1发给delay函数,所以是延迟1秒,这样一直循环直到放开K1,每循环一次第1个和第8个发光二极管闪烁一次;第二个if判断P30是否为0,是则再执行一个循环,循环跟上面差不多,把0赋给P0,则全部二极管暗,隔两秒把0XFF赋给P0,则全部二极管亮,然后停两秒继续,直到P30等于1退出循环不知道对不对,个人理解,仅供参考:$

woawn 发表于 2012-7-25 22:21:50

rencaixiaomeng 发表于 2012-6-20 17:30 static/image/common/back.gif
程序看得似懂非懂哎那个P0是控制发光二极管的端口 有八个发光二极管,估计是个8位的二进制,每个位控制相 ...

老兄你解释有一点不对啊,“把10000001赋给P0,这样八个二极管的第1个和第8个发光二极管亮,第2~7个发光二极管暗”这个我不敢苟同我感觉现在的单片机板都是要在端口为0的时候才使发光二级管发亮的,除非这个是他自己做的电路板,我看了楼主的程序我感觉相当的不规范,可能还没有学好就写了啊。

woawn 发表于 2012-7-25 22:23:37

楼主的延时函数写的太神器了,还有就是不规范,比如说应该是程序分层设计才好

chen654601304 发表于 2014-1-11 22:35:09

这程序好像错的地方很多哈。

沉思的牛 发表于 2014-3-23 20:29:56

笨鸟不飞已经给你注释得很详细了
正如他说的一样最好把原理图一起发上来
页: [1]
查看完整版本: 求高手帮我解释下这程序 本人是新手 解析详细。 求助