找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3592|回复: 24
打印 上一主题 下一主题
收起左侧

自己编写的交通灯程序有错。求助大神!!!

  [复制链接]
跳转到指定楼层
楼主
本人萌新一枚,刚刚开始学习单片机,前段时间突发奇想想用单片做一个交通灯
控制程序,在网上查找很多相关内容后终于自己写好程序了,也没有编译错误。但是,
实际运行时却达不到自己所预想的那样,所以想请教各位大神帮忙看看我写的程序哪出错了。
以下是我所写的程序。顺便把所使用的单片机构造图发给大家以便查看。


电路图.pdf (58.17 KB, 下载次数: 7)
  1.                                            /**************************************************
  2. 实验名:交通灯设计
  3. 实验内容:利用中断,定时/计数器,数码管和led灯进行交通灯的设计
  4. *************************************************/                                                         
  5.                                     #include <reg52.h>
  6.                                 #define uint unsigned int
  7.                                    #define uchar unsigned char
  8.                                    sbit wei1=P2^4;           //定义位选 0
  9.                                    sbit wei2=P2^5;           //1
  10.                                    sbit wei3=P2^6;           //2
  11.                                    sbit wei4=P2^7;           //3
  12.                                    sbit green_we=P1^2;        //定义交通灯 绿东西
  13.                                    sbit green_ns=P1^3;        //定义交通灯 绿南北
  14.                                    sbit red_we=P1^0;        //定义交通灯 红东西
  15.                                    sbit red_ns=P1^1;        //定义交通灯 红南北
  16.                                    sbit yellow_we=P1^4;        //定义交通灯 黄东西
  17.                                    sbit yellow_ns=P1^5;        //定义交通灯 黄南北
  18.                                    uchar num,num1,shi_we,shi_ns,ge_we,ge_ns;
  19.                                    uint xianshi_we,xianshi_ns;
  20.                                    uchar code table[]={
  21.                                    0x3f,0x06,0x5b,0x4f,0x66,
  22.                                    0x6d,0x7d,0x07,0x7f,0x6f}; //定义数值9,8,7...0
  23.                                    void delayms(uint xsm) //延时程序
  24.                                    {
  25.                                    uint i,j;
  26.                                    for(i=xsm;i>0;i--)
  27.                                    for(j=110;j>0;j--);
  28.                                    }
  29.                                    void display(uchar shi_we,uchar ge_we,uchar shi_ns,uchar ge_ns)         //定义数码管函数
  30.                                    {
  31.                                    wei1=1;
  32.                                    wei2=0;
  33.                                    wei3=0;
  34.                                    wei4=0;
  35.                                    P0=table[shi_we];
  36.                                    delayms(5);
  37.                                    wei1=0;
  38.                                    wei2=1;
  39.                                    wei3=0;
  40.                                    wei4=0;
  41.                                    P0=table[ge_we];
  42.                                    delayms(5);
  43.                                    wei1=0;
  44.                                    wei2=0;
  45.                                    wei3=1;
  46.                                    wei4=0;
  47.                                    P0=table[shi_ns];
  48.                                    delayms(5);
  49.                                    wei1=0;
  50.                                    wei2=0;
  51.                                    wei3=0;
  52.                                    wei4=1;
  53.                                    P0=table[ge_ns];
  54.                                    delayms(5);
  55.                                    }
  56.                                    void main()
  57.                                    {
  58.                                    num=0;
  59.                                    num1=0;
  60.                                    xianshi_we=99;
  61.                                    xianshi_ns=99;
  62.                                    shi_we=9;
  63.                                    ge_we=9;
  64.                                    shi_ns=9;
  65.                                    ge_ns=9;
  66.                                    TMOD=0x51;                                  //设置定时器0和计数器1为工作方式1
  67.                                    TH0=(65536-46080)/256;          //设置初值
  68.                                    TL0=(65536-46080)%256;
  69.                                    TH1=(65536-46080)/256;
  70.                                    TL1=(65536-46080)%256;
  71.                                    EA=1;                                          //开总中断
  72.                                    ET0=1;                                          //开定时器0中断
  73.                                    ET1=1;                                          //开定时器1中断
  74.                                    TR0=1;                                          //启动定时器0
  75.                                    TR1=1;                                          //启动定时器1
  76.                                    P1=0xff;           //led灯全灭
  77.                                    P1=0xf6;   //定义东西亮红灯,南北亮绿灯;
  78.                                    while(1)
  79.                                    {
  80.                                         display(shi_we,ge_we,shi_ns,ge_ns);
  81.                                           if(num1==1140)
  82.                                         {
  83.                                         P1=0xde; //定义东西亮红灯,南北亮黄灯;
  84.                                         }
  85.                                 if(num1==1200)
  86.                                         {
  87.                                         P1=0xf9; //定义东西亮绿灯,南北亮红灯;
  88.                                         xianshi_we=60;
  89.                                 xianshi_ns=60;
  90.                                         }
  91.                                 if(num1==2340)
  92.                                         {
  93.                                         P1=0xed; //定义东西亮黄灯,南北亮红灯;
  94.                                         }
  95.                                 if(num1==2400)
  96.                                         {
  97.                                         num1=0;
  98.                                         xianshi_we=60;
  99.                                 xianshi_ns=60;
  100.                                         P1=0xf6; //定义东西亮红灯,南北亮绿灯;
  101.                                         }
  102.                                    }
  103.                                    }
  104.                                    void T0_time()interrupt 1
  105.                                    {
  106.                                         TH0=(65536-46080)/256;
  107.                                         TL0=(65536-46080)%256;
  108.                                         num++;
  109.                                         if(num%20==0)
  110.                                         {
  111.                                      num=0;
  112.                                          xianshi_we--;
  113.                                             xianshi_ns--;
  114.                                          shi_we=xianshi_we/10;
  115.                                          ge_we=xianshi_we%10;
  116.                                          shi_ns=xianshi_ns/10;
  117.                                          ge_ns=xianshi_ns%10;
  118.                                          }
  119.                                    }
  120.                                    void T1_count() interrupt 3
  121.                                    {
  122.                                    TH1=(65536-46080)/256;
  123.                                    TL1=(65536-46080)%256;
  124.                                    num1++;
  125.                                    }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:61002 发表于 2016-11-2 08:36 | 只看该作者
