找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

请按照“小灯亮灭时序图”的要求,用C语言编写主函数,谢谢

查看数: 7796 | 评论数: 27 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-10-21 17:25

正文摘要:

请按照“小灯亮灭时序图”的要求,用C语言编写主函数,谢谢了! 单片机P1口接3个LED灯,分别为:LED1、LED2、LED3 单片机P2口接3个LED灯,分别为:LED11、LED12、LED13 (粗横线为灯亮的时间段)

回复

ID:86913 发表于 2017-2-27 17:19
在各位朋友的热情帮助下,这个问题终于懂了,衷心地感谢帮助过我的朋友们,祝你们快乐、健康!
ID:86913 发表于 2016-11-20 20:00
谢谢27楼,我再检查一遍。
ID:140371 发表于 2016-11-8 22:52
24楼的程式:我用 KEIL 下的DEBUG  測試.看來是正常的..並無只有LED1一个灯一闪一闪的,其余的灯都不亮。的情況....
檢查程式中使用的 IO口與實驗板的IO口是否相符。LED接線有皆對嗎
ID:86913 发表于 2016-11-8 16:26
回复24楼,您好。您修改后的程序我已试过了,只有LED1一个灯一闪一闪的,其余的灯都不亮。请您在方便的时候再看一下,谢谢您了!
ID:140371 发表于 2016-10-29 23:02
#include <reg52.h>
sbit Led1 = P1^7;
sbit Led2 = P1^6;
sbit Led3 = P1^5;
sbit Led11 = P2^6;
sbit Led12 = P2^7;
sbit Led13 = P2^5;
char Led1Tab[]={1,1,0,0,0,0,0,0,0,0};
char Led2Tab[]={0,0,0,1,0,0,0,0,0,0};
char Led3Tab[]={0,0,0,0,0,1,1,1,1,0};

char Led11Tab[]={1,0,0,0,0,0,0,0,0,0};
char Led12Tab[]={0,0,0,1,1,0,0,0,0,0};
char Led13Tab[]={0,0,0,0,0,0,1,1,0,0};
void delay1ms(int del)
  {
          int i,j;
        for(j=0;j<del;j++)
        for(i=0;i<120;i++);
  }

main()
{
        char i;
        while(1)
        {
       
                if(Led1Tab[i])
                        {
                                Led1=0;
                        }
                else
                        {
                                Led1=1;
                        }
               
                if(Led2Tab[i])
                        {
                                Led2=0;
                        }
                else
                        {
                                Led2=1;
                        }
                if(Led3Tab[i])
                        {
                                Led3=0;
                        }
                else
                        {
                                Led3=1;
                        }
               
               
                if(Led11Tab[i])
                        {
                                Led11=0;
                        }
                else
                        {
                                Led11=1;
                        }
               
                if(Led12Tab[i])
                        {
                                Led12=0;
                        }
                else
                        {
                                Led12=1;
                        }
               
                if(Led13Tab[i])
                        {
                                Led13=0;
                        }
                else
                        {
                                Led13=1;
                        }
                       
                i++;
                if(i>9)
                i=0;
                 
                 delay1ms(500);        
               
        }



}

