基于单片机的IC卡门禁系统设计

news2024/11/16 11:25:58

收藏和点赞,您的关注是我创作的动力

文章目录

    • 概要
  • 一、主要研究内容及总体设计方案
    • 1.1 系统方案设计
    • 1.2系统工作原理
  • 二、硬件设计
    • 2.1 主控电路
  • 三、软件设计
    • 3.2主程序设计
    • 实物
    • 附录1 原理图
    • 附录2 源程序清单
  • 四、 结论
  • 五、 文章目录

概要

  本论文重点通过对射频技术原理和射频卡来研究智能门禁系统,而主要的研究对象就是这款非接触式的IC卡门禁系统。相对于其它的门禁系统,它有着独特的优势,也使得它的使用最为广泛,它的核心技术是将射频识别技术和IC卡技术相结合,正是通过这种多部分技术相结合的形式,使得它的发展更有前景也更有发展潜力。本篇论文将几种不同的门禁系统进行了比较,选出合适的方案,并结合本系统预期要达到的特点加以改进,最后完成系统设计方案,并且详细的介绍了该门禁系统的硬件组成、软件组成,以及各部分的运行方式和参数。
  经过最终测试,本设计达到了预期的设计效果。这套IC卡门禁系统可以高效的识别IC卡模块的读写,磁锁部分也能及时的做出开关指令,并且在IC卡管理上可以进行加入用户卡,删除用户卡,以及键盘密码控制等功能。总体的系统功能均以达到了预期目的。

关键词:单片机;射频识别技术;IC读写模块;按键

一、主要研究内容及总体设计方案

1.1 系统方案设计

  方案一:本方案的核心在于系统的芯片选取上,这里选择的是PIC16C84单片机为核心芯片。之所以选这款单片机芯片是因为其强大的功能,CMOS EEPROM微控制器为8位,在模块功能上它的性能也十分强大,尤其是它的RISC信号指令。并且它的单字节的指令有35条,这使得它的运行速度更优于AT系列单片机。
  它的主要指令只需要一个指令周期,除了程序分支指令是需要两个指令周期,而程序分支指令应用并不是很多。在芯片内有1K×14的EEPROM程序存储器,而程序指令的宽度仅为14位。显示模块选用LCD1602液晶显示屏,键盘上选用独立式键盘,它的功能原理相对简单,键按指的令发出是通过判断芯片I/O口处读取口的电平的高低去判断的,从而达到发射指令控制的这样效果。
这套方案总体来讲核心功能十分强大,但是也有他的不足之处,就是这种方式的I/O口占用的数量相对较多。而且对键盘处理的这一部分还要克服一个键盘的抖动的问题。在我们现有的内力上想改善防抖问题,分为软件防抖和硬件防抖,而这一块的技术方面我们还尚未做到完善,所以这也是我们的备选方案之一。此方案应该选取的控制电路图如图1.1所示。
在这里插入图片描述

图1.1 独立式控制电路图

  方案二:本方案的核心在于系统的芯片选取上是十分重要的,我选用AT89C51这款芯片。之所以选择这款芯片是因为,这款芯片它具有很多优越性除了低功耗、稳定的性能之外还有CMOS 8位微控制器,这款控制器并不是最高效的控制器,但是作为我们系统控制器是足够的。
  除此之外它有系统可编程Flash存储器为4K字节。灵活的8位CPU和在系统可编程Flash,易失性存储与工业其他产品指令和引脚完全兼容,它的广泛使用与它良好的兼容性是分不开的。正因如此才使得性能不是最强大的AT89C51在市场有其足够的市场。
  在控制方面上我预计选用行列扫描的键盘形式,模块的电源正极通过一个小值电阻连接列线,这套模块有很多优势,它的输入端为列线连接的单片机I/O口,输出端是以行线所连接的单片机I/O口。它的工作原理是判断输入线的高低电平,进而判断是否有按键按下,正常时候是没有按键被按下,它输出端的所有列线都是高电平,当有键按下,高电平将会被输入线拉低。
  这套方案总体巧妙的运用了高低电平,并且性价比非常高,以一个较为经济的价格可以达到一个令人满意的系统控制效果,并且51系列单片机是一款我们相对熟悉的一款芯片,而行列式的控制模块也跟更容易理解其控制原理,方便我们后期的代码编写。所以方案二也是我们的备选方案之一。行列式的控制电路如图1.2所示。
