基于51单片机的简易红绿灯电路

这篇具有很好参考价值的文章主要介绍了基于51单片机的简易红绿灯电路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于51单片机的简易红绿灯电路

        单片机P1口控制数码管段选,P2口控制数码管位选,P0口控制两边的灯光。

void SMG_shift()
{
	P2=~(0x01<<shift);
	switch(shift)
	{
		case 0:bits=second1/10; break;
		case 1:bits=second1%10; break;
		case 2:bits=second2/10; break;
		case 3:bits=second2%10; break;
	}
	P1=smg[bits];
	shift=(shift+1)%4;
}

        首先是数码管控制函数,声明一个变量shift作为数码管位移量,首先进行位选,这里数码管使用的是共阴极数码管,所以位选脚为低时点亮,因为位移时除了置1的位保持1,其他的位都会变成0(例如0x01<<1是0x02,0xfe<<1是0x0xfc),为了避免位移时会点亮其他数码管,这里对0x01位移后进行取反,switch语句对变量bits赋值,结合数码管段码表达到第一位显示计时器一的十位,第二位显示计时器二并以此类推的效果。

void timer()
{

	if(second<=60 && second>33)								//左绿灯右红灯
	{		
		status1=1;
		status2=3;
		second1=second-33;									//左边倒计时为second-33
		second2=second-30;
	}
	if(second<=33 && second>30)								//左黄灯右红灯
	{
		status1=2;
		status2=3;											//此时左右倒计时相等
		second2=second-30;
		second1=second2;
	}
	if(second<=30 && second>3)								//左红灯右绿灯
	{
		status1=3;
		status2=1;
		second1=second;										//左倒计时等于second
		second2=second-3;									//右倒计时比左倒计时少3秒
	}
	if(second<=3 && second>=0)								//左红灯右黄灯
	{
		status1=3;
		status2=2;
		second1=second;
		second2=second;
	}
	second--;												
	if(second==0)
		second=60;
}

        倒计时的效果用变量second实现,将一个红绿灯周期设定为60秒,则在60秒中需要实现左绿右红,左黄右红,左红右绿,左红右黄的循环,黄灯占用3秒,绿灯27秒,红灯30秒,在倒计时函数中分别对计时器一二进行赋值,显示当前灯的剩余时间,对status赋值控制灯的变化。

void Light_Ctrl()											//红绿灯控制
{
	switch(status1)
	{
		case 1: P0 |= 0x07; P0 &= 0xfe; break;
		case 2: P0 |= 0x07; P0 &= 0xfd; break;
		case 3: P0 |= 0x07; P0 &= 0xfb; break;
	}
	switch(status2)
	{
		case 1: P0 |= 0x38; P0 &= 0xf7; break;
		case 2: P0 |= 0x38; P0 &= 0xef; break;
		case 3: P0 |= 0x38; P0 &= 0xdf; break;
	}
}

        灯光控制函数利用上一个函数对status的赋值控制P0口输出,在灯光变化之前先对之前的状态用|=置1,再用&=置0(这里的灯光是低电平点亮),否则在变灯的时候会出现三个灯同时亮的情况。

void main()
{
	Timer0Init();
	P1=0xff;
	P0=0xff;
	second1=27;
	second2=30;
	while(1);
}

        主函数包含了定时器0、P0P1口和计时器变量的初始化,while(1)死循环避免main函数循环运行。

void timer0ISP () interrupt 1   							//定时器0中断服务函数
{
    TH0=(65536-1000)/256;  									//1ms一次脉冲
	TL0=(65536-1000)%256;
	Light_Ctrl();
	i++;
	SMG_shift();
	if(i>=1000)
	{
		i=0;
		timer();
	}
}

        定时器0中断服务程序包含灯光控制及数码管刷新函数,1秒运行一次倒计时函数。

        全部代码

#include <REG51.H>
#define uint unsigned int
#define uchar unsigned char
	
uint second1,second2,i,bits,status1,status2,shift;
uint second=60;
uchar smg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void Timer0Init()
{
	TMOD=0x01;												//工作模式1 ,需赋初值
	TH0=(65536-1000)/256; 									//定时1000,高八位
	TL0=(65536-1000)%256;
	EA=1;													//打开中断允许总开关
	ET0=1;													//定时器0中断允许
	TR0=1;													//定时器0启动控制
}

void SMG_shift()
{
	P2=~(0x01<<shift);
	switch(shift)
	{
		case 0:bits=second1/10; break;
		case 1:bits=second1%10; break;
		case 2:bits=second2/10; break;
		case 3:bits=second2%10; break;
	}
	P1=smg[bits];
	shift=(shift+1)%4;
}

void timer()
{

	if(second<=60 && second>33)								//左绿灯右红灯
	{		
		status1=1;
		status2=3;
		second1=second-33;									//左边倒计时为second-33
		second2=second-30;
	}
	if(second<=33 && second>30)								//左黄灯右红灯
	{
		status1=2;
		status2=3;											//此时左右倒计时相等
		second2=second-30;
		second1=second2;
	}
	if(second<=30 && second>3)								//左红灯右绿灯
	{
		status1=3;
		status2=1;
		second1=second;										//左倒计时等于second
		second2=second-3;									//右倒计时比左倒计时少3秒
	}
	if(second<=3 && second>=0)								//左红灯右黄灯
	{
		status1=3;
		status2=2;
		second1=second;
		second2=second;
	}
	second--;												//每运行一次该函数减一秒
	if(second==0)
		second=60;
}


