各位读者朋友们你们好,感谢你们能点开这篇文章,作为一个非硬件专业的学生,我没有扎实的硬件基础,很担心自己所写内容没有理论基础或者存有漏洞,如果有不对的地方,期待您能指正,一起学习。交通红绿灯的设计算是51的小入门。涉及仅有数码管,LED交通灯,Delay函数延时的使用。

总览:一:数码管用来显示数字。

二:LED交通灯本质上就是二极管,含有红绿黄,作为交通灯。

三:Delay函数,用以计时。(在还未学习计时器的情况下,用Delay函数计时,虽有误差,但能接受)

我的板子是清翔的A4板,静态数码管原理图如下:

一个静态数码管其实是由八个小的二极管组成,如上图,你可以看到,如果想让数码管显示数字1,就是点亮b,c两个二极管,其他不点亮。(原理图中每个二极管分别用字母a~Dp代替,下文同上)

我们再设计接线,做过入门的点亮第一个LED灯的都知道,点亮LED就是给电平置低,我设计的接线是引脚P0^0~P0^7接J8的A~Dp。

这样我们就可以写出每个数字所需点亮的二极管以及对应的引脚了:

数字0:a,b,c,d,e,f 对应引脚:P00 P01 P02 P03 P04 P05

数字1: b,c 对应引脚:P01 P02

数字2:a,b,d,e,g 对应引脚: P00 P02 P03 P06

数字3:。。。。。。。

我们写一个函数,将0-10的数字包含进去:

void NiXie(unsigned char Number)
{switch(Number){case 0:P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=0;break;case 1:P0_1=P0_2=0;break;case 2:P0_0=P0_1=P0_3=P0_4=P0_6=0;break;case 3:P0_0=P0_1=P0_2=P0_3=P0_6=0;break;case 4:P0_1=P0_2=P0_5=P0_6=0;break;case 5:P0_0=P0_2=P0_3=P0_5=P0_6=0;break;case 6:P0_0=P0_2=P0_3=P0_4=P0_5=P0_6=0;break;case 7:P0_0=P0_1=P0_2=0;break;case 8:P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=P0_6=0;break;case 9:P0_0=P0_1=P0_2=P0_3=P0_5=P0_6=0;break;case 10:P0_6=0;break;}
}

数字10我用中间那个杠,也就是g编码的二极管代替了(对应P0^6),毕竟这个例程只有一个数码管...

这样利用switch的好处是很明显的,当我们输入一个Number,对应的case就会自动对应这个数,比如Number=5,对应case 5:对应的数码管被点亮,实现显示数字5的效果。

注:数字之间的切换

比如数字1过后想亮数字2,需要把数字1亮过的二极管全部置高后再行动,若没有置高,实际上就是数字之间发生重叠,为统一起见,每亮(显示)一个数字后,将所有引脚置高,全部关灯,即:

P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=P0_6=P0_7=1;//return

(提示:如果你用模块化编程,会使main函数看起来更简洁)

数字显示做好后,我们来看红绿灯:在我这块板子上,红黄绿灯,我接的是:

P2^2------绿灯

P2^3------黄灯

P2^4------红灯

延时函数Delay:如果你看到这篇文章的话,应该还没由接触到吧,Delay函数是可以在生成器中自动生成的,看下图:

系统频率也就是晶振,结合自己的板子,有的是12.0000KHZ的,我的是11.0592KHZ的,定时长度可设计最小为微秒的计时单位,在本实验中毫秒更适用,指令集选择STC-Y1对应STC89C型号的板子,都勾选好后,就可以把生成的代码复制来用了,在主函数中,直接调用这个函数,就可以起到延时的效果了。

void Delay1ms()        //@11.0592MHz
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}

看此函数,结合我们的需求我们可以稍作改动,1000毫秒为一秒,我们想要1000毫秒来实现交通灯,这里只有1毫秒,我们只需要加个while函数循环我们想要的秒数的次数,就可以实现了