你試看看  ,(之前 if(i<9).i=0,是錯誤 )
ID:86913 发表于 2016-10-29 16:42
10楼的程序:
#include <reg52.h>
sbit Led1 = P1^0;
sbit Led2 = P1^1;
sbit Led3 = P1^2;
sbit Led11 = P2^0;
sbit Led12 = P2^1;
sbit Led13 = P2^2;
char Led1Tab[]={1,1,0,1,0,1,1,1,1,0};
char Led11Tab[]={1,0,0,1,1,0,1,1,0,0};
delay1ms(int del) {char i; int j;
for(j=0;j<del;j++)  
for(i=0;i<110;i++);
}
main()
{         
char i;         
while(1)         
{                 
if(Led1Tab[i])                 
{                        
Led1=1;                  
}                 
else                 
{                        
Led1=0;                 
}                                 
if(Led11Tab[i])                 
{                        
Led11=1;                 
}                 
else                 
{                        
Led11=0;                 
}                                 
  i++;                 
  if (i<9)                        
  i=0;                 
  delay1ms(500); //延時500 Ms         
}         
}    //以led1 表示P1  led11 表示P2
ID:143706 发表于 2016-10-24 21:42
void main(void)
{
     while (1)
   {
       LED1=0;LED11=0;          // 注意:1个循环用时5秒!!!!1
       Delay(500);            //这里LED1=0 ,应是 Delay(1000);  
       LED11=1;
       Delay(500);          //这里 LED11=1,应是Delay(1000);
       LED1=1;
       Delay(500);
       LED2=0;LED12=0;
       Delay(500);           //这里LED12=0,应是 Delay(1000);
       LED2=1;
       Delay(500);
       LED3=0;LED12=1;
       Delay(500);            //这里LED3=0,应是Delay(2000)
       LED13=0;
       Delay(1000);
       LED13=1;   
       Delay(500);           //这里LED13=1,应是Delay(1000)
       LED3=1;
           Delay(500);
   }
}
ID:143706 发表于 2016-10-24 21:42
void main(void) {      while (1)    {        LED1=0;LED11=0;          // 注意:1个循环用时5秒!!!!1        Delay(500);            //这里LED1=0 ,应是 Delay(1000);          LED11=1;        Delay(500);          //这里 LED11=1,应是Delay(1000);        LED1=1;        Delay(500);        LED2=0;LED12=0;        Delay(500);           //这里LED12=0,应是 Delay(1000);        LED2=1;        Delay(500);        LED3=0;LED12=1;        Delay(500);            //这里LED3=0,应是Delay(2000)        LED13=0;        Delay(1000);        LED13=1;           Delay(500);           //这里LED13=1,应是Delay(1000)        LED3=1;            Delay(500);    } }
ID:143108 发表于 2016-10-24 21:40
用延时控制或者用定时器控制
ID:123732 发表于 2016-10-24 20:10
本帖最后由 刘海龙 于 2016-10-24 23:23 编辑
tmxk0574 发表于 2016-10-24 19:57
延时函数中把600改为110后,程序和实际就差不多了

1ms延时程序中的600是在STC增强型51单片机上使用的(速度比传统51单片机快5-10倍),传统的51单片机(比如AT89S52、STC89C52)需要把600改为125左右。
ID:86913 发表于 2016-10-24 19:57
延时函数中把600改为110后,程序和实际就差不多了
ID:86913 发表于 2016-10-24 14:47
ID:86913 发表于 2016-10-24 14:40
怎么没有我传上的视频,视频不能上传吗
ID:86913 发表于 2016-10-23 21:26
十分感谢刘先生,使我学到了新的知识!
十楼朋友们的程序我也去试试,学习学习,也非常感谢十楼朋友对我的的帮助!
ID:86913 发表于 2016-10-23 21:14
把上面的主函数高电平点亮改成低电平点亮,现在看来动作对头了!
另外,我弄不明白,小灯实际亮灭的时间跟程序里的延时时间相差太多了!是什么原因?
ID:86913 发表于 2016-10-23 20:53
我是低电平灯亮,我按照你上面给的主函数,再去试一下,谢谢您啊
ID:140371 发表于 2016-10-23 08:02
#include <reg52.h> sbit Led1 = P1^0; sbit Led2 = P1^1; sbit Led3 = P1^2; sbit Led11 = P2^0; sbit Led12 = P2^1; sbit Led13 = P2^2; char Led1Tab[]={1,1,0,1,0,1,1,1,1,0}; char Led11Tab[]={1,0,0,1,1,0,1,1,0,0}; delay1ms(int del) {char i; int j; for(j=0;j<del;j++)  for(i=0;i<110;i++); } main() {         char i;         while(1)         {                 if(Led1Tab[i])                 {                         Led1=1;                  }                 else                 {                         Led1=0;                 }                                  if(Led11Tab[i])                 {                         Led11=1;                 }                 else                 {                         Led11=0;                 }                                  i++;                 if (i<9)                         i=0;                 delay1ms(500); //延時500 Ms         }          }  //以led1 表示P1  led11 表示P2
ID:66840 发表于 2016-10-22 17:07
不知道你电路是怎么连接的,我写的是高电平灯亮,你也可以改成低电平灯亮
ID:66840 发表于 2016-10-22 16:59
void main()
{
        while(1)
        {
                LED1 = 1; //灯亮
                LED11 =1;
                Delay(500);//延时500ms
                LED11 =0; //灯灭
                Delay(500); //延时500ms
                LED1 = 0; //灯灭
                Delay(500); //延时500ms
            LED2 = 1; //灯亮
            LED12 = 1; //灯亮
            Delay(500); //延时500ms
            LED2 = 0; //灯灭
            Delay(500); //延时500ms
            LED12 = 0; //灯灭
        LED3 = 1; //灯亮
        Delay(500); //延时500ms
        LED13 = 1; //灯亮
        Delay(1000); //延时1000ms
        LED13 = 0; //灯灭
        Delay(500); //延时500ms
        LED3 = 0; //灯灭
        
        }
}
ID:123732 发表于 2016-10-22 13:57
tmxk0574 发表于 2016-10-22 11:23
程序中延时时间不对呀,一个循环要求应该是5秒(请看时序图),而程序中P1口亮灭加起来只有3秒(应该是5秒 ...

你理解错了,只给你解释一小段,你可以实际把我写的烧进去用LED灯实验,不要凭想象。
LED1=0;LED11=0;          // LED1从此处开始亮
       Delay(500);            //这里LED1=0 ,应是 Delay(1000);  延时500ms
       LED11=1;
       Delay(500);          //这里 LED11=1,应是Delay(1000);这里又延时了500ms
       LED1=1;           //这里才把LED1关闭,所以LED1在第一段时连续亮了500+500=1000ms
ID:86913 发表于 2016-10-22 13:34
回楼上,主要是P1、P2同时运行的程序我不知道怎么写,
ID:86913 发表于 2016-10-22 13:09
刘先生,[测试2]程序中延时时间不对呀!按照“小灯亮灭时序图”要求,一个循环

用时为5秒。(P1、P2各是5秒,因P1、P2同时运行的,所以一个循环只用5秒),下

面延时时间不对的语句后面,我作了说明。望您好再帮助改一下,谢谢!(我自己

不会改)
void main(void)
{
     while (1)
   {
       LED1=0;LED11=0;       //注意了---1个循环用时5秒!!!!
       Delay(500);    //LED1=0应是Delay(1000)
       LED11=1;
       Delay(500);    // LED11=1应是Delay(1000)
       LED1=1;
       Delay(500);
       LED2=0;LED12=0;   
       Delay(500);     //LED12=0应是 Delay(1000)
       LED2=1;
       Delay(500);
       LED3=0;LED12=1;
       Delay(500);    //LED3=0应是Delay(2000)
       LED13=0;
       Delay(1000);  
       LED13=1;   
       Delay(500);     //LED13=1应是 Delay(1000)
       LED3=1;
           Delay(500);
   }
}
ID:111634 发表于 2016-10-22 12:43
编个延时500ms,然后需要输出脉冲,调用若干就行。例如2*500=1000ms、4*500=2000ms.
ID:86913 发表于 2016-10-22 11:23
本帖最后由 tmxk0574 于 2016-10-22 15:24 编辑

[测试2]程序中延时时间不对呀,按照“小灯亮灭时序图”要求,一个循环用时为5秒。(P1、P2各是5秒,因P1、P2同时运行的,所以一个循环只用5秒),下面延时时间不对的语句后面,我作了说明。望您好再帮助改一下,谢谢!(我自己不会改)
void main(void)
{
     while (1)
   {
       LED1=0;LED11=0;          // 注意:1个循环用时5秒!!!!1
       Delay(500);            //这里LED1=0 ,应是 Delay(1000);  
       LED11=1;
       Delay(500);          //这里 LED11=1,应是Delay(1000);
       LED1=1;
       Delay(500);
       LED2=0;LED12=0;
       Delay(500);           //这里LED12=0,应是 Delay(1000);
       LED2=1;
       Delay(500);
       LED3=0;LED12=1;
       Delay(500);            //这里LED3=0,应是Delay(2000)
       LED13=0;
       Delay(1000);
       LED13=1;   
       Delay(500);           //这里LED13=1,应是Delay(1000)
       LED3=1;
           Delay(500);
   }
}
ID:123732 发表于 2016-10-21 23:24
测试2.rar (450 Bytes, 下载次数: 8)

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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