在这里插入图片描述

图1.2 行列式的控制电路图

  方案三:本方案的核心在于系统的芯片选取上也是十分重要的,我们以MSP430单片机芯片为核心。这款单片机有很多它独有的优势,拥有16位的混合信号处理器,最大的特点就是它的功率功耗很小,并且它的健康使用时间更长,并且可以高效、精准的处理混合信号。最开始的时候它是由美国的德州仪器(TI)开始推出市场,它的应用也比较广泛,主要优势体现于高可靠性、方便扩展、功耗更小、所占空间更小、使用更为简洁等优点,主要针对于更大功能需求上的应用需要。
  系统上它把各个模块的模拟电路、数字电路和微处理器汇到一起,然后通过强大的芯片对其进行混合信号的处理,然后迅速发出指令,它的指令集是十分简单迅速的、更低的功耗的混合型单片机,这款单片机通体来说具有很好整合电路能力,所以这是我们选择这款芯片原因。然而我们在能完成相对简单的电路的前提下,我们考虑芯片的经济价格。
  最后就是我们整个电路的而核心控制模块的选取了。这是一款串并转换电路的键盘形式这款控制电路为74LS164,它一共有8个按键,工作原理为串并转化芯片它把SDA(P10)上的串行数据化为8位的并行数据。正是通过并行数据达到其数据传输的效果。它以S1-S8作为盘扫描,S1-S8依次输出低电平,当扫描到其他的管脚上是,如果S1~S7上的数据经过简单处理得到对应的键值。则说明扫描到的是P11等于0。如果P11检测为高电平,那么说明电路是没有按键为关闭状态。
  总体来讲,74LS164型号的控制器拥有较为齐全的功能,但是较我们以往的学习经验,这款74LS164型号的控制器我们应用较少,相对陌生。74LS164控制器电路图如图1.3所示。
在这里插入图片描述

图1.3 74LS164型号的控制器电路图

  通过以上三种方案的对比,第一种方案总体的功能十分强大,但是难以解决防抖问题,而第三套方案的功能也很成熟,但价格方面较高。综合上述方案的优缺点,我们基于经济和知识贮备等多方面的考虑,最终选择最为常用的方案二AT89C51系统。

1.2系统工作原理

(1)通过对系统初始化,然后通过扫描IC卡,系统会对卡片进行校验,校验成功方可打开电磁锁;
(2)智能门禁系统可以对IC进行增加或删除,并且带有显示器,可以直观的了解当前的系统或卡片情况,从而进行设置,而硬件上采用单片机和IC读写模块+DS1302+LCD1602液晶总线技术;
(3)具有通讯报警功能,绿灯表示允许通过,红灯表示禁止通过;
(4)门禁系统的本模块是将接触式IC卡技术应用于其中,使得整个门禁系统具有使用方便、快捷、安全的特点。除此之外还有很高的性价比和优越的扩展性。本系统结构框图如图1.4所示。
在这里插入图片描述

图1.4 系统结构框图

二、硬件设计

2.1 主控电路

在主控电路上,本系统采用的是最为经济常用的AT89C51单片机,它的工作电压为4.5V-5.5V,工作频率在40MHz之内。主控模块的是通过AT89C51对各部分模块进行功能整合最终达到完整系统运行的。它共有的四个并行的I/O口为P0.1、P0.1、P0.2、P0.3,这里面P0.1口只是普通的I/O口;P0.0可以做数据总线、地址总线的端口;P0.2可以做地址总线;P3的功能最为强大可以作为RXD、TXD、WR、RD、INT0、INT1来使用。正是因为其完善的端口功能也使得系统的各个模块正常运行得以保障。主控芯片AT89C51原理图如图2.1所示。
在这里插入图片描述

图2.1 AT89C51原理图

三、软件设计

3.2主程序设计

