鱼C论坛

 找回密码
 立即注册
查看: 3619|回复: 7

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

[复制链接]
发表于 2012-6-18 11:55:20 | 显示全部楼层 |阅读模式
7鱼币
控制要求为:(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(unsigned  i)  
{
    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(unsigned  i)  //延时程序

{

    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;      //P0  0000 0000  全灭

  delay(2);  //延时

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

  delay(2); //延时

  }
  }

}

最佳答案

查看完整内容

//只是要注释吗,不才,注释一下 //其实最好有电路图,单片机编程和电路图是一致的 #include//包含的51单片机头文件 #include//头文件 #include//头文件 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(unsigned i) //延时程序 { ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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(unsigned  i)  //延时程序

{

    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;      //P0  0000 0000  全灭

  delay(2);  //延时

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

  delay(2); //延时

  }
  }

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-19 19:49:49 | 显示全部楼层
:D老兄
我看你还是编个PLC好得多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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退出循环  不知道对不对,个人理解,仅供参考:$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-25 22:21:50 | 显示全部楼层

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

使用道具 举报

发表于 2012-7-25 22:23:37 | 显示全部楼层
楼主的延时函数写的太神器了,还有就是不规范,比如说应该是程序分层设计才好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-11 22:35:09 | 显示全部楼层
这程序好像错的地方很多哈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-23 20:29:56 | 显示全部楼层
笨鸟不飞  已经给你注释得很详细了
正如他说的一样最好把原理图一起发上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 14:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表