51单片机-----------四向交通灯

最新更新时间:2021-08-02来源: eefocus关键字:51单片机  AT89C51

一 实验目的:

实验4:运用AT89C51芯片实现四向交通灯:

(1) 掌握C语言编程单片机控制程序的方法。

(2) 掌握使用Keil4软件编写、编译、调试程序的方法。

(3) 掌握使用Proteus软件绘制电路原理图、硬件仿真和程序调试。

(4) 理解和掌握共阴极数码管的显示原理和编码(记忆)。

(5) 熟悉使用51单片机I/O端口实现对外部用电器和电路的控制。


二、实验硬件和软件:

计算机1台、并安装Proteus8.6软件和Keil4软件。


Proteus8.6中会运用的部件:7SEG-MPX2-CC、AT89C51、BUTTON、LED-GREENREDYELLOW、RESPACK-8d


三、试验任务:

1.使用Proteus排线连接的方式,在单片机I/O口上外接LED灯和数码管(用网络标识符),最终实现数码管从20-0的倒计时显示效果,为最终的实训项目一做准备。(要求:显示效果数码管显示间隔时间为1S,可以在完成该实验的基础上增加实验内容:两位数从20到1的交通灯计时显示。)


2.并且使用中断口P3^4使当操作者按下独立键盘使南北方向的交通灯变为绿色可通行,而西北方向的交通灯变为红色禁止通行,让救护车、消防车等紧急车辆通过。


以下内容为这次实验的主要内容(实验报告其余内容可参照本人的其余实验报告)

四向交通灯相关代码:


void  jinji()    //紧急函数(为了完成老师要求:按下独立键盘使南北方向的交通灯变为绿色可通行,而西北方向的交通灯变为红色禁止通行,让救护车、消防车等紧急车辆通过)

{

SN_green=0;

SN_red=1;

SN_yellow=1;

WE_green=1;

WE_red=0;

WE_yellow=1;    

while(1)

{

if(k2==0)          

         {

        delayxms(3);

        if(k2==0)

         {

while(!k2);

TR0=1;   

if(flgaa==0) jtda();  

if(flgaa==1) jtdb();   

if(flgaa==2) jtday();  

if(flgaa==3) jtdby(); 

         }

}

}


代码中一些位的申明以及自己所写代码的调用:


#include

#include

#include   //自己所调用的一些函数【中断程序】


sbit smg1=P3^0;    //数码管的高低位定义

sbit smg2=P3^1;    

sbit smg3=P3^2;   

sbit smg4=P3^3;    


sbit SN_green=P2^7;    

sbit SN_red=P2^6;    

sbit SN_yellow=P2^5;    


sbit WE_green=P1^0;    

sbit WE_red=P1^1;    

sbit WE_yellow=P1^2;      


sbit k2=P3^4;    


/*记住缩写函数要在前面申明调用*/


int kkk=0,fk=0;

int djs22,js1=0,djs21,flgaa,nbdjs=20,dxdjs=20;

int js=0,djs=20,djs1=20;                        

int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x00};


数码管的显示:


void  djsxs22()

