完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
大专,今年大二,第一次学单片机,大一学了模拟电路,数字电路,C语言。c语言学得还可以,今年9月考了计算机二级C的,只过了笔试。模电数电就半桶水。
现在我们要做这个交通信号灯,如果给我原理图的话,编程基本上就没什么问题的了。但苦就苦在不会设计电路图。请问要从哪些方面入手呢? 题目是这样的,用MSC-51单片机设计一交通信号灯模拟控制系统,晶振采用12MHZ。具体要求如下: 1,正常情况下,A、B道(A、B道交叉组成十字路口,A是主道,B是支道)轮流放行,A道绿灯放行1min(其中10s用于黄灯),B道绿灯放行30s(其中5s用于黄灯)。 2,一道有车而另一道无车时,使有车车道放行(用两个按键开关控制)。 3,有紧急车辆通过时,AB道均为红灯(用按键开关控制)。 4,要求由数码管显示红绿灯倒计时间。 按照题目的意思,就知道要有数码管,按键,at89c51芯片,至于其他的就不知道了。所以想请教一下,现在该怎么办,是要加强硬件方面的知识吗?是的话,要看哪些方面的书呢?谢啦!!!
|
|
相关推荐
23 个讨论
|
|
|
用PLC我就会,单片机不会。
|
|
|
|
|
|
|
|
|
#include #define uchar unsigned char uchar i; ***it a_red=P3^0; ***it a_yellow=P3^1; ***it a_green=P3^2; ***it b_red=P3^5; ***it b_yellow=P3^4; ***it b_green=P3^3; void led() //交通灯控制函数 { //A道绿灯放行1min(其中10s用于黄灯) //B道绿灯放行30s(其中10s用于黄灯) i=0; if(i<=1000) { a_green=0; b_red=0; } else if(i<=1200) { a_yellow=0; b_red=0; } else if(i<=1600) { a_red=0; b_green=0; } else { b_yellow=0; a_red=0; } } void delay(uchar x) { uchar k; while(x--) for(k=0;k<125;k++) {} } /*******************主函数开始********************/ void main() { TMOD=0X01; //T0定时器 TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; while(1); { led(); } } /*******************主函数结束**********************/ void T0_time() interrupt 1 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; i++; if(i==1800) { i=0; /*i=0; a_green=0; b_red=0; delay(5000); a_green=1; b_red=1; delay(100) ; a_yellow=0; b_red=0; delay(5000); delay(5000); a_yellow=1;b_red=1;delay(100); a_red=0; b_green=0; delay(5000);delay(5000);delay(5000);delay(5000);delay(5000); a_red=1;b_green=1; delay(100); b_yellow=0; a_red=0; */ } } 之前不用void led()里的函数,只用中断函数里的程序 交通灯还能亮,但还是不准。现在只用void led()里的函数亮都不亮,求解答,谢啦!
|
|
|
|
|
|
|
|
|
#include #define uchar unsigned char #define uint unsigned int; uint i; ***it a_red=P3^0; ***it a_yellow=P3^1; ***it a_green=P3^2; ***it b_red=P3^5; ***it b_yellow=P3^4; ***it b_green=P3^3; /*void led() //交通灯控制函数 { //A道绿灯放行1min(其中10s用于黄灯) //B道绿灯放行30s(其中10s用于黄灯) if(i<=1000) { a_green=0; b_red=0; } else if(i<=1200) { a_yellow=0; b_red=0; } else if(i<=1600) { a_red=0; b_green=0; } else { b_yellow=0; a_red=0; i=0; } } */ void delay(uchar x) { uchar k; while(x--) for(k=0;k<125;k++) {} } /*******************主函数开始********************/ void main() { TMOD=0X01; //T0定时器 TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; while(1); { } } /*******************主函数结束**********************/ void T0_time() interrupt 1 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; i++; if(i<=1000) { a_green=0; b_red=0; b_yellow=1; a_red=1; } else if(i<=1200) { a_yellow=0; b_red=0; a_green=1; } else if(i<=1600) { a_red=0; b_green=0; a_yellow=1; b_red=1; } else { b_yellow=0; a_red=0; b_green=1; i=0; } //if(i==1800) //{ /*i=0; a_green=0; b_red=0; delay(5000); a_green=1; b_red=1; delay(100) ; a_yellow=0; b_red=0; delay(5000); delay(5000); a_yellow=1;b_red=1;delay(100); a_red=0; b_green=0; delay(5000);delay(5000);delay(5000);delay(5000);delay(5000); a_red=1;b_green=1; delay(100); b_yellow=0; a_red=0; */ //} } 现在是这情况,刚开始能按照流程来走,红绿黄灯都正常走一遍,但最后就只停留在A红灯亮,B黄灯亮。咋原因呢呢??
|
|
|
|
|
|
|
|
|
你能按以下格式写吗?
STEP1:
然后依次写出A通道的黄灯亮灭、绿灯亮灭,B通道的红、黄、绿灯的亮灭宏定义。 STEP2 写出A通道的允许通行函数(A的绿灯亮,红黄灭),等待函数(A的黄灯亮,绿红灭),禁止通行函数(A的红灯亮,绿黄灭);然后再写出B通道的这三个函数。 我给你起好名字了:Channel_A_Across_Enable(), Channel_A_Wait(), Channel_A_Across_Disable()。 STEP3 把你的代码用上面的宏和函数改写。 状态切换时,必须用STEP2中的函数,不允许再直接使用IO口。 改完之后,你也许就明白好多错误发生在哪里了。 这种方式就叫封装和抽象! |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 18:53 , Processed in 1.034922 second(s), Total 80, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
8835