这里是你定义的uchar num,num1,shi_we,shi_ns,ge_we,ge_ns;
uint xianshi_we,xianshi_ns;
这里是你使用的  if(num1==1200)
你定义的uchar类型,数据最大到255,再加就变0,不会出现大于1200的数
回复

使用道具 举报

板凳
ID:111634 发表于 2016-11-2 12:14 | 只看该作者
本帖最后由 zl2168 于 2016-11-2 12:16 编辑

实例29  模拟交通灯


电路设计   


程序设计   


Keil调试   


Proteus仿真   


Proteus仿真一下,确认有效。
实例29 模拟交通灯.rar (35.12 KB, 下载次数: 13)

以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版

书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

地板
ID:111634 发表于 2016-11-2 12:17 | 只看该作者
实例30  带限行时间显示的模拟交通灯


Proteus仿真一下,确认有效。
实例30 带限行时间显示模拟交通灯.rar (40.64 KB, 下载次数: 4)


以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

5#
ID:145682 发表于 2016-11-2 12:47 | 只看该作者
好厉害的样子
回复

使用道具 举报

6#
ID:145582 发表于 2016-11-2 13:27 | 只看该作者
谢谢大家了,昨天我又请教了一下同学,经过我们的反复检查调试已经成功解决问题了。/**************************************************
实验名:交通灯设计
实验内容:利用中断,定时/计数器,数码管和led灯进行交通灯的设计
*************************************************/                                                          
                                    #include <reg52.h>
                                #define uint unsigned int
                                   #define uchar unsigned char
                                   sbit wei1=P2^4;           //定义位选 0
                                   sbit wei2=P2^5;           //1
                                   sbit wei3=P2^6;           //2
                                   sbit wei4=P2^7;           //3
                                   sbit green_we=P1^2;        //定义交通灯 绿东西
                                   sbit green_ns=P1^3;        //定义交通灯 绿南北
                                   sbit red_we=P1^0;        //定义交通灯 红东西
                                   sbit red_ns=P1^1;        //定义交通灯 红南北
                                   sbit yellow_we=P1^4;        //定义交通灯 黄东西
                                   sbit yellow_ns=P1^5;        //定义交通灯 黄南北
                                   uchar num,num1,shi_we,shi_ns,ge_we,ge_ns;
                                   uint xianshi_we,xianshi_ns;
                                   uchar code table[]={
                                   0x3f,0x06,0x5b,0x4f,0x66,
                                   0x6d,0x7d,0x07,0x7f,0x6f}; //定义数值0,1,2...9
                                   void delayms(uint xsm) //延时程序
                                   {
                                   uint i,j;
                                   for(i=xsm;i>0;i--)
                                   for(j=110;j>0;j--);
                                   }
                                   void display(uchar shi_we,uchar ge_we,uchar shi_ns,uchar ge_ns)         //定义数码管动态扫描函数
                                   {
                                   wei1=1;
                                   wei2=0;
                                   wei3=0;
                                   wei4=0;
                                   P0=table[shi_we];
                                   delayms(5);
                                   wei1=0;
                                   wei2=1;
                                   wei3=0;
                                   wei4=0;
                                   P0=table[ge_we];
                                   delayms(5);
                                   wei1=0;
                                   wei2=0;
                                   wei3=1;
                                   wei4=0;
                                   P0=table[shi_ns];
                                   delayms(5);
                                   wei1=0;
                                   wei2=0;
                                   wei3=0;
                                   wei4=1;
                                   P0=table[ge_ns];
                                   delayms(5);
                                   }
                                   void main()
                                   {
                                   num=0;
                                   num1=0;
                                   xianshi_we=19;
                                   xianshi_ns=19;
                                   shi_we=1;
                                   ge_we=9;
                                   shi_ns=1;
                                   ge_ns=9;
                                   TMOD=0x01;                                  //设置定时器0和计数器1为工作方式1
                                   TH0=(65536-46080)/256;          //设置初值
                                   TL0=(65536-46080)%256;
                                   EA=1;                                          //开总中断
                                   ET0=1;                                          //开定时器0中断
                                   TR0=1;                                          //启动定时器0
                                   P1=0xff;           //led灯全灭
                                   P1=0xf6;   //定义东西亮红灯,南北亮绿灯;
                                   while(1)
                                   {
                                        display(shi_we,ge_we,shi_ns,ge_ns);
                                          if(num1==17)
                                        {
                                        P1=0xde; //定义东西亮红灯,南北亮黄灯;
                                        }
                                if(num1==19)
                                        {
                                        P1=0xf9; //定义东西亮绿灯,南北亮红灯;
                                        xianshi_we=19;
                                xianshi_ns=19;
                                        }
                                if(num1==36)
                                        {
                                        P1=0xed; //定义东西亮黄灯,南北亮红灯;
                                        }
                                if(num1==39)
                                        {
                                        num1=0;
                                        xianshi_we=19;
                                xianshi_ns=19;
                                        P1=0xf6; //定义东西亮红灯,南北亮绿灯;
                                        }
                                   }
                                   }
                                   void T0_time()interrupt 1
                                   {
                                        TH0=(65536-46080)/256;
                                        TL0=(65536-46080)%256;
                                        num++;
                                        if(num%20==0)
                                        {
                                     num=0; num1++;
                                         xianshi_we--;
                                            xianshi_ns--;
                                         shi_we=xianshi_we/10;
                                         ge_we=xianshi_we%10;
                                         shi_ns=xianshi_ns/10;
                                         ge_ns=xianshi_ns%10;
                                         }
                                   }
