模拟交通灯C语言程序~高手进来指导!

[复制链接]
4715|17
 楼主| zzj137 发表于 2007-8-8 17:00 | 显示全部楼层 |阅读模式

p1.5       p1.4      p1.3            p1.2     p1.1      p1.0
红灯       黄灯       绿灯           红灯     黄灯      绿灯
k           l         m               n       o         p


51单片机p1口控制~



#include<REGX51.H>
void delay (void)
{
unsigned char i,j;
for(i=0;i<255;i++)
 for(j=0;j<255;j++)
;
}
main()
{
int k,l,m,n,o,p,x,y;
while(1)
{
k=0,l=1,m=1,n=1,o=1,p=0,x=0,y=0;
k=p1.5,l=p1.4,m=p1.3,n=p1.2,o=p1.1,p=p1.0;
delay();
loop1:
p=1,o=0;
delay();
x++;
if(x<4) goto loop1;
k=1,l=1,m=0,n=0,o=1,p=1;
delay();
loop2:
m=1,l=0;
delay();
m=1,l=1;
delay();
y++;
if(y<4) goto loop2;
k=0,l=1,m=1,n=1,o=1,p=0;
}
}




自己看书,摸索着写的,肯定有很多错误,希望各位大虾们进来后,能给指导下!哪里有错误!请各位大虾指出!
小弟在次先谢过了~
lifengshun 发表于 2007-8-8 17:08 | 显示全部楼层

兄弟,現在我要下班了,看了你的程序,等會給你改.

兄弟,現在我要下班了,看了你的程序,等會給你改.
 楼主| zzj137 发表于 2007-8-8 17:12 | 显示全部楼层

谢谢老兄!~还是好人多啊!~嘿嘿!

hyh0lh 发表于 2007-8-8 17:12 | 显示全部楼层

k,l,m,n,o,p看你程序的意思应该是位定义而不是该写成字节定义

一个字节是8位,可以直接控制P1口的8个位.另外少用GOTO语句,你的语法看着别扭.最后再去找些程序自己琢磨琢磨.
 楼主| zzj137 发表于 2007-8-8 17:26 | 显示全部楼层

对!~能具体点吗?

我是想用位定义的,用位操作控制的!
我知道!我写的东西错误很多!自己琢磨着写的 !~
大虾能再说点吗?
用位定义的,变量不能用k,l,m,n,o,p吗?
还是变量的定义类型错了!
 楼主| zzj137 发表于 2007-8-8 17:30 | 显示全部楼层

接5楼

用位定义的话应该怎样定义变量的类型!?
还有个问题!

void delay (void)
{
unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++)
;
这个延时程序的延时的时间是多少~
再一个能不能
void delay (void)
{
unsigned char i,j;
for(i=0;i<255;i++)
}
用一个变量来实现延时!
weite_0303 发表于 2007-8-8 18:52 | 显示全部楼层

位定义!!!

位的定义:
bit  k=P1^5;
..........

只要写:
     k=1;      /*就是p1.5输出1*/
wildboar 发表于 2007-8-8 18:56 | 显示全部楼层

对应字符与P1口没有建立关系吧?

weite_0303 发表于 2007-8-8 19:01 | 显示全部楼层

!!!!

头文件里已经有P1^5与p1.5口的对应关系
 楼主| zzj137 发表于 2007-8-8 19:32 | 显示全部楼层

这样改?

 楼主| zzj137 发表于 2007-8-8 19:38 | 显示全部楼层

这样改是否正确?


p1.5       p1.4      p1.3            p1.2     p1.1      p1.0
红灯       黄灯       绿灯           红灯     黄灯      绿灯
k           l         m               n       o         p


51单片机p1口控制~



#include<REGX51.H>
void delay (void)
{
unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++)
;
}
main()
{
bit  k=P1^5,l=p1^4,m=p1^3,n=p1^2,o=p1^1,p=1^0;
int x,y;
while(1)
{
k=0,l=1,m=1,n=1,o=1,p=0;
x=0,y=0;
delay();
loop1:
p=1,o=0;
delay();
x++;
if(x<4) goto loop1;
k=1,l=1,m=0,n=0,o=1,p=1;
delay();
loop2:
m=1,l=0;
delay();
m=1,l=1;
delay();
y++;
if(y<4) goto loop2;
k=0,l=1,m=1,n=1,o=1,p=0;
}
}
 
gjg191 发表于 2007-8-8 19:50 | 显示全部楼层

dd

要用sbit定义!!
 楼主| zzj137 发表于 2007-8-8 19:52 | 显示全部楼层

原因!~能说多说点不?