修改的代码如下:

void Delay(unsigned int xms)        //@11.0592MHz
{unsigned char i, j;while(xms){_nop_();i = 2;j = 199;do{while (--j);} while (--i);xms--;}
}

我们写一个参数,自己输入你想延时多少毫秒,比如xms=1000,while循环里每循环一次xms--;就可以实现循环xms次一毫秒的循环了。1000次就是一秒钟了。(我在这里将函数名改为了Delay())

说了这么多,是时候上代码了:

#include <REGX51.H>
#include<INTRINS.H>
void NiXie(unsigned char Number)
{switch(Number){case 0:P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=0;break;case 1:P0_1=P0_2=0;break;case 2:P0_0=P0_1=P0_3=P0_4=P0_6=0;break;case 3:P0_0=P0_1=P0_2=P0_3=P0_6=0;break;case 4:P0_1=P0_2=P0_5=P0_6=0;break;case 5:P0_0=P0_2=P0_3=P0_5=P0_6=0;break;case 6:P0_0=P0_2=P0_3=P0_4=P0_5=P0_6=0;break;case 7:P0_0=P0_1=P0_2=0;break;case 8:P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=P0_6=0;break;case 9:P0_0=P0_1=P0_2=P0_3=P0_5=P0_6=0;break;case 10:P0_6=0;break;}
}void Delay(unsigned int xms)        //@11.0592MHz
{unsigned char i, j;while(xms){_nop_();i = 2;j = 199;do{while (--j);} while (--i);xms--;}
}
void main()
{while(1){unsigned int i=10,j=3,k=10;for(i;i>0;i--){P2_2=0;//Grenn lightNiXie(i);Delay(1000);P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=P0_6=P0_7=1;//return}P2_2=1;//off the green light for(j;j>0;j--){P2_3=0;//Yellow light NiXie(j);Delay(500);    P2_3=1;Delay(500);//实现闪烁P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=P0_6=P0_7=1;//return}P2_3=1;for(k;k>0;k--){P2_4=0;//Red lightNiXie(k);Delay(1000);P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=P0_6=P0_7=1;//return}P2_4=1;}
}

在黄灯部分,我设计黄灯闪烁,更像交通灯了哈哈哈哈。(接下来准备写交通红绿灯设计二,用定时器减小误差,另,一个数码管确实有些可怜了,准备加个LCD1602或者用两个数码管)。

实验现象:

如有不懂的地方,欢迎您的私信。

如有写的不对的地方,非常期待能收到您的指正。

C51单片机 简单的交通红绿灯设计一相关推荐

  1. 基于单片机的十字路口交通灯设计(带左转、紧急、夜间模式且每个绿灯后都有黄灯二)

    资源文件夹包含:proteus仿真+原理图:keil编写的C语言程序. 资源链接:加我QQ:1271370903 一.设计要求及内容 该控制系统中,主要由AT89C51单片机芯片.时钟电路.复位电路. ...

  2. 单片机实验——改进型交通信号灯设计,交通信号系统是保障交通安全高效的重要设施,为了利于司机更好的判断,很多交通信号灯系统在原来的系统基础上设置了倒计时显示器。本实验利用7段数码管作倒计时显示器

    实验内容及要求 交通信号系统是保障交通安全高效的重要设施,为了利于司机更好的判断,很多交通信号灯系统在原来的系统基础上设置了倒计时显示器.本实验利用7段数码管作倒计时显示器,设计一个改进型的交通信号灯 ...

  3. C51单片机简易密码锁(课程设计)

    已经过测试,全部可用.手机好像不能发博客,相册提取图片代码粘黏复制可用. 本密码锁用于开门关门.绿灯保持常亮状态,表示一直通电状态.如果处于开门状态,则红灯也会亮起.(单片机上无法显示红绿灯,仿真时可 ...

  4. 【c51单片机】交通红绿灯设计

    观察十字路口红绿灯工作流程,设计交通灯. 1.初始时:南北向.东西向直行左转均为红灯 2.南北向直行: ①南北向直行绿灯亮,延时若干秒 ②启动南北向左转数码管显示:倒计时6秒:同时南北向直行绿灯闪烁3 ...

  5. 【C51单片机】交通红绿灯设计(仿真)

    1.功能描述 观察十字路口红绿灯工作流程,设计交通灯. 1.初始时:南北向.东西向直行左转均为红灯 2.南北向直行: ①南北向直行绿灯亮,延时若干秒 ②启动南北向左转数码管显示:倒计时6秒:同时南北向 ...

  6. 单片机c语言交通信号灯设计,基于51单片机的交通信号灯设计毕业设计.pdf

    摘 要 在现代城市中,随着人口和汽车的急剧增长,市区交通日益拥挤,要是没有红绿灯 作为指挥工具,恐怕川流不息的汽车就会由于混乱而造成严重阻塞.因此,交通灯是交 管部门管理城市交通的重要工具之一.随着电 ...

  7. 基于51单片机的十字路口交通红绿灯控制系统仿真原理图方案设计

    硬件设计系统 (末尾附文件) 原理图: 仿真图 时钟电路模块 时钟电路模块 时钟电路由一个晶体振荡器12MHZ和两个30pF的瓷片电容组成.时钟电路用于产生单片机工作所需的时钟信号,而时序所研究的是指 ...

  8. 单片机设计时钟程序c语言,基于.C51单片机的数字时钟课程设计(C语言,带闹钟).pdf...

    - - .. -- 单片机技术课程设计 数字电子钟 学院 : word 可编辑 . - - .. -- 班级 : 姓名 : 学号 : 教师 : 摘 要 电子钟在生活中应用非常广泛 ,而一种简单方便的数 ...

  9. C51 单片机简单实例

    实例一 独立按键,要求按下一个按键,显示一个 LED 灯. 电路 其中 P0 由于工作在 I/O 方式时,其内部是漏极开路状态,因此,需要外接上拉电阻,其值大约为 10kΩ . 对于 LED 而言,这 ...

最新文章

  1. chart.Correlation绘制相关性热图
  2. 基因组组装(Genome Assembly)
  3. 独家 | Python处理海量数据集的三种方法
  4. 美团副总裁夏华夏:科技应该为每一个普通人服务,要做“接地气的AI” | MEET2021...
  5. leetcode 113. 路径总和 II
  6. Linux 检查域名服务,linux上的域名服务
  7. Android 中的线程池
  8. X Lossless Decoder for mac(XLD音频无损解码器)
  9. 可编辑ppt地图分布图怎么做?
  10. [python3][题解]拖拉机
  11. DBA必知的170张Oracle常用动态性能表介绍
  12. mongodb 副本集测试
  13. OPPO A35上手简评:一款中规中矩的入门级智能手机
  14. docker-compose.yml修改volumes后重启不生效
  15. 《保健养生》---保健专家齐国力[2]
  16. 7-3 求最大值 (10 分)
  17. linux中mkfs是什么命令,如何在Linux中使用mkfs命令[用于磁盘格式化]
  18. 7-6 输出三角形面积和周长 (15分)
  19. 圆形比例分布图怎么做_使用PPT制作环形比例图的方法
  20. IPX:互联网分组交换协议--网络大典

热门文章

  1. Javascript面向对象编程思考与总结
  2. 全网全牛批的java八股面试文(最全)堪称2022最强
  3. 艾美捷人髓过氧化物酶MPO ELISA试剂盒应用分析
  4. fstab与mtab
  5. cesium实现添加在线地图的偏移纠正
  6. 汇编程序设计与计算机体系结构软件工程师教程笔记:汇编语法基础知识
  7. C++编程,数据结构,算法类面试题集
  8. 加油折扣系统,加油优惠软件
  9. codePen前端编码神器
  10. 送给社会格斗场上的暗夜孤星