这是修改过的程序,已经在板子上实际检验过了,没大问题,基本能实现所预想的那样。剩下的就是添加外部中断以解决紧急情况了。再次感谢大家了
回复

使用道具 举报

7#
ID:140371 发表于 2016-11-2 14:31 | 只看该作者
num,num1這變量應為int 型態 , TMOD=0x51;好像有誤吧  應是TMOD=0x11;   
回复

使用道具 举报

8#
ID:145827 发表于 2016-11-2 22:39 | 只看该作者
我先仔细看看,再回复你哈
回复

使用道具 举报

9#
ID:145827 发表于 2016-11-2 22:39 | 只看该作者
确实有点错误啊
回复

使用道具 举报

10#
ID:145627 发表于 2016-11-3 08:31 | 只看该作者
现在仿真软件上试验一下
回复

使用道具 举报

11#
ID:145628 发表于 2016-11-3 08:37 | 只看该作者
在proteus上试试
回复

使用道具 举报

12#
ID:111634 发表于 2016-11-3 10:06 | 只看该作者
对照正确的案例和程序,仔细分析。
回复

使用道具 举报

13#
ID:145907 发表于 2016-11-3 13:24 | 只看该作者
看不懂。。
回复

使用道具 举报

14#
ID:145929 发表于 2016-11-3 15:33 | 只看该作者
我们也在做交通灯,但和你的比起来要简易很多
回复

使用道具 举报

15#
ID:146201 发表于 2016-11-5 08:53 | 只看该作者
这里是你定义的uchar num,num1,shi_we,shi_ns,ge_we,ge_ns;
回复

使用道具 举报

16#
ID:146244 发表于 2016-11-5 14:08 | 只看该作者
哪里出错了哇
回复

使用道具 举报

17#
ID:145582 发表于 2016-11-6 09:51 | 只看该作者

已经解决了,你可以看我后面重新发的程序。之前的那个程序错误很多,计数器用法用错了,没有加脉冲信号,还有我把NUM1定义为unsigned char,它是8位的最多只能表示256个数字,用int 16位才能表示1000+以上的数
回复

使用道具 举报

18#
ID:146380 发表于 2016-11-6 10:43 | 只看该作者
我帮你仔细看看哈别急
回复

使用道具 举报

19#
ID:146381 发表于 2016-11-6 11:23 | 只看该作者
超出数据类型的范围,则会溢出。
回复

使用道具 举报

20#
ID:146274 发表于 2016-11-6 17:10 | 只看该作者
看不懂
回复

使用道具 举报

21#
ID:146465 发表于 2016-11-6 18:40 | 只看该作者
问题解决了吗
回复

使用道具 举报

22#
ID:145582 发表于 2016-11-6 21:21 | 只看该作者

已经解决了
回复

使用道具 举报

23#
ID:145582 发表于 2016-11-6 21:22 | 只看该作者
这个小孩很会玩 发表于 2016-11-6 11:23
超出数据类型的范围,则会溢出。

谢谢,后面我也发现这个问题了
回复

使用道具 举报

24#
ID:146588 发表于 2016-11-7 13:18 | 只看该作者
好像不难,你再认真看一遍  应该可以发现其中的难题的,祝你好运
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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