{ int b1,b2;

  b1=djs1/10;    //赋值给数码管高位

b2=djs1%10;    //余数给数码管低位

P0=table[b1];

    smg1=0;

    delayxms(3);

    smg1=1;   


P0=table[b2];

smg2=0;

delayxms(3);

smg2=1;   

P0=table[b1];

    smg3=0;

    delayxms(3);

    smg3=1;    


P0=table[b2];

smg4=0;

delayxms(3);

smg4=1;   


四向交通灯的三个LED灯的显示:


void jtdb()

{

qm();  

flgaa=1;

WE_green=0;  

SN_red=0;  

while(1)

{

if(djs1>5)  

{

if(k2==0)  

         {

        delayxms(3);

        if(k2==0)           

         {

while(!k2);  

TR0=0;  

jinji();

}

djsxs22();  

}

   if(djs1<=5)   

{

jtdby();  

}

}

}


void jtdby()

{

qm();  

flgaa=3;  

WE_green=1;  

WE_yellow=0;  

SN_red=0;   

while(1)

{

if(k2==0)    

         {

        delayxms(3);

        if(k2==0)

         {

while(!k2);    

TR0=0;    

jinji();    

}

}  

djsxs22();   

if(djs1<0)   

  {

    djs=dxdjs;  

djs1=nbdjs;  

jtda();

  }

}

}

void jtda()

{

qm();  

flgaa=0;

SN_green=0;   

WE_red=0;   

while(1)

{

if(djs>5)  

{

if(k2==0)   

         {

        delayxms(3);

        if(k2==0)

         {

while(!k2);   

TR0=0;   

jinji();   

}

}

djsxs22();

}

if(djs<=5)   

{

jtday();   

}

}

}

void jtday()

{

qm();   

SN_green=1;  

SN_yellow=0;  

WE_red=0;  


flgaa=2;  

while(1)

{

if(k2==0)   

         {

        delayxms(3);

        if(k2==0)

         {

while(!k2);  

TR0=0;  

jinji();   

}

djsxs22();   

if(djs<0)   

{

  djs=dxdjs;   

  djs1=nbdjs;   

  jtdb();  

}

}

}


这上面是keil的部分。


在Proteus8.6软件进行仿真;

1、所使用的部件:

7SEG-MPX2-CC

AT89C51

BUTTON

LED-GREENREDYELLOW【LED灯三个(黄 绿 红)】

RESPACK-8d


连线方式:

连线方式

实验展示

在这里插入图片描述

关键字:51单片机  AT89C51 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic543524.html

上一篇:学习笔记 从零开始学单片机(9) 串口通信
下一篇:51单片机------数码管【有74HC753】

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机-实际LED硬件连接
通,灯就被点亮了。那单片机IO端口输出的是高电平(5V)时,则没有形成压差也就产生不了电流,那么箭头不能代表此时有电流流向这个方向,所以“+5”与R1是断开状态,灯没有被点亮。箭头起到的就是辅助我们理解的优势。这样我们可以根据箭头很形象的判断出单片机IO端口输出什么电平状态时就可以点亮LED。R1,R2电阻起到的是限流保护。同理,右图使用的是NPN型三极管,那么单片机IO端口输出高电平时点亮LED,输出低电平时点不亮LED。《手把手教你学51单片机》文档第3.3节有全面讲解这部分知识。 2.三八译码器有一种元器件只需要用到我们单片机三个IO端口就可以控制它的八个引脚其中的一个输出低电平,开发板就用到这种叫74HC138三八
发表于 2021-08-13
<font color='red'>51单片机</font>-实际LED硬件连接
51单片机-程序点灯
1.头文件在 #include<reg52.h>头文件中,把单片机中的寄存器地址封装起来定义成宏供我们调用,寄存器这个概念我们初学先不用太深刻的去理解它,在《手把手教你学51单片机》文档中2.4.1节有讲解,大家熟读几遍,如果还是无法理解后面我们再用程序配合硬件来领悟它们的作用。 2.单片机端口首先我们知道STC89C52RC这个芯片有4*8=32个IO端口是可以被我们用程序控制输出高电平或低电平的。拿P0表示它可以一次性控制8个引脚端口输出每个引脚想输出的电平状态,P0是一个寄存器,它的功能是控制所对应的8个单片机IO端口(P0.0~P0.7)输出我们想要输出的电平,比如我们控制P0.0单个IO端口输出
发表于 2021-08-13
<font color='red'>51单片机</font>-程序点灯
51单片机-初识原理图
的引脚IO端口可以通过程序烧写进去来控制此引脚是想变成5V电压还是0V电压。而通过此电路接法: 5V→电阻→LED正极→LED负极→单片机IO端口 就可以控制LED的亮灭了。在《手把手教你学51单片机》文档的2.3节有详细讲解。此外要说明的是单片机的引脚电压有且只有两种状态:高电平(5V)或低电平(0V),在程序中又用1来表示高电平,用0表示低电平。灯受单片机引脚控制亮灭
发表于 2021-08-13
<font color='red'>51单片机</font>-初识原理图
51单片机-前期准备
1.学习前提单片机是需要与程序打交道的,这个需要您先掌握很基础的C语言知识,即便我们讲解程序的执行过程尽量详细,但对于没有任何C语言知识基础的同学来说这将是举步维艰的。所以您必须掌握以下最基本的知识1.数据类型2.十六进制,十进制,二进制之间的转换3.程序的运行顺序4.if,else,while,for,switch等语句 2.硬件如果您对模电数电知识没有相关概念,以及对电子元器件尚不知晓,这些都不是学习单片机的困难,我们都会在教程里简单介绍硬件基础,您也可以参考学习宋老师的《手把手教你学51单片机》的前三章,这些只要您对中学物理电路和电路基础知识有一定的了解都可以看得懂。我们也鼓励大家学会在网上查找相关资料加深对电路
发表于 2021-08-13
51单片机-开发板选择
单片机的学习过程十分重视实践操作,仿真软件不过是纸上谈兵,我们需要有一个看得见摸得着的学习工具,那就是单片机开发板! 1.教程所用的开发板我们知道,学习C语言首先选择的是用哪一个软件做上机实践,那么本教程也一样,需要选择一块开发板来作为模板教学。经过价格和开发板的硬件资源的稳定性考虑,本教程决定选用:金沙滩工作室 KST—51 手把手教你学单片机开发板! 2.选择原因首先,宋老师的51单片机开发板的硬件设计用到了很多模电知识,可以帮助我们更加扩展的学习,他配套的教程资料《手把手教你学51单片机》有很多基础知识的讲解,而且资料免费公开。其资料后期的代码很灵活的运用了C语言编程技巧,这些都是值得我们参考借鉴
发表于 2021-08-13
51单片机-单片机简介
的比赛做准备,而学生能够做得出与单片机相关项目的实物来我想应该都是有过一定的比赛经验的。单片机无论在就业或者比赛中所占有的地位举足轻重。 3.难度单片机的难度就在于程序与硬件之间抽象复杂的关系,很多初学者感到学习的困难不是因为没有数电模电基础,而是对于程序的执行和硬件上的处理过程非常烧脑。即使有部分同学掌握过C语言基础上机操作也未能分析的出单片机的执行原理,很多时候他们都无奈地从入门到放弃,部分自学者也因为没有人做指导而走了不少弯路。针对这些问题,本教程会在硬件与程序之间的执行关系做详细的解释。 4.单片机选型关于单片机型号的选择,我们采用的是51单片机系列的STC89C52RC作为模板教学,晶振选择
发表于 2021-08-13
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved