精华内容
下载资源
问答
  • 这是一款基于51单片机的电子秤,具有测量物品重量,去皮,单价总价计算等功能(包含原理图等等)
  • 基于51单片机的密码锁

    万次阅读 多人点赞 2021-01-17 10:50:44
    本次的项目是基于51单片机的密码锁,适合用来作为课程设计 主要实现了:密码锁功能,通过矩阵按键输入密码,输入范围为0-F,共有四位;同时,也可以使用更改按键更改密码,在更改时需要输入原密码来进入更改模式,四...

    本次的项目是基于51单片机的密码锁,适合用来作为课程设计

    主要实现了:密码锁功能,通过矩阵按键输入密码,输入范围为0-F,共有四位;同时,也可以使用更改按键更改密码,在更改时需要输入原密码来进入更改模式,四位密码显示H标识,成功修改后,红绿指示灯会同时闪烁;在输入密码正确后,绿色指示灯点亮,舵机启动,模拟密码锁的打开过程;错误时则会红色指示灯亮起。

    本项目的优点在于加入了舵机来仿真密码锁的开关,这就意味着这不是个单纯的仿真了,至少是在PCB打样焊接后,这是个可以使用的东西,而不是现在网上那些没法出东西的虚拟仿真!!

    原理图

    同时,这次的设计还加入了AT24C02,这是个IIC接口的EEPROM器件,通过这个内存芯片,我们就可以储存密码,这样就可以实现每次上电后,自动加载修改过后的密码。但是!!!由于Proteus的破解问题,在A版的仿真中,写入内存无法实现,但是实际在实物中可以实现,B版不包含掉电写入功能,初始密码均为1121。

    本项目的文件夹里包含了两个版本的PCB,可以直接打样来制作实物
    A版PCB侧视图
    A版PCB俯视图

    注意!!在PCB中有两个贴片电阻,这两个电阻的作用是防止舵机驱动芯片L298N的电流传感引脚直接接地,可以选择焊接0欧电阻,或者是选择使用一根飞线连接,但是不可以不焊接。相关文章解析:AD原理图编译ERROR:GND contains Output Pin and Power Pin objects

    B版的设计也带有PCB,也是需要这两个电阻,不同点就在于不带有内存芯片,这对于一些要求较低的课设来说,可以有效的降低成本和难度,便于贴合实际设计能力。

    B版PCB侧视图
    部分代码如下所示:

    void main()  //主函数
    {
    	uchar i;
    	uchar x;//存放内存读取的标识
    	uint temp1,temp2;
    	EA=1;
    	EX0=1;
    	IT0=1;
    	x=At24c02Read(1);
    	if(x==3)
    	{
    		temp1=At24c02Read(4);
    		temp2=At24c02Read(7);
    		password[0]=smgduan[(temp1/10)];
    		password[1]=smgduan[(temp1%10)];
    		password[2]=smgduan[(temp2/10)];
    		password[3]=smgduan[(temp2%10)];
    	}
    	while(1)
    	{
    		if((time==0)&&(state!=1))        //初始化状态
    		{
    			LED_Green=1;
    			LED_Red=1; 
    			for(i=0;i<4;i++)                          
    			{
    				disp[i]=0xbf;     //写入横杠
    			}
    		}
    		keys_scan();        //扫描有无按键按下
    	}
    }
    

    本设计包含:Proteus仿真原理图、仿真设计;keil5的C语言代码;ad的原理图,PCB;产品说明书,所有代码都含有注释,这样便于理解,而且还有技术答疑!!

    完整项目获得处:加我QQ:2430687381
    资源有偿,谢绝白嫖

    展开全文
  • 基于51单片机电子时钟

    万次阅读 多人点赞 2019-01-05 21:39:20
    1 基于51单片机用LCD1602实现时-分的显示 2. 按键控制时-分的调整 3. 能实现整时报时的功能(蜂鸣器响) 4. 闹钟模式 5.按键切换模式(模式一:时-分显示,模式二:60秒倒计时) 一、设计思路: 主体: 通过外部中断...

    keil工程与protues仿真电路

    1 基于51单片机用LCD1602实现时-分的显示
    2. 按键控制时-分的调整
    3. 能实现整时报时的功能(蜂鸣器响)
    4. 闹钟模式
    5.按键切换模式(模式一:时-分显示,模式二:60秒倒计时)

    一、设计思路:
    主体:
    通过外部中断0来控制mod值;mod=0,1.2,3分别对应时钟模式,调整模式,闹钟设置模式,一分钟倒计时模式。
    细节:
    mod0
    通过定时计数器,每一秒增加变量秒(s),每60秒,增加1分(min)并且s置0,每60min,增加1小时h,当h>23,h=0;进行一天循环
    mod1
    按键控制增加min,h和s制0
    mod2
    另外设置变量min1,h1,当min=min1,h=h1时蜂鸣器响
    mod3
    设置变量daojishi=60, 通过定时计数器,每一秒daojishi减1,当daojishi<0时,蜂鸣器响
    另外:
    1.设置外部中断2,关闭蜂鸣器
    2.时间发送一次只能发送一个位

    程序:

    #include<reg52.h>
    //K1后K3加分钟,K4加时间,K2加秒,K1进入闹钟设置,K2退出
    //K2关闭闹钟
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    #define data8b P1
    
    sbit K1=P3^2;               //外部中断0
    sbit K2=P3^3;               //外部中断1
    sbit K3=P3^0;
    sbit K4=P3^1;
    
    sbit BUZ=P2^4;       //蜂鸣器,0响
    sbit RW=P2^5;        //4脚,数据(1)or命令(0)
    sbit RS=P2^6;        //5脚,读(1)写(0)
    sbit E=P2^7;         //6脚,使能信号
    
    u8 code dat1[]={0X30,0X31,0X32,0X33,
    	                               0X34,0X35,0X36,0X37,
    	                               0X38,0X39};
    
    void delay(u16 i)      //延时函数
    {
    	while(i--);
    }
    
    void open012()   //打开中断0,1,定时器中断0
    {
    	TMOD|=0X01;   //选择为定时器0模式,工作方式1
      
    	
    	ET0=1;        //打开定时器0中断允许
    	
    	EA=1;        //打开总中断
    	
    	TR0=1;       //打开定时器			
    	
    	EX0=1;              //打开外部中断0
    	IT0=1;             //边沿触发方式
    	EX1=1;              //打开外部中断1
    	IT1=1;             //边沿触发
      
    }
    
    
    void wrm(u8 dat)              //写入命令
    {
    	delay(1000);
    	RS=0;
    	RW=0;
    	E=0;
    	data8b=dat;
    	E=1;
    	delay(1000);
    	E=0;
    }
    
    
    void wrd(u8 dat)             //写入数据
    {
    	delay(1000);
    	RS=1;
    	RW=0;
    	E=0;
    	data8b=dat;
    	E=1;
    	delay(1000);
    	E=0;
    }
    
    void zero()
    {
    	wrm(0X38);                 //八位数据,两行显示,5*7
    	wrm(0X0c);                  //无光标,打开显示
    	wrm(0X06);                  //光标右移,屏幕不移动
    	wrm(0X01);                  //清屏
    	wrm(0X80);                  //设置数据指针起点
    }
    
    u8 fg=0,sg=0,bfg=0,bsg=0;
    u16 i=0;
    u8 s=0;
    u8 mod=0;
    char dingshi;
    bit bell=0;
    bit zanting=1;
    
    void fangsong()
    {
      wrd(dat1[sg/10]);                 //时十位
    	wrd(dat1[sg%10]);                 //时个位
    	wrd(0x3A);                     //:
    	wrd(dat1[fg/10]);                 //分十位
    	wrd(dat1[fg%10]);                 //分个位
    	wrd(0x3A);                     //:
    	wrd(dat1[(s/10)]);                 //秒十
    	wrd(dat1[(s%10)]);                 //秒个
    }
    
    
    void fangsong1()
    {
    	wrm(0X80);   
      wrd(dat1[sg/10]);                 //时十位
    	wrd(dat1[sg%10]);                 //时个位
    	wrd(0x3A);                     //:
    	wrd(dat1[fg/10]);                 //分十位
    	wrd(dat1[fg%10]);                 //分个位
    	wrd(0x3A);                     //:
    	wrd(dat1[(s/10)]);                 //秒十
    	wrd(dat1[(s%10)]);                 //秒个
    }
    void chuli()
    {
    	if(fg==60)
    	{
    		sg++;
    		fg=0;
    	}
    
    	if(sg==24)
    	{
    	
    		sg=0;
    	}
    	
    }
    
    
    
    void main()
    {
    	u8 shijian;
    	open012();
    	zero();
    	chuli();
    	fangsong();
    	shijian=100;
    	
    	
    	while(1)
    	{
    		while(mod==0)
    	{
    		EX1=1;              //打开外部中断1
    		if(s==60)
    		 {
    			 fg++;       //60秒转化为1分钟
    			 s=0;
    		 }
    				chuli();
    				if((fg==0)&&(shijian!=sg))
    				 {
    				  BUZ=0;
    					shijian=sg;
    				 }
    				fangsong1();
    				if((BUZ==0)&&(bell==0))
    			  {
    				delay(1000);
    				BUZ=1;
    			  }
    			if((fg==bfg)&&(sg==bsg)&&(bell==1))
    				BUZ=0;
    			else BUZ=1;
    			}
    	
    	
    			
    			while(mod==1)
    		{
    			EX1=0;              //关闭外部中断1
    			zero();
    	    fangsong();
    			if(K3==0)
    			  {
    				  delay(1000);
    				  if(K3==0)
    					  fg++;
    			   }
    			if(K4==0)
    			   {
    				  delay(1000);
    				  if(K4==0)
    					 sg++;
    			   }
    				 if(K2==0)
    			   {
    				  delay(1000);
    				  if(K2==0)
    					 s=0;
    			   }
    				 if(fg>59)
    				 {
    					 fg=0;
    				 }
    				  if(sg>23)
    				 {
    					 sg=0;
    				 }
    				 if(s>=59)
    				 {
    					 s=0;
    				 }
    	     }
    		
    			 
    			 
    			 while(mod==2)   //设置闹钟
    		{
    	    if(bfg==60)
    	    {
    		    bsg++;
    		    bsg=0;
    	    }
    	
    	    if(bsg==24)
    	    {
    		     bsg=0;
    	     }
    	    zero();
    			wrd(0x20);
    			wrd(0x20);
    			wrd(0x20);
    		  wrd(dat1[(bsg/10)]);                 //时十位
    	    wrd(dat1[(bsg%10)]);                 //时个位
    	    wrd(0x3A);                     //:
    	    wrd(dat1[(bfg/10)]);                 //分十位
    	    wrd(dat1[(bfg%10)]);                 //分个位
    			 if(K3==0)
    			{
    				delay(1000);
    				if(K3==0)
    					bfg++;
    			}
    			if(K4==0)
    			{
    				delay(1000);
    				if(K4==0)
    					bsg++;
    			}
    			bell=1;
    			zero();
    }
    		
    while(mod==3)
    {
    	while(zanting)
    	{
    	dingshi=60;
    	EX1=1;              //打开外部中断1
    	wrm(0X80);   
    	 wrd(dat1[(dingshi/10)]);                 //时十位
    	 wrd(dat1[(dingshi%10)]);            	//时个位
       }
       wrm(0X80);   
    	 wrd(dat1[(dingshi/10)]);                 //时十位
    	 wrd(dat1[(dingshi%10)]);            	//时个位	
    	while(dingshi<0)
    	{
    		wrm(0X80);   
    		 wrd(dat1[0]);                 //时十位
    	   wrd(dat1[0]);            	//时个位
    		BUZ=0;
    	}
    }
    }
    }
    
    void time0() interrupt 1
    {
       TH0=0XFC;	     //给定时器赋初值,定时1ms
    	 TL0=0X18;
    	 i++;
    	 if(i==1000)     //ms转化为s
    	 {
    		i=0;
    		 s++;
    		 dingshi--;
    	 }	
    }
    
    void key1() interrupt 0     //外部中断0,调整时间
    {
    	delay(1000);
    	if(K1==0)
    	  { 
    		  mod++;
    			while(!K1);
    	  }
    
    if(mod>3)
    {
    	mod=0;
    }
    	 zero();
    }
    
    void naozhong()  interrupt 2                     //开关闹钟
    {
    	if(K2==0)
    		{
    			delay(1000);           //消抖
    				if(K2==0)
    					{
    						bell=0;
    						BUZ=1;
    						zanting=~zanting;
    					}                       //关闭蜂鸣器
    						while(!K2);          //确认按键松开
         }
    }
    
    
    
    

    在这里插入图片描述

    二、收获
    1.更熟练掌握了定时器中断和外部中断的使用
    在这里插入图片描述

    在这里插入图片描述

    可以通过打开和关闭外部中断使同一个按键实现不同的功能

    2.了解到了一点寄存器操作

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    3.中断配置小结
    外部中断
    在这里插入图片描述
    定时器中断
    在这里插入图片描述

    串口通信
    在这里插入图片描述
    4.更熟练使用proteus
    制作了一个小型软件开发版
    在这里插入图片描述

    5.学会了如何学习一个新元器件(LCD1602)
    1.看说明书,重点是看时序图,真值表等
    2.按照时序图写程序
    3.一二都不成立时,查找相关资料
    6.下载原理
    单片机的烧写原理:
    单片机烧写,又称为单片机程序下载、烧录等,本质上是单片机和PC机按照芯片厂家规定的编程协议,通过芯片厂家规定的接口,把已编译好的程序传输到单片机,单片机把数据存储到自身存储器中。
    理解这个原理需要知道几个知识点:
    单片机内部是有程序的,是出厂时固化在硬件中,用户无法修改的(这也会被认为它内部没有程序),这些程序可以调用各种通信接口、内部存储器等;
    可以下载的通信接口:JTAG,SPI,UART,usb等;(还有很多可以扩展485、以太网等)
    编程协议:一般大厂都会公开的,在芯片的专用技术手册中会有;
    存储器:有很多种,掩膜,EPROM,EEROM,flash等寿命不一样,掩膜只能一次,而且要工厂做,flash擦写次数10000+;
    可以这样比喻性的理解:单片机就是电脑的主板,我们写的程序就是操作系统,主板里面装入引导操作系统的基本程序,下载程序就是给电脑装系统!

    7.其他
    1.理解了现在电子表的操作原理
    2.学会了借助现成品(电子表)作参考,写程序
    3.懂得了与人交流的重要性(受王同学的启发,完善了原有程序)

    三.后期计划
    1、继续32的学习
    2、练习焊功
    3、继续51其他外设的学习
    4、按兴趣学习电路、模电、数电、DXP等相关知识

    展开全文
  • 基于51单片机的交通灯控制系统设计

    万次阅读 多人点赞 2018-11-24 13:38:11
    本设计为基于51单片机交通灯系统的设计,采用模块化、层次化设计。运用单片机AT89C51进行数据的分析和处理,为显示提供信号,显示部分采用8位数码管显示倒计时值。系统电路简单、集成度高、工作稳定、调试方便、检测...

    第一章 硬件设计与原理
    以AT89C51单片机为核心,起着控制作用。系统包括数码管显示电路、复位电路、时钟电路、发光二级管电路和按键电路。设计思路分为六个模块:复位电路、晶振电路模块、AT89C51、数码管显示电路、发光二级管电路和按键电路这六个模块。

    在这里插入图片描述

    1.2 硬件设计分析
    1.2.1 电源的设计
    系统电源使用直流5伏。
    由电脑USB接口提供电源。
    USB是通用串行总线(Universal Serial Bus)接口的简称。它是目前使用比较广泛的电脑接口之一,主要版本有1.0、1.1和最新的2.0三种版本。根据USB总线的工业标准,它可以提供额定功率为5V/500mA的电源供USB设备使用。
    1.2.2 单片机最小系统
    51单片机是对目前所有兼容intel 8031指令系统的单片机的统称。该系列单片机的始祖是intel的8031单片机,后来随着技术的发展,成为目前广泛应用的8为单片机之一。单片机是在一块芯片内集成了CPU、RAM、ROM、定时器/计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称为MCU。51系列单片机内包含以下几个部件:
    一个8位CPU;一个片内振荡器及时钟电路;
    4KB的ROM程序存储器;
    一个128B的RAM数据存储器;
    寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;
    32条可编程的I/O口线;
    两个16位定时/计数器;
    一个可编程全双工串行口;
    5个中断源、两个优先级嵌套中断结构。
    如图1-2-1所示为AT89C51单片机基本构造,其基本性能介绍如下:
    图1-2-1 AT89C51单片机

    AT89C51本身内含40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中端口,3个16位可编程定时计数器,2个全双工串行通信口,STC89C51RC可以按照常规方法进行编程,但不可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
    AT89C51的主要特性如下表所示:

    在这里插入图片描述

    AT89C51为40脚双列直插封装的8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
    P0口:P0口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
    P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2 的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)。Flash编程和程序校验期间,P1接收低8位地址。
    P2口:P2是一个带有内部上拉电阻的8 位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX @RI指令)时,P2口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。
    P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash 闪速存储器编程和程序校验的控制信号。
    RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
    ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个AL脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条 MOVX 和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
    PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
    EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
    XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。
    XTAL2:振荡器反相放大器的输出端。
    单片机最小原理图如图1-2-2所示。
    图1-2-2 单片机最小系统

    单片机最小系统说明:
    时钟信号的产生:在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟振荡电路。
    时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
    一般地,电容C2和C3取30pF左右,晶体的振荡频率范围是1.2-12MHz。如果晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。
    单片机复位使CPU和系统中的其他功能部件都处在一个确定的初始状态下,并从这个状态开始工作。单片机复位条件:必须使9脚加上持续两个机器周期(即24个振荡周期)的高电平。
    1.2.3 显示系统
    数码管是一种半导体发光器件,其基本单元是发光二极管。
    数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
    数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
    1) 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动(要知道一个89C51单片机可用的I/O端口才32个呢),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
    2) 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
    本设计中数码管采用的是动态驱动方式。
    数码管外形如图1-2-3,数码管电路结构如图1-2-4。

    图1-2-3 数码管外形图
    图1-2-4 数码管电路结构示意图

    在这里插入图片描述
    图1-2-5 数码管显示电路
    1.2.4 发光二级管电路

    图1-2-6 发光二级管电路
    1.2.5 按键电路
    图1-2-7 按键电路

    第二章 软件设计与分析
    2.1 软件设计的组成
    该系统由延时子函数、数码管显示子函数、定时器0中断子函数、主函数和数据定义这几部分组成。
    在这里插入图片描述

    在这里插入图片描述

    //----------------------------------------------------------------------//
    上传过程感觉繁琐,里面可能有不全面的地方,请见谅。下面的是实现的目的。以及电路原理图

    **本次设计的主要目的是设计一个城市十字路口的交通灯控制系统,设计中将交通灯控制系统分为东西方向(主干道)和南北方向(次干道)两个方向,且在东西南北四个路口的每个路口设置红、绿、黄三个交通信号灯(用发光二极管模拟)和一个二位的LED数码显示管。设计的要求是规定在每一段时间内东西和南北两个方向中只有一个方向能够通行,另一个方向处于禁行状态,然后在经过一段时间后,禁行的方向和通行的方向互相转换状态,原来通行的状态变禁行状态,原来禁行的状态变为通行状态,如此循环下去。详细过程如下图2-1:
    状态① 状态②
    图 1图2-1 交通灯状态图
    状态①:东西方向的交通灯黄灯闪烁3秒后,红灯熄灭,绿灯点亮(东西方向允许车辆和行人通行),同时南北方向绿灯熄灭,红灯点亮(南北方向禁止车辆和行人通行),LED数码管倒计时显示40秒,在倒计时3秒时进入状态②。
    状态②:南北方向黄灯闪烁3秒后,红灯熄灭绿灯点亮(南北允许车辆和行人通行);同时东西方向绿灯熄灭,红灯点亮
    (东西方向禁止车辆和行人通行),LED数码管倒计时显示40秒,在倒计时3秒时进入状态①。
    接下来在没有人为干涉下将会一直按照上述进行循环。设计中还外设6个按键实现对交通灯控制系统的调控作用。

    电路原理图

    在这里插入图片描述

    在这里插入图片描述

    //——————————————————————————-——————————//
    相应的代码已经上传

    下载地址
    https://download.csdn.net/download/weixin_43442020/12231456

    下载链接里可以下载,解压后里面有压缩文件,压缩文件里面的资料更详细

    展开全文
  • 基于单片机的智能计算器!!!!!!!!!!!!!!!
  • 基于51单片机的智能家居设计,基于51单片机的智能家居系统设计,C,C++源码.zip
  • 基于51单片机的点阵屏设计,一个简单的单片机设计
  • 基于51单片机的交直流数字电压表第三版,基于51单片机的数字电压表设计,C51源码.zip.zip
  • 基于51单片机警灯

    2019-03-24 01:17:59
    基于51单片机警灯,附加详细代码注释讲解,给大家带来方便
  • 基于51单片机胸牌

    2019-03-24 01:23:51
    基于51单片机点亮一个小灯,附加详细代码注释讲解,给大家带来方便
  • 基于51单片机拨号

    2019-03-24 01:20:16
    基于51单片机点亮一个代驾显示,附加详细代码注释讲解,给大家带来方便
  • 基于51单片机的计算器

    万次阅读 2020-04-04 16:34:15
    继续写一下寒假做的51小项目,这一次是基于AT89C51的计算器,带一个八位密码锁功能。 具体实现了计算器的加减乘除功能,并且自带八位密码锁,输入密码后按“=”确定,错误输入三次密码就会锁定,重启后解除锁定,...

    继续写一下寒假做的51小项目,这一次是基于AT89C51的计算器,带一个八位密码锁功能。
    具体实现了计算器的加减乘除功能,并且自带八位密码锁,输入密码后按“=”确定,错误输入三次密码就会锁定,重启后解除锁定,密码可以在密码表中设定。显示部分采用了1602显示屏。

    原理图

    这一次在使用AD画PCB时,考虑到计算器要脱离电源使用,所以加上了5V电子电池供电电路,让产品更有实用性。
    PCB
    部分代码,受篇幅限制把剩下的东西打包在了文后链接(proteus+ad+keil)

    main()
    {
     uchar i,num,sign,s;
     uchar temp[16];
     bit firstflag;
     float a=0,b=0;
     Lcd_Init();
     DelayMs(10);
     LcdWrite_cmd(0x01);
     LcdWrite_string(5,0,"WELCOM !");
     LcdWrite_string(3,1,"BY toyjis_YAO");
     for(s=0;s<25;s++)
     DelayMs(200);
     LcdWrite_cmd(0x01);
     mima();
     DelayMs(200);
     LcdWrite_string(0,1,"                ");//清除该行
      LcdWrite_string(0,1,"Right Open!>>>>");//密码正确显示的信息
     for(s=0;s<25;s++)
     DelayMs(200);
     LcdWrite_cmd(0x01);
     while(1)
     {
     num=KeyPro();
     if(num!=0xff)
     {
      if(i==0)
      LcdWrite_cmd(0x01);
    

    资源包含:proteus仿真+原理图;keil编写的C语言程序;ad原理图+PCB;产品说明书。
    资源链接:
    加我QQ:2430687381
    资源有偿,谢绝白嫖

    展开全文
  • 基于51单片机的对讲机 原理图 原代码
  • 基于51单片机的RFID近场通信实现门禁系统开关
  • 单片机基于51单片机的温度传感器设计
  • 基于51单片机电子音乐门铃设计,采用89c51单片机基于51单片机电子音乐门铃设计,采用89c51单片机
  • 基于51单片机呼吸灯

    2019-03-24 01:30:46
    基于51单片机的开发详细讲解,为大家更好的学习51单片机,方便交流
  • 基于51单片机的开发详细讲解,为大家更好的学习51单片机,方便交流
  • 基于51单片机的16*16LED点阵,动态显示,74hc595和74hc154分别驱动行和列
  • 基于51单片机的抢答器,基于51单片机的抢答器,基于51单片机的抢答器,基于51单片机的抢答器,基于51单片机的抢答器基于51单片机的抢答器,
  • 基于51单片机的电子琴,文件内有程序的项目文件以及仿真文件,适合入门学习51单片机的爱好者。
  • 基于51单片机秒表.rar

    2021-09-07 20:27:17
    基于51单片机秒表
  • 基于51单片机的红绿灯设计

    万次阅读 多人点赞 2020-04-12 13:37:26
    寒假项目最后一个,基于STC/AT89C51的红路灯设计 实现十效果具体为:南北通行42秒,南北闪烁3秒,南北黄灯4秒,禁止通行1秒,东西黄灯4秒,东西通行27秒,东西闪烁3秒,东西黄灯4秒。同时具备特殊放行模式:南北自由...
  • 基于51单片机门铃设计.rar
  • 基于51单片机的电梯控制系统

    万次阅读 多人点赞 2020-04-27 18:43:04
    第一篇的项目,实现了51单片机控制电机,从而控制一台六层电梯。 具体说明:系统启动后自动定位到一楼。当外部按键按动时,电梯前往该楼层;内部按键共七个,其中六个对应六层,第七个为报警按键,按下后电梯停止...
  • 基于51单片机电压表

    2019-03-24 01:27:37
    基于51单片机的开发,附加详细代码讲解,为大家更好的理解
  • 基于51单片机的八位流水灯

    万次阅读 2020-04-02 19:47:04
    基于AT89C51的流水灯:流水灯共八个,可以实现交替闪烁,一起闪烁,左右流水灯等效果。 模式一:按动key1,实现1,3,5,7和2,4,6,8交替闪烁; 模式二:按动key2,实现D1→D8流水灯效果; 模式三:按动key3,实现全部...
  • 基于51单片机的超声波测距
  • 基于51单片机的火灾报警装置。
  • 基于51单片机数字万用表的制作方法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,919
精华内容 11,167
关键字:

基于51单片机