软件主程序是系统的监控程序,所以第一步就要将始化完成,在主程序可以完整运行的前提下控制程序的流向,然后调用相关子程序的功能。当子程序的运行也没有问题后,上电复位,程序开始运行。其中详细包括:
●单片机I/O口及内部寄存器变量初始化,使整个系统处于一个确定的工作状态。
●定时器TO和T1的初值的设置:定时计数器Tl用作串口通信的波特率发生器,波特率为9600bit/s;定时计数器T0用作定时计数器,定时时间为65ms。
●中断请求控制寄存器的设置,包括定时/计数器的中断标志、外中断1的触发方式控制位、串行发送/接收中断标志、中断的使能。
●LCD1602显示器工作状态寄存器的设置,除了显示器的亮度和清晰度之外还包括扫描位数的设定,以及系统开关的提示。
●读卡芯片工作寄存器的设置,然后对天线、询卡、缓冲区相关寄存器进行指令设置。设置成功之后,将程序进入循环状态,依次判断是否需要回铃、提示用户、设置管理RFID卡(新卡注册或旧卡注销)等。主程序工作流程图如图3.3所示。
在这里插入图片描述

图3.3 主程序工作流程图

系统工作流程:首先为系统供应5V电压,开启开关,选择按键按钮让其复位,然后读卡模块会自动寻卡,当管理IC卡刷过后,读卡系统会自动扫描,并且会进行防冲突和选择卡片等系统功能,最后进行验证,对卡进行操作是否写卡,如果通过写卡将经过写卡流程,如果系统识别为不写卡则会进行读卡操作,并且会进行上述操作。除此之外这部分还可以对有效卡片的删除和添加功能进行设置,按键输入和设置密码控制继电器,控制信号会同时反馈到液晶显示器上进行显示状态。本系统实现了IC卡刷卡产生的信号去控制继电器开断,以此表示门的开放或关闭,整套流程的实现最终构成一套完整的工作系统。

实物

在这里插入图片描述
在这里插入图片描述

附录1 原理图

在这里插入图片描述

附录2 源程序清单


#include<reg51.h>
#include<intrins.h>
sbit  cp=P1^0;
sbit  sck=P1^1;
sbit  so=P1^2;	
sbit  beep=P3^7;	
sbit  led5=P0^5;
sbit  KD_KEY = P2^6;
sbit  KEY_SDA=P2^7;
sbit  KEY_CLK=P2^5;
unsigned char  chcardno[10][5]={0};
unsigned char  cardok;
unsigned char j=0;
unsigned char count;
unsigned char a;
unsigned char cardno[5]={0};
unsigned char key_value;
unsigned char b=1;
//---------毫秒延时子程序----------
void  delay2(unsigned char ms)
{unsigned char i;
  while(ms--)
    {
      for(i=0;i<120;i++);
     }
}
//---------蜂鸣器--------------
unsigned  char  feib(void)
{
beep=0;
led5=0;
delay2(250);
beep=1;
led5=1;
delay2(250);
}
void send(unsigned char a)	 
//判断是不是有键按下
{
unsigned char i;
for(i=0;i<8;i++)
  {
   if(_crol_(a,i)&0x80)
     KEY_SDA=1;
   else
     KEY_SDA=0;
     KEY_CLK=0;
     KEY_CLK=1;
  }
}
unsigned char key(void)
//判断是第几键按下
{
unsigned char buffer,display_bit,i;
buffer=0xff;//赋初值为0xff
delay2(250);//延时去抖动
display_bit=0xfe;//扫描键盘
for(i=0;i<8;i++)
{
send(display_bit);
if(!KD_KEY)//是此键按下吗?
{ 
buffer=display_bit;//是,则保存其键值
return(i);
break;//退出
}
display_bit=_crol_(display_bit,1);
//检测下一键
}
}
//------同步串行口接收一字节-------
unsigned char rx1byte()
{
   char i;
   char rxdata;
   for(i=9;--i;)
    {
      rxdata<<=1;
      while(sck==0)//等待始终上升沿
        continue;
      if(so==1)//读数据
        ++rxdata;
      while(sck==1)
        continue;
    }
    return rxdata;
}
//--------同步串行口接收-------
unsigned char rx(void)
{
  char i;
  if(cp==1)//检测CP脚是否出现低电平
   return;
     EA=0;//屏蔽中断
 for(i=25;--i;)//保证CP的宽度大于时钟宽度
    {
      if(sck==0)
       {EA=1;
        return;
        }
     }
  while(sck==1)//等待时钟线出现低电平
    continue;
  cardno[0]=rx1byte();//读第一个字节
  cardno[1]=rx1byte();//读第二个字节
  cardno[2]=rx1byte();
  cardno[3]=rx1byte();
  cardno[4]=rx1byte();
  cardno[5]=rx1byte();   //读第六个字节
 while(cp==0)       //等待CP脚恢复高电平
    continue;
   EA=1;
//读卡结束,校验卡号
  i=cardno[0]+cardno[1]+cardno[2]+cardno[3]+cardno[4];
  if(i=cardno[5])
      {
	  cardok=1;
	  }
 }
