C51单片机 简单的交通红绿灯设计一

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

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

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

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

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

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

C51单片机 简单的交通红绿灯设计一
C51单片机 简单的交通红绿灯设计一

一个静态数码管其实是由八个小的二极管组成,如上图,你可以看到,如果想让数码管显示数字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函数是可以在生成器中自动生成的,看下图:

C51单片机 简单的交通红绿灯设计一

系统频率也就是晶振,结合自己的板子,有的是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 light
                NiXie(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 light
                NiXie(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单片机 简单的交通红绿灯设计一
C51单片机 简单的交通红绿灯设计一
C51单片机 简单的交通红绿灯设计一

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

如有写的不对的地方,非常期待能收到您的指正。文章来源地址https://www.toymoban.com/news/detail-426894.html

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

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

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

相关文章

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

            单片机P1口控制数码管段选,P2口控制数码管位选,P0口控制两边的灯光。         首先是数码管控制函数,声明一个变量shift作为数码管位移量,首先进行位选,这里数码管使用的是共阴极数码管,所以位选脚为低时点亮,因为位移时除了置1的位保持1,其他的

    2024年02月11日
    浏览(39)
  • 基于AT89C51单片机的交通灯设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87779238?spm=1001.2014.3001.5503 源码获取 主要内容: 在日常生活中,交通灯是一项必不可少的公共设施,可 以维护道路的畅通和交通的秩序。如若交通灯发生故障,那 么后果可想而知。因此,交通灯

    2024年02月08日
    浏览(58)
  • 基于单片机的红绿灯智能控制系统设计

    收藏和点赞,您的关注是我创作的动力   随着社会经济的快速发展以及人们生活水平的提高 ,机动车数量也在急剧增加 ,交通问题逐渐成为人们关注的重点对象,因城市发展所带来的交通拥堵等问题,利用智能交通来解决传统交通日渐出现的问题成为大势所趋。本设计基

    2024年02月04日
    浏览(74)
  • 基于AT89C51单片机的交通灯设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87763760?spm=1001.2014.3001.5503 源码获取 主要内容: 设计一个能够控制十二盏交通信号灯的模拟系统,:利用单片机的定时器定时,令十字路口的红绿灯交替点亮和熄灭,并用LED灯显示倒计时间。 基本要

    2024年02月08日
    浏览(53)
  • 基于AT89C51单片机的十字路口交通灯设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87849986?spm=1001.2014.3001.5503 源码获取 主要内容: 本项目中采用单片机 AT89C51为中心器件来设计交通信号灯控制器, 系统实用性强、操作简单、扩展性强。本设计系统就是由单片机最小系统、交通灯

    2024年02月09日
    浏览(61)
  • 简单的C51单片机项目之LCD1602时钟

    一,实验现象 实验项目现象如下:     这个项目需要用到51单片机板上的功能如下: 1.独立按键 2.LCD1602 3.定时器中断 功能介绍 1.独立按键实现三个功能,选择键,增大键,减小键。 2.lcd1602显示时间 3.定时器中断确定时间 代码如下:    

    2024年02月11日
    浏览(46)
  • 单片机C51数据类型

    C51数据类型 C语言的基本数据类型:char、int、short、long、float、double。 1、 Keil C51 编译器支持的数据类型。    对于Keil C51编译器,short型与int型相同,double型与float型相同。 Keil C51支持的数据类型表 数据类型 长度 值域 unsigned char 单字节 0~255 signed char 单字节 -128~+127 unsigned

    2024年02月08日
    浏览(76)
  • 初识C51单片机(详解)

    前言: 单片机是一种我们常见的开发板,我们经常会在一些项目中使用到它。而今天我们要介绍的是C51单片机,下面来介绍一下今天的”主角“:STC89C52RC40I-LQFP44单片机(后面将用到它做一些项目)。 1.了解命名规则一张图搞定: 2.学会看单片机电路原理图 只是一些初中的电

    2024年02月10日
    浏览(66)
  • c51单片机(预备知识)

            单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备(小键盘、LED显示器)。 0)  无源晶振:12MHZ 1) 振荡周期 :也称时钟周期,是指为单片机提供

    2024年02月08日
    浏览(102)
  • C51单片机实验——中断实验

    实验环境:普中实验系统;Keil μVision 4软件; 实验目的: (1)掌握单片机中断原理和中断响应过程。 (2)设计自己的中断程序具体实验内容,并通过程序设计控制实验箱上的2个按键,实现对应的中断内容。 硬件连线: 按键k3连接P3.2口 按键k4连接P3.3口 LED灯连接P2口 实验主

    2024年02月05日
    浏览(71)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包