找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3925|回复: 24
收起左侧

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

  [复制链接]
ID:145582 发表于 2016-11-1 21:57 | 显示全部楼层 |阅读模式
本人萌新一枚,刚刚开始学习单片机,前段时间突发奇想想用单片做一个交通灯
控制程序,在网上查找很多相关内容后终于自己写好程序了,也没有编译错误。但是,
实际运行时却达不到自己所预想的那样,所以想请教各位大神帮忙看看我写的程序哪出错了。
以下是我所写的程序。顺便把所使用的单片机构造图发给大家以便查看。
0.png 0.png

电路图.pdf (58.17 KB, 下载次数: 7)
回复

使用道具 举报

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)
回复

使用道具 举报

ID:111634 发表于 2016-11-2 12:17 | 显示全部楼层
实例30  带限行时间显示的模拟交通灯


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

使用道具 举报

ID:145682 发表于 2016-11-2 12:47 | 显示全部楼层
好厉害的样子
回复

使用道具 举报

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;
                                         }
                                   }
这是修改过的程序,已经在板子上实际检验过了,没大问题,基本能实现所预想的那样。剩下的就是添加外部中断以解决紧急情况了。再次感谢大家了
回复

使用道具 举报

ID:140371 发表于 2016-11-2 14:31 | 显示全部楼层
num,num1這變量應為int 型態 , TMOD=0x51;好像有誤吧  應是TMOD=0x11;   
回复

使用道具 举报

ID:145827 发表于 2016-11-2 22:39 | 显示全部楼层
我先仔细看看,再回复你哈
回复

使用道具 举报

ID:145827 发表于 2016-11-2 22:39 | 显示全部楼层
确实有点错误啊
回复

使用道具 举报

ID:145627 发表于 2016-11-3 08:31 | 显示全部楼层
现在仿真软件上试验一下
回复

使用道具 举报

ID:145628 发表于 2016-11-3 08:37 | 显示全部楼层
在proteus上试试
回复

使用道具 举报

ID:111634 发表于 2016-11-3 10:06 | 显示全部楼层
对照正确的案例和程序,仔细分析。
回复

使用道具 举报

ID:145907 发表于 2016-11-3 13:24 | 显示全部楼层
看不懂。。
回复

使用道具 举报

ID:145929 发表于 2016-11-3 15:33 | 显示全部楼层
我们也在做交通灯,但和你的比起来要简易很多
回复

使用道具 举报

ID:146201 发表于 2016-11-5 08:53 | 显示全部楼层
这里是你定义的uchar num,num1,shi_we,shi_ns,ge_we,ge_ns;
回复

使用道具 举报

ID:146244 发表于 2016-11-5 14:08 | 显示全部楼层
哪里出错了哇
回复

使用道具 举报

ID:145582 发表于 2016-11-6 09:51 | 显示全部楼层

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

使用道具 举报

ID:146380 发表于 2016-11-6 10:43 | 显示全部楼层
我帮你仔细看看哈别急
回复

使用道具 举报

ID:146381 发表于 2016-11-6 11:23 | 显示全部楼层
超出数据类型的范围,则会溢出。
回复

使用道具 举报

ID:146274 发表于 2016-11-6 17:10 | 显示全部楼层
看不懂
回复

使用道具 举报

ID:146465 发表于 2016-11-6 18:40 | 显示全部楼层
问题解决了吗
回复

使用道具 举报

ID:145582 发表于 2016-11-6 21:21 | 显示全部楼层

已经解决了
回复

使用道具 举报

ID:145582 发表于 2016-11-6 21:22 | 显示全部楼层
这个小孩很会玩 发表于 2016-11-6 11:23
超出数据类型的范围,则会溢出。

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

使用道具 举报

ID:146588 发表于 2016-11-7 13:18 | 显示全部楼层
好像不难,你再认真看一遍  应该可以发现其中的难题的,祝你好运
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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