//---------------管理卡程序-----------
unsigned char zjz (void)
{
 char i=0;
 while(1)
   {
     rx();
	 P0=0XFF;
	 if(cardok==1)//判断是否有刷卡
       {
	    cardok=0;	
         if(chcardno[0][5]==0)//判断是否有管理卡
               { 	
			    feib();
				feib();
			    chcardno[0][5]=cardno[5];//设计为管理卡
				}
         else
             {
if(chcardno[0][5]==cardno[5])//判断是否是管理卡
				   { 
				     feib();
					 feib();
					 feib();
					 delay2(250);
				     while(1)
					{
				      rx();
					  if(cardok==1)//判断是否有刷卡
					   {
					   feib();
					   cardok=0;
					   TR0=1;//起动定时器0
                       count=0;
					   break;
						}
					  
					 }
				    }
				   else
					 { 
					   for(a=1;a<=b;a++)
                        {
				          if(chcardno[a][5]==cardno[5])//判断是否是用户卡
                            {
                            feib();
						    break;
				             }
						 }
                     }
                }
        }
    }
}//----------定时器子程序---------
void timer1(void) interrupt 3
{
   TH0=(65536-50000)/256;
   TL0=(65526-50000)%256;
   count++;
   key_value=key();
	  switch(key_value)
	  {
	    case 0://按键1
			   feib();
			   chcardno[b][5]=cardno[5];//添加用户卡
			   cardno[5]=0;
			   b++;
			   break;
	    case 1://按键2
	          feib();
			  feib();
			   for(a=1;a<=b;a++)
			    {
				  if(chcardno[a][5]==cardno[5])
				      {
					   chcardno[a][5]=chcardno[b][5];//删除用户卡
					   }
				 }
				   
			   break;
		  case 2://按键3
		       feib();
			   feib();
			   feib();
		       chcardno[0][5]=0;//删除管理卡
			   break;  
		case 3://按键4
		       feib();
			   feib();
			   feib();
			   feib();
			   for(a=1;a<=b;a++)
			   {
		       chcardno[a][5]=0;//清空所有用户卡
			   }
			   break;
	  }
	if(count==50)//定时5S是否到
      { 
	    TR0=0;	
        EA=0;
	   }
}
//--------------------主程序--------------
void  main(void)
{
   TMOD=0x01;   //定时器0
   TH0=(65536-50000)/256;//定时器0初始华
   TL0=(65526-50000)%256;
   EA=1;
   ET0=1;
   P0=0XFF;
   zjz();
}


四、 结论

相对与其他磁卡锁系统如:生物虹膜门禁系统、指纹门禁系统、以及更为高级的面部识别系统相比,它们的使用范围不同,经济价格不同,方便程度也各不相同。IC卡门禁系统有着独特的自身优势,其价格更为经济,应用范围更加宽泛,可以满足大多数用户的使用。除此之外就是IC卡门禁系统的独有特性了,它可以通过较为简单的电路,通过对读卡器进行简单的设计,就可以满足更多复杂条件或多变环境下的场合工作。
通过本次设计项目,也让我对我们专业的内容有了更深入的了解,无论是Keil5的主程序设计、还是硬件上的读卡器设计、显示器模块的设计、控制电路的组装焊接、以及其结构组成都有了更深层次的了解。IC卡门禁系统的迅猛发展会随着我们的科技发展不断的发展,未来会增加更多方便、实用、安全的功能。并且在使用范围也会更加广泛,比如在住户、银行、公司企业和智能大厦等部门都可能会被广泛应用,甚至发展到其他经济发展较为落后的国家,总而言之科技的发展必将带来技术上的进步,IC卡门禁系统的未来发展必将呈现出势如破竹之势。

五、 文章目录