void Light_Ctrl()											//红绿灯控制
{
	switch(status1)
	{
		case 1: P0 |= 0x07; P0 &= 0xfe; break;
		case 2: P0 |= 0x07; P0 &= 0xfd; break;
		case 3: P0 |= 0x07; P0 &= 0xfb; break;
	}
	switch(status2)
	{
		case 1: P0 |= 0x38; P0 &= 0xf7; break;
		case 2: P0 |= 0x38; P0 &= 0xef; break;
		case 3: P0 |= 0x38; P0 &= 0xdf; break;
	}
}

void main()
{
	
	Timer0Init();
	P1=0xff;
	P0=0xff;
	second1=27;
	second2=30;
	while(1);
}

void timer0ISP () interrupt 1   							//定时器0中断服务函数
{
    TH0=(65536-1000)/256;  									//1ms一次脉冲
	TL0=(65536-1000)%256;
	Light_Ctrl();
	i++;
	SMG_shift();
	if(i>=1000)
	{
		i=0;
		timer();
	}
}

        仿真电路图

基于51单片机的简易红绿灯电路

 文章来源地址https://www.toymoban.com/news/detail-502596.html

到了这里,关于基于51单片机的简易红绿灯电路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机STM32交通灯红绿灯十字路口信号灯类设计功能要求汇总

    浏览必读: 使用搜索可以达到事半功倍的效果。 电脑浏览器CTRL+F可以使用搜索查找 功能说明: 1.四路交通灯,带有红绿灯倒计时,绿灯倒计时结束后转黄灯5秒,再转红灯。 2.紧急情况下按键紧急按钮,四路黄灯快闪。 3.可以动态设置红绿灯时间。 涉及知识点:按键扫

    2024年02月11日
    浏览(109)
  • AT89C51单片机红绿灯控制源代码(C语言版)附带Proteus电路图

    这个代码需要稍微改一下才能运行,看得懂的不超过1分钟应该能够搞好。看不懂的无法运行

    2024年02月07日
    浏览(39)
  • 基于OpenCV的红绿灯识别

    为了实现轻舟航天机器人实现红绿灯的识别,决定采用传统算法OpenCV视觉技术。 航天机器人的红绿灯识别主要基于传统计算机视觉技术,利用OpenCV算法对视频流进行处理,以获取红绿灯的状态信息。具体而言,该系统通过连接工控机摄像头读取视频流,将视频帧转换成HSV色彩

    2024年02月15日
    浏览(39)
  • 基于STM32的红绿灯设计

    基于protrus8设计电路原理图 先要思考明白十字路口红绿灯的逻辑 东西是一样的,南北是一样的。 东西红灯,南北就是绿灯,反之一样的,弄明白这些写代码就有思路了 中间的两个数码管是模拟真实红绿灯倒计时的用的,放置4个也行,但是为了方便观看就放一个了 下面放几

    2024年02月11日
    浏览(36)
  • 基于51单片机的简易电梯系统的设计

      系统概述 设计要求 根据所学的知识以及技能,利用MCS-51系列单片机为中心设计一个简易电梯系统,实现四层电梯的无故障运行,并用数码管和指示灯显示对应楼层和运行方向等基本信息。设计所用的单片机为STC89C52为主要的控制器,自带AD转换,当一边有按键按下时,另一

    2024年02月09日
    浏览(50)
  • 深度学习之基于Yolov5闯红灯及红绿灯检测系统

    欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。    基于Yolov5的闯红灯及红绿灯检测系统是一种使用计算机视觉和深度学习技术实现的交通监控系统。它能够检测交通信号灯的状态(红灯、黄灯、绿灯),并识别车辆是否违反交通信号(闯红

    2024年02月06日
    浏览(38)
  • 基于51单片机的简易交通灯仿真代码讲解

    J028 51单片机简易交通灯易懂版_仿真+代码+报告讲解 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 51单片机简易交通灯易懂版仿真代码讲解 状态1:南北方向绿灯通行12秒,东西红灯禁止通行15秒,分别倒计时; 状态2:南北方向黄灯提醒3秒,东西继续红灯倒计时;

    2024年02月02日
    浏览(56)
  • 基于51单片机LCD1602的简易矩阵键盘密码锁

    初次开始写博客,表达方面也许会有很多不足,希望自己能通过这种方式巩固自己的学习和锻炼表达能力,同时也是对于自己学习的记录。 四位密码锁,密码可更改,输入仅四次以内有效 矩阵键盘定义为1-16,顺序为从左上到右下,1-10号为密码输入键位,对键码取余,输入

    2024年01月23日
    浏览(57)
  • 29、基于51单片机简易电子琴(有存储功能)系统设计

     随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。我们都会抽空欣赏世界名曲,作为对精神的洗礼。本论文设计一个基于单片机的简易电子琴。我们对于电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器等等也很

    2024年02月03日
    浏览(45)
  • 基于51单片机的简易电容值测量仪proteus仿真设计

    51单片机简易电感测量仪仿真设计( proteus仿真+程序+讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0039 单片机最小系统,或者称为 最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般应

    2024年02月12日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包