打印

师傅 帮我看看程序

[复制链接]
2080|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yun1202|  楼主 | 2009-12-20 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我自己练习交通灯写了一部分在板子上跑了一下开始时是在按照设计的先是25到00然后05到00但是之后就开始是在第二个数码管上由5到1然后9到0再是9到0接着按设计的25到00的走法程序如下
#include<reg52.h>
sbit wela=P2^7;
sbit dula=P2^6;
sbit dxred=P1^0;      //设置交通灯
sbit dxyellow=P1^1;
sbit dxgreen=P1^2;
sbit nbred=P1^3;
sbit nbgreen=P1^4;
sbit nbyellow=P1^5;
#define unint unsigned int
#define unchar unsigned char
unchar num1=0,num2=0,num3=25;
unchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void delay5ms(unchar z)
{
  unint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
  {
   wela=1;
   P0=0xfe;
   wela=0;
   dula=1;
   P0=table[num3/10];
   dula=0;
   delay5ms(5);

   wela=1;
   P0=0xfd;
   wela=0;
   dula=1;
   P0=table[num3%10];
   dula=0;
   delay5ms(5);
  }
   

}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num1++;     //用于将计时累加至1S
if(num1==20)
{  
   num1=0;
   num2++;//用于单循环的总计时
   num3--;//用于数码管的显示在开始时令其等于25
   if(num2==26)
    num3=5;
   if(num2==61)
   {
    num2=0;
    num3=25;
   }
}

相关帖子

沙发
NE5532| | 2009-12-20 17:07 | 只看该作者
师傅没空看程序,你直接说你遇到啥问题吧。

使用特权

评论回复
板凳
yun1202|  楼主 | 2009-12-20 17:25 | 只看该作者
出现了程序中没有涉及的部分 我咋看程序都不知道为什么出现这问题

使用特权

评论回复
地板
yun1202|  楼主 | 2009-12-20 17:35 | 只看该作者
出现了程序中没有涉及的部分 我咋看程序都不知道为什么出现这问题

使用特权

评论回复
5
不亦心| | 2009-12-20 19:30 | 只看该作者
师傅没空看程序,你直接说你遇到啥问题吧。
NE5532 发表于 2009-12-20 17:07

NE5532收徒弟呀??
要不也收了我吧
哈哈:P

使用特权

评论回复
6
NE5532| | 2009-12-20 19:54 | 只看该作者
呵呵,楼上别洗我了嘛。这21IC里上上下下老老少少谁出了问题大家都会帮的呀。

to楼主

先把不相关的部分都删(屏蔽)了,从核心一步一步开始调。

使用特权

评论回复
7
yun1202|  楼主 | 2009-12-20 20:56 | 只看该作者
呵呵 师傅 这话听着真亲切

#include<reg52.h>
sbit wela=P2^7;
sbit dula=P2^6;

#define unint unsigned int
#define unchar unsigned char
unchar num1=0,num2=0,num3=25;
unchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};

void delay5ms(unchar z)
{
        unint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void main()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
                {
                        wela=1;
                        P0=0xfe;
                        wela=0;
                        dula=1;
                        P0=table[num3/10];
                        dula=0;
                        delay5ms(5);
       
                        wela=1;
                        P0=0xfd;
                        wela=0;
                        dula=1;
                        P0=table[num3%10];
                        dula=0;
                        delay5ms(5);
                }
                               
       
}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        num1++;                                        //用于将计时累加至1S
        if(num1==20)
        {               
                        num1=0;
                        num2++;//用于单循环的总计时
                        num3--;//用于数码管的显示在开始时令其等于25
                        if(num2==26)
                                num3=5;
                        if(num2==61)
                        {
                                num2=0;
                                num3=25;
                        }
        }
       
}
从核心一步一步开始调??????

使用特权

评论回复
8
yun1202|  楼主 | 2009-12-20 20:57 | 只看该作者
还是这种情况。

使用特权

评论回复
9
NE5532| | 2009-12-20 21:18 | 只看该作者
TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;

把这些代码全部换成固定写死的数据,先不要弄花花上来。
打个比方,你学走路,就要学迈左脚,再学迈右脚,现在你是两只脚都加上来了,难保不摔。
先退一步,不要定时器,固定送00、55、FF,看对不对,再把定时器打开,在定时器中断里换数据,先开慢一点,交替显示00和FF,看对不对,最后再做循环。

使用特权

评论回复
10
IC_99| | 2009-12-20 22:40 | 只看该作者
本帖最后由 IC_99 于 2009-12-20 22:41 编辑

以下这部分程序有问题:
if(num1==20)
        {               
                        num1=0;
                        num2++;//用于单循环的总计时
                        num3--;//用于数码管的显示在开始时令其等于25
                        if(num2==26)    //25秒走完后,走5秒;5秒走完后走多少啊???
                                num3=5;   //没有5秒走完后的判断,故num3应该是一个随机的数值.                        
                        if(num2==61)   //第一次的25秒和5秒走完后,num2是31,没判断,随机下去
                        {                       //直到num2=61才有判断,才从25秒开始,num2回零。
                                num2=0;  //所以num2从31-61这段时间内,会出现随机的现象
                                num3=25;
                        }
        }

我的分析就是这样,也没怎么看清楚和仔细分析,楼主看看是不是这个问题,再仔细分析分析,呵呵

使用特权

评论回复
11
84335262| | 2009-12-21 12:06 | 只看该作者
1# yun1202
悟空:
你这是那个61给闹的:你原意应该是31.过了31后,NUM3再--,变成255,导致输出5,再变成9,出了两个9以后达到61,返回了状态

使用特权

评论回复
12
xuexiwen33| | 2009-12-21 12:59 | 只看该作者
八戒,问题出在这段程序上
num2++;//用于单循环的总计时
   num3--;//用于数码管的显示在开始时令其等于25
   if(num2==26)
    num3=5;//num3变成5之后继续减的话变成255,再减减。。。。。
   if(num2==61)
   {
    num2=0;
    num3=25;
   }

使用特权

评论回复
13
yun1202|  楼主 | 2009-12-21 13:10 | 只看该作者
傻死了
:dizzy::dizzy::dizzy:
是应该是31的 当初就没想到会是把数弄错了。
谢谢各位师傅:victory::victory:

使用特权

评论回复
14
反质子| | 2009-12-21 17:24 | 只看该作者
有师傅真好:D
拜师啊:(那位大侠收了我吧

使用特权

评论回复
15
icecut| | 2009-12-21 19:52 | 只看该作者
无此徒弟

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

17

帖子

1

粉丝