找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7772|回复: 27
收起左侧

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

[复制链接]
ID:86913 发表于 2016-10-21 17:25 | 显示全部楼层 |阅读模式
小灯亮灭时序图.png
请按照“小灯亮灭时序图”的要求,用C语言编写主函数,谢谢了!
单片机P1口接3个LED灯,分别为:LED1、LED2、LED3
单片机P2口接3个LED灯,分别为:LED11、LED12、LED13
(粗横线为灯亮的时间段)
回复

使用道具 举报

ID:123732 发表于 2016-10-21 23:24 | 显示全部楼层
测试2.rar (450 Bytes, 下载次数: 8)
回复

使用道具 举报

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:111634 发表于 2016-10-22 12:43 | 显示全部楼层
编个延时500ms,然后需要输出脉冲,调用若干就行。例如2*500=1000ms、4*500=2000ms.
回复

使用道具 举报

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:86913 发表于 2016-10-22 13:34 | 显示全部楼层
回楼上,主要是P1、P2同时运行的程序我不知道怎么写,
回复

使用道具 举报

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: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:66840 发表于 2016-10-22 17:07 | 显示全部楼层
不知道你电路是怎么连接的,我写的是高电平灯亮,你也可以改成低电平灯亮
回复

使用道具 举报

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:86913 发表于 2016-10-23 20:30 | 显示全部楼层
本帖最后由 tmxk0574 于 2016-10-24 15:01 编辑

小灯运行状况----请看视频
小灯亮灭电路图.png 小灯亮灭时序图.png 小灯亮灭实物图片.png

非常抱歉,因刚接触到单片机,问题又可能没有表达清楚,麻烦您了。能得到您的帮助,非常感谢!
从视频里看到,LED1和LED11没有同时点亮,LED2和LED12也没有同时点亮,LED3比LED13先熄灭,不符合时序图要求。 不知什么原因。
回复

使用道具 举报

ID:86913 发表于 2016-10-23 20:53 | 显示全部楼层
我是低电平灯亮,我按照你上面给的主函数,再去试一下,谢谢您啊
回复

使用道具 举报

ID:86913 发表于 2016-10-23 21:14 | 显示全部楼层
把上面的主函数高电平点亮改成低电平点亮,现在看来动作对头了!
另外,我弄不明白,小灯实际亮灭的时间跟程序里的延时时间相差太多了!是什么原因?
回复

使用道具 举报

ID:86913 发表于 2016-10-23 21:26 | 显示全部楼层
十分感谢刘先生,使我学到了新的知识!
十楼朋友们的程序我也去试试,学习学习,也非常感谢十楼朋友对我的的帮助!
回复

使用道具 举报

ID:86913 发表于 2016-10-24 14:40 | 显示全部楼层
怎么没有我传上的视频,视频不能上传吗
回复

使用道具 举报

ID:86913 发表于 2016-10-24 14:47 | 显示全部楼层
回复

使用道具 举报

ID:86913 发表于 2016-10-24 19:57 | 显示全部楼层
延时函数中把600改为110后,程序和实际就差不多了
回复

使用道具 举报

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:143108 发表于 2016-10-24 21:40 | 显示全部楼层
用延时控制或者用定时器控制
回复

使用道具 举报

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:86913 发表于 2016-10-29 16:39 | 显示全部楼层
10楼编写的的程序风格也比较简明,试了一下,不知道为什么6个灯同时全部点亮了
,并且一直亮着(见图)。因为自己刚刚在学,不知道其中原因。我只是把I/O口改
了一下,以适应我原来 的程序(见图)。有知道的朋友请告诉我,多谢!
webwxgetmsgimg (2).jpg
webwxgetmsgimg (3).jpg
回复

使用道具 举报

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: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-11-8 16:26 | 显示全部楼层
回复24楼,您好。您修改后的程序我已试过了,只有LED1一个灯一闪一闪的,其余的灯都不亮。请您在方便的时候再看一下,谢谢您了!
回复

使用道具 举报

ID:140371 发表于 2016-11-8 22:52 | 显示全部楼层
24楼的程式:我用 KEIL 下的DEBUG  測試.看來是正常的..並無只有LED1一个灯一闪一闪的,其余的灯都不亮。的情況....
檢查程式中使用的 IO口與實驗板的IO口是否相符。LED接線有皆對嗎
回复

使用道具 举报

ID:86913 发表于 2016-11-20 20:00 | 显示全部楼层
谢谢27楼,我再检查一遍。
回复

使用道具 举报

ID:86913 发表于 2017-2-27 17:19 | 显示全部楼层
在各位朋友的热情帮助下,这个问题终于懂了,衷心地感谢帮助过我的朋友们,祝你们快乐、健康!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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