| 好像不难,你再认真看一遍 应该可以发现其中的难题的,祝你好运 |
这个小孩很会玩 发表于 2016-11-6 11:23 谢谢,后面我也发现这个问题了 |
|
已经解决了 |
| 问题解决了吗 |
| 看不懂 |
| 超出数据类型的范围,则会溢出。 |
| 我帮你仔细看看哈别急 |
y123456 发表于 2016-11-5 14:08 已经解决了,你可以看我后面重新发的程序。之前的那个程序错误很多,计数器用法用错了,没有加脉冲信号,还有我把NUM1定义为unsigned char,它是8位的最多只能表示256个数字,用int 16位才能表示1000+以上的数 |
| 哪里出错了哇 |
| 这里是你定义的uchar num,num1,shi_we,shi_ns,ge_we,ge_ns; |
| 我们也在做交通灯,但和你的比起来要简易很多 |
| 看不懂。。 |
| 对照正确的案例和程序,仔细分析。 |
| 在proteus上试试 |
| 现在仿真软件上试验一下 |
| 确实有点错误啊 |
| 我先仔细看看,再回复你哈 |
| num,num1這變量應為int 型態 , TMOD=0x51;好像有誤吧 應是TMOD=0x11; |
|
谢谢大家了,昨天我又请教了一下同学,经过我们的反复检查调试已经成功解决问题了。/************************************************** 实验名:交通灯设计 实验内容:利用中断,定时/计数器,数码管和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; } } 这是修改过的程序,已经在板子上实际检验过了,没大问题,基本能实现所预想的那样。剩下的就是添加外部中断以解决紧急情况了。再次感谢大家了 |
| 好厉害的样子 |
|
实例30 带限行时间显示的模拟交通灯 先Proteus仿真一下,确认有效。
实例30 带限行时间显示模拟交通灯.rar
(40.64 KB, 下载次数: 4)
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版 书中电路和程序设计有详细说明,程序语句条条有注解。 |
|
本帖最后由 zl2168 于 2016-11-2 12:16 编辑 实例29 模拟交通灯 ⒈ 电路设计 … ⒉ 程序设计 … ⒊ Keil调试 … ⒋Proteus仿真 … 先Proteus仿真一下,确认有效。
实例29 模拟交通灯.rar
(35.12 KB, 下载次数: 13)
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版 书中电路和程序设计有详细说明,程序语句条条有注解。 |
|
这里是你定义的uchar num,num1,shi_we,shi_ns,ge_we,ge_ns; uint xianshi_we,xianshi_ns; 这里是你使用的 if(num1==1200) 你定义的uchar类型,数据最大到255,再加就变0,不会出现大于1200的数 |