目 录
摘 要 I
Abstract II
引 言 1
1 主要研究内容及总体设计方案 3
1.1 系统方案设计 3
1.2系统工作原理 6
2 硬件设计 7
2.1 主控电路 7
2.2 电源模块电路 10
2.3 键盘模块电路 10
2.4 读卡器模块电路 10
2.4.1 读卡器模块 11
2.4.2 IC卡的功能组成 12
2.5 射频识别电路 14
2.6 显示模块电路 14
3 软件设计 16
3.1 系统程序开发流程 16
3.2 主程序设计 18
4 实物制作 21
结 论 23
参考文献 24
附录1 原理图 25
附录2 源程序清单 26
致 谢 32

………………62

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1139390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑上怎么录制视频教程带画笔工具?

无论你是创建教程、还是演示文稿&#xff0c;可能都希望使用带有画笔工具的录屏软件来帮助你创建吸引观众注意力的重要内容。幸运的是&#xff0c;有一些很棒的录屏软件可供你选择&#xff0c;本文就为你推荐一款带有画笔工具的最佳录屏软件&#xff0c;继续阅读查看吧&#xf…

明基、书客、小米的护眼台灯谁的更值得入手?三款台灯真实测评!

目前中国青少年近视占比是越来越高了&#xff0c;尤其是初中生更是重灾区。而现在看来小学阶段近视风险也有上升的趋势。所以&#xff0c;孩子在正式步入小学时&#xff0c;学习桌上不可或缺的就要放上一台好的且不错的护眼台灯。不过如今市面上的护眼台灯种类多到让人眼花缭乱…

Maven第三章:IDEA集成与常见问题

Maven第三章:IDEA集成与常见问题 前言 本章内容重点:了解如何将Maven集成到IDE(如IntelliJ IDEA或Eclipse)中,以及使用过程中遇到的常见的问题、如何解决,如何避免等,可以大大提高开发效率。 IEAD导入Maven项目 File ->Open 选择上一章创建的Maven项目 my-app查看po…

echarts多y轴优化方案

优化方向&#xff1a;点击图例&#xff0c;对y轴进行屏蔽&#xff0c;自动计算y轴位置 效果如下&#xff1a; 对应实现思路&#xff1a;通过监听图例点击事件&#xff0c;渲染y轴显示隐藏和y轴对应位置。 <script setup lang"ts"> import { onMounted, ref,…

简述JVM

文章目录 JVM简介JVM运行时数据区堆(线程共享)方法区/元空间/元数据区(线程共享)栈程序计数器 JVM类加载类加载过程双亲委派模型 垃圾回收机制(GC)判断对象是否为垃圾判断是否被引用指向 如何清理垃圾, 释放对象? JVM简介 JVM 是 Java Virtual Machine 的简称, 意为Java虚拟机…

代码随想录打卡第五十二天|123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 题目&#xff1a; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成两笔交易。注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须在再次购买前出售掉之…

iPhone无法连接电脑?怎么回事?解决方法来了!

苹果用户将手机和电脑连接后&#xff0c;可以轻松实现两者之间的数据传输。但是&#xff0c;在连接设备的过程中可能会出现没有任何反应的情况。这是怎么回事&#xff1f;本文将为大家介绍解决iPhone无法连接电脑的常见方法。如果您的iphone无法连接电脑&#xff0c;请尝试以下…

导入Embassy库进行爬虫

Embassy是一个基于Lua的轻量级爬虫框架&#xff0c;可以方便地进行网页抓取和数据提取。它提供了简单易用的接口和丰富的功能&#xff0c;可以帮助开发者快速构建爬虫应用。 要使用Embassy进行爬虫&#xff0c;首先需要安装Embassy库。可以通过Lua的包管理工具luarocks来安装E…

如何用MFI确定波浪理论第一浪,anzo capital实操演示

通过上文投资者学会了如何确定波浪理论第一浪&#xff0c;但在后台有投资者咨询 &#xff1a;如何用MFI确定波浪理论第一浪&#xff0c;anzo capital昂首资本秉承着有求必应的态度&#xff0c;今天实操进行演示。 在图中&#xff0c;发散用蓝色标注&#xff0c;收敛用绿色。价…

深入理解Linux网络笔记(四):内核是如何发送网络包的

本文为《深入理解Linux网络》学习笔记&#xff0c;使用的Linux源码版本是3.10&#xff0c;网卡驱动默认采用的都是Intel的igb网卡驱动 Linux源码在线阅读&#xff1a;https://elixir.bootlin.com/linux/v3.10/source 3、内核是如何发送网络包的 1&#xff09;、网络包发送过程…