这样??
sbit k=P1^5,l=p1^4,m=p1^3,n=p1^2,o=p1^1,p=1^0;
 楼主| zzj137 发表于 2007-8-9 14:38 | 显示全部楼层

又有点想法!程序重新改了!


p1.5       p1.4      p1.3            p1.2     p1.1      p1.0
红灯       黄灯       绿灯           红灯     黄灯      绿灯
k           l         m               n       o         p


51单片机p1口控制~



#include<REGX51.H>
void delay (void)                                 /*延时程序*/
{
unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++)
;
}
main()
{
sbit  k=P1^5,l=p1^4,m=p1^3,n=p1^2,o=p1^1,p=1^0;    /*声明k,l,m,n,o,p
                                             对p1.5-p1.0进行位操作*/  
int x,y;                                           
while(1)                   /*无穷循环*/             
{
k=0,l=1,m=1,n=1,o=1,p=0;   /*一组红灯亮,二组绿灯亮*/            
delay();
for(x=0;x<4;x++);         /*二组绿灯灭,黄灯闪烁四次*/     
{
p=1,o=0;
delay();
p=1,o=1;
delay();
}
k=1,l=1,m=0,n=0,o=1,p=1;     /*一组绿灯亮,二组红灯亮*/
delay();
for(y=0;y<4;y++);          /*一组绿灯灭,黄灯闪烁四次*/
{
m=1,l=0;
delay();
m=1,l=1;
delay();
}
k=0,l=1,m=1,n=1,o=1,p=0;     /*返回原始状态的一组红灯亮,二组绿灯亮*/
}
}
 
hyh0lh 发表于 2007-8-9 14:53 | 显示全部楼层

养成好习惯

main()
{
sbit  k=P1^5;    /*声明k,l,m,n,o,p  对p1.5-p1.0进行位操作*/
sbit  l=p1^4;
sbit  m=p1^3;
sbit  n=p1^2;
sbit  o=p1^1;
sbit  p=p1^0;
unsigned char x,y;         /*8位字节定义,循环参数x,y的范围0~256*/
while(1)                   /*无穷循环*/             
{
k=0,l=1,m=1,n=1,o=1,p=0;   /*一组红灯亮,二组绿灯亮*/
delay();
p=1;
for(x=0;x<4;x++);         /*二组绿灯灭,黄灯闪烁四次*/     
{
o=0;
delay();
o=1;
delay();
}
k=1,l=1,m=0,n=0,o=1,p=1;     /*一组绿灯亮,二组红灯亮*/
delay();
m=1;
for(y=0;y<4;y++);          /*一组绿灯灭,黄灯闪烁四次*/
{
l=0;
delay();
l=1;
delay();
}
k=0,l=1,m=1,n=1,o=1,p=0;     /*返回原始状态的一组红灯亮,二组绿灯亮*/
}
}
 楼主| zzj137 发表于 2007-8-9 15:03 | 显示全部楼层
 楼主| zzj137 发表于 2007-8-9 15:05 | 显示全部楼层

问题!

我那样写是不是不符合规范啊!
看起来特别乱!
但是总体上还是行的同的吧??
lifengshun 发表于 2007-8-25 16:01 | 显示全部楼层

不好意思,不晚了.

#include<REGX51.H>

#define k P1_5
#define l P1_4
#define m P1_3
#define n P1_2
#define o P1_1
#define p P1_0

void delay (void)
{
    unsigned char i,j;
    for(i=0;i<255;i++)
    ;
    for(j=0;j<255;j++)
    ;
}
main()
{
    while(1)
    {
        unsigned char x,y;
        k=0,l=1,m=1,n=1,o=1,p=0,x=0,y=0;
        delay();
        /*
        loop1:
        p=1,o=0;
        delay();
        x++;
        if(x<4) goto loop1;*/
        for(x=0;x<4;x++)
        {
            p=1,o=0;
            delay();
        }
        k=1,l=1,m=0,n=0,o=1,p=1;
        delay();
        /*
        loop2:
        m=1,l=0;
        delay();
        m=1,l=1;
        delay();
        y++;
        if(y<4) goto loop2;*/
        for(y=0;y<4;y++)
        {
            m=1,l=0;
            delay();
            m=1,l=1;
            delay();
        }
        k=0,l=1,m=1,n=1,o=1,p=0;
    }
}

兄弟,好久沒有上過網了.近來有點忙.所以給你加原遲了點,請見諒.想想我也是和你一樣在學習,看到新學者,我很興蔚.這個程序我已經檢查過了.100%的可以一次編譯通過.在邏輯方面我沒有給你做任何的修改.怕弄亂你的思路.讓你看不明白.注意,當你要用ic的輸出口時,你只要用#define來定義它的位就好了.它的位你可以在包含文件中看到它的定義方式.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

45

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部