打印

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

[复制链接]
3432|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语句,你的语法看着别扭.最后再去找些程序自己琢磨琢磨.

使用特权

评论回复
5
zzj137|  楼主 | 2007-8-8 17:26 | 只看该作者

对!~能具体点吗?

我是想用位定义的,用位操作控制的!
我知道!我写的东西错误很多!自己琢磨着写的 !~
大虾能再说点吗?
用位定义的,变量不能用k,l,m,n,o,p吗?
还是变量的定义类型错了!

使用特权

评论回复
6
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++)
}
用一个变量来实现延时!

使用特权

评论回复
7
weite_0303| | 2007-8-8 18:52 | 只看该作者

位定义!!!

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

只要写:
     k=1;      /*就是p1.5输出1*/

使用特权

评论回复
8
wildboar| | 2007-8-8 18:56 | 只看该作者

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

使用特权

评论回复
9
weite_0303| | 2007-8-8 19:01 | 只看该作者

!!!!

头文件里已经有P1^5与p1.5口的对应关系

使用特权

评论回复
10
zzj137|  楼主 | 2007-8-8 19:32 | 只看该作者

这样改?

使用特权

评论回复
11
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;
}
}
 

使用特权

评论回复
12
gjg191| | 2007-8-8 19:50 | 只看该作者

dd

要用sbit定义!!

使用特权

评论回复
13
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;

使用特权

评论回复
14
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;     /*返回原始状态的一组红灯亮,二组绿灯亮*/
}
}
 

使用特权

评论回复
15
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;     /*返回原始状态的一组红灯亮,二组绿灯亮*/
}
}

使用特权

评论回复
16
zzj137|  楼主 | 2007-8-9 15:03 | 只看该作者

谢谢!

使用特权

评论回复
17
zzj137|  楼主 | 2007-8-9 15:05 | 只看该作者

问题!

我那样写是不是不符合规范啊!
看起来特别乱!
但是总体上还是行的同的吧??

使用特权

评论回复
18
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

粉丝