聚观早报 |2024款飞凡R7官宣;小米14新配色材质

【聚观365】10月27日消息 2024款飞凡R7官宣 小米14新配色材质 金山办公2023第三季度业绩 IBM2023第三季度业绩 新东方2024财年第一季度业绩 2024款飞凡R7官宣 飞凡汽车官宣&#xff0c;2024款飞凡R7将于11月上市&#xff0c;新车将搭载飞凡巴赫座舱&#xff0c;同时超过1…

LabVIEW应用开发——基本函数(一)

前面我们介绍了一些控件的介绍和属性的配置&#xff0c;想要完成一个软件只会拖控件肯定是不行的&#xff0c;没办法实现既有的功能。比如我们要实现从串口中读到数据&#xff0c;根据一定的协议解析&#xff0c;然后转换成各个参数的值的显示&#xff0c;包括时间、电压、电流…

Simulink中如何使用数组以及创建数组、对数组索引、赋值

一、总体概述 1、数组的创建&#xff1a;Mux/constant 2、数组的切片&#xff1a;Demux 3、数组的索引&#xff1a;Selector 4、数组的赋值&#xff1a;Assignment 5、数组的运算&#xff1a;数组可只直接使用运算模块、点乘、矩阵运算 二、详细步骤 1、数组的创建 &am…

【Docker】Linux网络命名空间

命名空间 Namespace是Linux提供的一种对于系统全局资源的隔离机制&#xff1b;从进程的视角来看&#xff0c;同一个namespace中的进程看到的是该namespace自己独立的一份全局资源&#xff0c;这些资源的变化只在本namespace中可见&#xff0c;对其他namespace没有影响。容器就…

stm32的ADC采样率如何通过Time定时器进行控制

ADC采样率是个跟重要的概念. 手册上说可以通过Timer定时器进行触发ADC采样. 可我这边悲剧的是, 无论怎么样. ADC都会进行采样. 而且就算是TIM停掉也是一样会进行采样. 这就让我摸不着头脑了… 我想通过定时器动态更改ADC的采样频率. 结果不随我愿… 这到底是什么问题呢? 一…

STM32 pack STM32F系列开发包下载/stm32 Cube Keil V5 开发pack突然丢失

文章目录 1.做STM32开发时,经常发现下载的DEMO代码无法打开,ST自带的更新库软件根本连不上服务器,每次到此都非常恼火。即使进入到官方下载,但每次下载时间超级长都是几小时级别的,如果上面的链接满足不了,那就花几个积分,去下边的链接下载吧。1.各种安装包下载链接下载…

Q41F-40C手动球阀型号解析

Q41F-40C型号字母含义解析 Q41F-40C是德特森阀门常用的手动球阀型号字母分别代表的意思是: Q——代表阀门类型《球阀》 4——代表连接方式《法兰》 1——代表结构形式《浮动式》 F——代表阀座材料《聚四氟乙烯》 -《分隔键》 40——代表公称压力《4.0MPA》 C——代表阀…

红队专题-Web渗透之资产情报信息收集能力(社工)总结

信息收集 思路框架知识整理 招募六边形战士队员主动信息收集-直接访问[工具]打点收集内容服务器系统版本、域名域名信息收集工具 dnsenumtheHarvesterLayer子域名收集 DiscoverSubdomain子域名信息搜集工具 wydomain目标域名、DNS收集 subDomainsBrute 端口同服旁站/服务/bann…

分享!10个使用Angular CLI的实战应用技巧

如果您正在使用Angular&#xff0c;就知道Angular CLI有多有用。它简化了创建和管理Angular项目的过程&#xff0c;凭借其直观的命令行界面&#xff0c;它可以轻松处理复杂的任务&#xff0c;如生成组件、服务、管道、指令等。 但是您知道如何有效地使用Angular CLI吗&#xf…

git stash的使用方法

git stash的使用方法 应用场景 当我们在开发一个新功能的时候&#xff0c;或者开发到一半&#xff0c;然后就收到了线上master 出现了bug&#xff0c;当分支开发已经进行了或者进行到一半了&#xff0c;这时怎么办呢&#xff1f; 这时解决方案有两种&#xff1a;一种是先先将当…