精华内容
下载资源
问答
  • 基于c51单片机简单的计算器程序,简易计算器设计两位数加减运算 可实现三位数的加减乘除混合运算!将运算结果显示在数码管上!
  • 基于C51单片机计时器

    2019-05-02 17:07:06
    有电子秒表功能,LED键盘自检等程序;1)上电启动后,时钟计时,显示器显示00:00,并开始计时,每过1秒加1,直至59:59,再加1回到00:00,循环一次是60分钟,计时结束后蜂鸣器响一声报警提示。 2)按下K1键后,选择...
  • 本文介绍了一种基于51单片机的MP3播放器设计方案。采用AT89C51SND1C芯片,它是ATMEL公司专门针对MP3设计需求出品的一款微处理器。文章详细论述了播放器的软件和硬件结构设计,此播放器具有一定的实用价值。
  • 设计16*16 LED点阵屏来模仿电梯运行的楼层显示装置,利用单片机I/O口接8只开关,代表1-8层楼层按键,若某一楼层的按键按下,点阵屏显示从当前位置向上或向下平滑滚动显示到指定楼层的位置,到达指定位置后由蜂鸣器...
  • 基于STC89C52单片机开发的小系统电子钟的设计代码及 硬件电路,包含了代码的源程序(C语言编写),C源程序和.hex文件,内含硬件电路的设计图以及成品图。源代码有详细的注释,适合此方面有兴趣的小伙伴学习。
  • 从实际出发,设计一种家庭用、与电话线连接、操作简单、工作稳定可靠的远程智能防盗报警装置。当人们外出时,往往希望实施自动监测报警以使家庭财产免受损失。针对这一需求,研制出了一系列自动报警系统,如门磁式、...
  • 本课题就是以AT89C51单片机为核心控制元件设计的一个简易的电子琴,这只是单片机应用的一个点,由点及面,希望能更好的了解和应用单片机技术。选用这个课题的目的在于通过日常生活中的细微之处着手,将所学的理论...
  • 以51为内核的单片机均可,数字钟,能显示年、月、日、时、分、秒;能设置显示年、月、日、时、分、秒;具有闹钟功能,可以设置闹钟时间。
  • 基于C51单片机的多功能电子钟系统设计与仿真.pdf
  • 1、 分别显示时钟/定时时间,格式“时时:分分:秒秒”; 2、 两屏显示区分:均分两行显示,第一行分别为“时钟”,“计时”; 3、 计时结束报警,由蜂鸣器实现; 4、 时钟/闹钟时间设置功能键如下: ...
  • 基于C51单片机考勤机设计.pdf
  • 基于C51单片机的智能灭火机器人的设计与研究rar,基于C51单片机的智能灭火机器人的设计与研究
  • 笔者曾在多个通信测试仪器项目中,成功地应用ARM处理器、C51单片机等为主控芯片的嵌入式系统,实现了对仪器相关模块的实时控制功能。因此提出一种在某通信测试仪器中使用C51单片机来实现实时控制的设计方案。  1 ...
  • 基于C51单片机的矿井瓦斯智能头盔的电路设计.pdf
  • 编写一个能发相应频率声音的子程序。这个子程序中往往须包括以下二个部分一 控制脉冲形成的代码电平取反过程中含有相应的延时二控制脉冲持续时间的代码持 续的时间时候常常和音乐的拍子有相关性。...
  • 逻辑图、 源程序 、 硬件原理图、参考文献、设计原理、心得体会都有,完整篇!
  • 基于C51单片机的红绿灯十字路口模拟
  • 本设计采用AT89C51单片机为控制芯片,硬件上用dsb18202做温度采集(有需要也可以采用dht11温湿度模块)直流电机作为降温风扇,用户可通过按键来控制转速的大小,用继电器来控制电阻丝提高温度。用lcd1602显示屏来...

       本设计采用AT89C51单片机为控制芯片,硬件上用dsb18202做温度采集(有需要也可以采用dht11温湿度模块)直流电机作为降温风扇,用户可通过按键来控制转速的大小,用继电器来控制电阻丝提高温度。用lcd1602显示屏来显示环境温度并且通过按键来设置模式与最高温和最低温。

    实验现象:
        
    首先它能显示环境的温度并能设置上下限阀值,这是最基本的功能,系统上电的时候显示的是当前环境温度和设定的温度阀值,我们可以通过按键来修改温度上下限阀值。我们看,按下这个K1键会进入温度阀值设置 界面,每按一下,切换一次阀值设置(上下阀值)界面,按第3次时,会自动回到主界面,如此循环。
        在进入温度阀值设计界面时,可以通过K2、K3键对阀值进行加减,这里我们只对温度整数部分进行设置,小数部分我们就不需要了,将设置好的上下限阀值保存到AT24C02(EEPROM)内,当下一次开启系统时只需从AT24C02内读取保存的阀值数据,而不需要重复设置上下限阀值。这样的话,我们用3个按键就实现了温度上下限阀值的设定,这是温度检测控制系统基本的功能。假如我们把温度上限设置为32°C,下限设置为30°C。
        另外还有恒定温度的功能。当设定好上下限阀值时,系统即会把当前的温度与设定的上下限阀值对比,如果高于上限温度,开启散热进行降温,同时报警;如果低于下限温度,开启加热,同时报警;如果当前温度处于下限和上限温度之间时,关闭散热、加热及报警。从而可将温度控制在阀值的范围内。

    仿真图展示:

    温度高于设定值,风扇反转,警报开启

                                                   温度低于设定值,加温开启并发出警报

    部分功能视频展示:

    视频地址:基于c51单片机的毕业设计——智能温度控制_哔哩哔哩_bilibili

    https://www.bilibili.com/video/BV1yU4y177pp/

    核心代码展示:

    ds18b20的测温原理

    DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。 DS18B20测温原理如图3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号发送给计数器1。高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。

     

     

    lcd1602工作原理

    点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成。显示屏上64×16个显示单元与显示RAM区的1024字节相对应,每一字节的内容与显示屏上相应位置的亮暗对应。例如显示屏第一行的亮暗由RAM区的000H~00FH的16字节的内容决定,当(000H)=FFH时,屏幕左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,屏幕右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H时,在屏幕的顶部显示一条由8条亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。

     

     

     

     ds18b20初始化

    #include "temp.h"
    
    void Delay1ms(unsigned int y)
    {
    	unsigned int x;
    	for(y;y>0;y--)
    		for(x=110;x>0;x--);
    }
    
    
    unsigned char Ds18b20Init()//初始化
    {
    	unsigned int i;
    	DSPORT=0;			 //将总线拉低480us~960us
    	i=70;	
    	while(i--);//延时642us
    	DSPORT=1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
    	i=0;
    	while(DSPORT)	//等待DS18B20拉低总线
    	{
    		i++;
    		if(i>5000)//等待>5MS
    			return 0;//初始化失败	
    	}
    	return 1;//初始化成功
    }
    
    
    void Ds18b20WriteByte(unsigned char dat)//写入一字节
    {
    	unsigned int i,j;
    	for(j=0;j<8;j++)
    	{
    		DSPORT=0;			//每写入一位数据之前先把总线拉低1us
    		i++;
    		DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
    		i=6;
    		while(i--); //延时68us,持续时间最少60us
    		DSPORT=1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
    		dat>>=1;
    	}
    }
    
    
    unsigned char Ds18b20ReadByte()//读取字节
    {
    	unsigned char byte,bi;
    	unsigned int i,j;	
    	for(j=8;j>0;j--)
    	{
    		DSPORT=0;//先将总线拉低1us
    		i++;
    		DSPORT=1;//然后释放总线
    		i++;
    		i++;//延时6us等待数据稳定
    		bi=DSPORT;	 //读取数据,从最低位开始读取
    		/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
    		byte=(byte>>1)|(bi<<7);						  
    		i=4;		//读取完之后等待48us再接着读取下一个数
    		while(i--);
    	}				
    	return byte;
    }
    
    void  Ds18b20ChangTemp()
    {
    	Ds18b20Init();
    	Delay1ms(1);
    	Ds18b20WriteByte(0xcc);		//跳过ROM操作命令		 
    	Ds18b20WriteByte(0x44);	    //温度转换命令
    //	Delay1ms(100);	//等待转换成功,而如果你是一直刷着的话,就不用这个延时了
       
    }
    
    void  Ds18b20ReadTempCom()
    {	
    
    	Ds18b20Init();
    	Delay1ms(1);
    	Ds18b20WriteByte(0xcc);	 //跳过ROM操作命令
    	Ds18b20WriteByte(0xbe);	 //发送读取温度命令
    }
    
    
    short Ds18b20ReadTemp()
    {
    	unsigned char temp=0;
    	unsigned char tmh,tml;
    	short tem;
    
    	Ds18b20ChangTemp();			 	//先写入转换命令
    	Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令
    	tml=Ds18b20ReadByte();		//读取温度值共16位,先读低字节
    	tmh=Ds18b20ReadByte();		//再读高字节
    
    	if(tmh>7)
        {
            tmh=~tmh;
            tml=~tml; 
            temp=0;//温度为负  
        }
    	else
    	{
    		temp=1;//温度为正	
    	} 
    		  	  
        tem=tmh; //获得高八位
        tem<<=8;    
        tem|=tml;//获得底八位
        tem=(double)tem*0.625;//转换   放大10倍  精度0.1 
    	if(temp)
    		return tem; //返回温度值
    	else 
    		return -tem; 
    }
    

    lcd1602初始化

    #include "lcd.h"
    
    
    void Lcd1602_Delay1ms(uint c)   //误差 0us
    {
        uchar a,b;
    	for (; c>0; c--)
    	{
    		 for (b=199;b>0;b--)
    		 {
    		  	for(a=1;a>0;a--);
    		 }      
    	}
        	
    }
    
    #ifndef 	LCD1602_4PINS	 //当没有定义这个LCD1602_4PINS时
    void LCD_WriteCmd(uchar com)	  //写入命令
    {
    	LCD1602_E = 0;     //使能
    	LCD1602_RS = 0;	   //选择发送命令
    	LCD1602_RW = 0;	   //选择写入
    	
    	LCD1602_DATAPINS = com;     //放入命令
    	Lcd1602_Delay1ms(1);		//等待数据稳定
    
    	LCD1602_E = 1;	          //写入时序
    	Lcd1602_Delay1ms(5);	  //保持时间
    	LCD1602_E = 0;
    }
    #else 
    void LCD_WriteCmd(uchar com)	  //写入命令
    {
    	LCD1602_E = 0;	 //使能清零
    	LCD1602_RS = 0;	 //选择写入命令
    	LCD1602_RW = 0;	 //选择写入
    
    	LCD1602_DATAPINS = com;	//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
    	Lcd1602_Delay1ms(1);
    
    	LCD1602_E = 1;	 //写入时序
    	Lcd1602_Delay1ms(5);
    	LCD1602_E = 0;
    
    //	Lcd1602_Delay1ms(1);
    	LCD1602_DATAPINS = com << 4; //发送低四位
    	Lcd1602_Delay1ms(1);
    
    	LCD1602_E = 1;	 //写入时序
    	Lcd1602_Delay1ms(5);
    	LCD1602_E = 0;
    }
    #endif
    
    #ifndef 	LCD1602_4PINS		   
    void LCD_WriteData(uchar dat)			//写入数据
    {
    	LCD1602_E = 0;	//使能清零
    	LCD1602_RS = 1;	//选择输入数据
    	LCD1602_RW = 0;	//选择写入
    
    	LCD1602_DATAPINS = dat; //写入数据
    	Lcd1602_Delay1ms(1);
    
    	LCD1602_E = 1;   //写入时序
    	Lcd1602_Delay1ms(5);   //保持时间
    	LCD1602_E = 0;
    }
    #else
    void LCD_WriteData(uchar dat)			//写入数据
    {
    	LCD1602_E = 0;	  //使能清零
    	LCD1602_RS = 1;	  //选择写入数据
    	LCD1602_RW = 0;	  //选择写入
    
    	LCD1602_DATAPINS = dat;	//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
    	Lcd1602_Delay1ms(1);
    
    	LCD1602_E = 1;	  //写入时序
    	Lcd1602_Delay1ms(5);
    	LCD1602_E = 0;
    
    	LCD1602_DATAPINS = dat << 4; //写入低四位
    	Lcd1602_Delay1ms(1);
    
    	LCD1602_E = 1;	  //写入时序
    	Lcd1602_Delay1ms(5);
    	LCD1602_E = 0;
    }
    #endif
    
    #ifndef		LCD1602_4PINS
    void LcdInit()						  //LCD初始化子程序
    {
     	LCD_WriteCmd(0x38);  //开显示
    	LCD_WriteCmd(0x0c);  //开显示不显示光标
    	LCD_WriteCmd(0x06);  //写一个指针加1
    	LCD_WriteCmd(0x01);  //清屏
    	LCD_WriteCmd(0x80);  //设置数据指针起点
    }
    #else
    void LCD_Init()						  //LCD初始化子程序
    {
    	LCD_WriteCmd(0x32);	 //将8位总线转为4位总线
    	LCD_WriteCmd(0x28);	 //在四位线下的初始化
    	LCD_WriteCmd(0x0c);  //开显示不显示光标
    	LCD_WriteCmd(0x06);  //写一个指针加1
    	LCD_WriteCmd(0x01);  //清屏
    	LCD_WriteCmd(0x80);  //设置数据指针起点
    }
    #endif
    
    
    
    void LCD_Clear()
    {
    	LCD_WriteCmd(0x01);
    	LCD_WriteCmd(0x80);	
    }
    
    //在任何位置显示字符串
    
    void LCD_Dispstring(u8 x,u8 line,u8 *p)	  
    {
    	char i=0;
    	if(line<1)	   //第一行显示
    	{	
    		while(*p!='\0')
    		{
    			if(i<16-x)
    			{
    				LCD_WriteCmd(0x80+i+x);	
    			}
    			else
    			{
    				LCD_WriteCmd(0x40+0x80+i+x-16);	
    			}
    			LCD_WriteData(*p);
    			p++;
    			i++;	
    		}	
    	}
    	else		   //第2行显示
    	{
    		while(*p!='\0')
    		{
    			if(i<16-x)
    			{
    				LCD_WriteCmd(0x80+0x40+i+x);	
    			}
    			else
    			{
    				LCD_WriteCmd(0x80+i+x-16);	
    			}
    			LCD_WriteData(*p);
    			p++;
    			i++;	
    		}	
    	}		
    }
    
    
    

    lcd屏显示ds18b20检测温度

    ​
    
    void Temp_DataPros()
    {
    	short temp;
    	u8 temp_buf[5];
    	temp=Ds18b20ReadTemp();
    	temp_val=temp;	
    	if(temp<0)
    	{
    		temp=-temp;
    		LCD_Dispstring(2+5,0,"-");
    	}
    	else
    	{
    		LCD_Dispstring(2+5,0," ");
    	}
    
    	temp_buf[0]=temp/100+0x30;
    	temp_buf[1]=temp%100/10+0x30;
    	temp_buf[2]='.';
    	temp_buf[3]=temp%100%10+0x30;
    	temp_buf[4]='\0';
    	LCD_Dispstring(2+6,0,temp_buf);		 //显示检测的温度xx.x
    
    	temp_buf[0]=set_temph/10+0x30;
       	temp_buf[1]=set_temph%10+0x30;
    	temp_buf[2]='\0';
    	LCD_Dispstring(5,1,temp_buf);	  //显示设定的温度上限值xx
    
    	temp_buf[0]=set_templ/10+0x30;
       	temp_buf[1]=set_templ%10+0x30;
    	temp_buf[2]='\0';
    	LCD_Dispstring(14,1,temp_buf);	 //显示设定的温度下限值xx
    }
    
    ​

    按键模式选择并调节

    u8 KEY_Scan(u8 mode)
    {
    	static u8 key=1;
    	if(key&&(k1==0||k2==0||k3==0))
    	{
    		delay(1000);   //消抖
    		key=0;
    		if(k3==0)
    		{
    			return K1_MODE;
    		}
    		else if(k1==0)
    		{
    			return K2_ADD;
    		}
    		else if(k2==0)
    		{
    			return K3_DEC;	
    		}
    	}
    	else if(k1==1&&k2==1&&k3==1)
    	{
    		key=1;	
    	}
    	if(mode)
    	{
    		key=1;
    	}
    	return 0;	
    }
    
    void KEY_Pros()
    {
    	u8 key;
    	u8 temph_buf[3];
    
    	key=KEY_Scan(0);
    	
    	if(key==K1_MODE)   //模式选择
    	{
    		mode++;
    		LCD_Clear();
    
    		if(mode==1)
    		{
    			LCD_Dispstring(0,1,"SETH:   C");
          LCD_Dispstring(2,0,"N-TEM:   C");			
    		}
    		else if(mode==2)
    		{
    			LCD_Dispstring(0,1,"SETL:   C");
         LCD_Dispstring(2,0,"N-TEM:   C");			
    		}
    		else 
    		{
    			mode=0;
    			LCD_Dispstring(2,0,"Temp:     C");
    			LCD_Dispstring(0,1,"SETH:  ");
    			LCD_Dispstring(9,1,"SETL:  ");	
    		}
    	}
    	if(mode==1)	 //温度上限设置
    	{
    		switch(key)	
    		{
    			case K2_ADD: 	   //加
    						set_temph++;
    						if(set_temph>=80)set_temph=80;
    						break;
    			case K3_DEC: 	 //减
    						set_temph--;
    						if(set_temph<=0)set_temph=0;
    						break;
    		}
    
    		temph_buf[0]=set_temph/10+0x30;
    		temph_buf[1]=set_temph%10+0x30;
    		temph_buf[2]='\0';
    	   	LCD_Dispstring(9,0,temph_buf);
    		At24c02Write(0,set_temph);
    	}
    
    	else if(mode==2)  //温度下限设置
    	{
    		switch(key)	
    		{
    			case K2_ADD: 	   //加
    						set_templ++;
    						if(set_templ>=80)set_templ=80;
    						break;
    			case K3_DEC: 	 //减
    						set_templ--;
    						if(set_templ<=0)set_templ=0;
    						break;
    		}
    
    		temph_buf[0]=set_templ/10+0x30;
    		temph_buf[1]=set_templ%10+0x30;
    		temph_buf[2]='\0';
    	   	LCD_Dispstring(5,1,temph_buf);
    		At24c02Write(2,set_templ);
    	}
    	
    

    核心代码及仿真图展示完毕,获取完整源码下载地址:https://download.csdn.net/download/weixin_51322363/21106377

    展开全文
  • 本文内容叙述了由AT89C51SNDlC构成的最小系统的结构,具备了便携式MP3播放器的基本功能。其实AT89C51SNDlC还支持LCD显示和IDE接口,还可以通过对以上接口模块进行扩展,构成更大更复杂的系统。
  • 基于C51单片机的数据采集系统
  • 基于C51单片机的简单控制灯光的程序,该程序可以通过烧录程序,将其刻录到单片机中,并使单片机能够有一个灯的定时开关
  • 基于C51单片机的篮球计分器设计题目要求:1. 设计一款能够显示篮球比分的记分牌;2. 通过加分按钮可以给A 队,或B 队加分;3. 设计对调功能,更换场地后,AB 队分数互换;仿真截图:完整源代码:#includecode ...

    基于C51单片机的篮球计分器设计

    题目要求:

    1. 设计一款能够显示篮球比分的记分牌;

    2. 通过加分按钮可以给A 队,或B 队加分;

    3. 设计对调功能,更换场地后,AB 队分数互换;

    仿真截图:

    完整源代码:

    #include

    code unsigned seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 分别对应数码管显示字形0-9

    int m=15,n=00,x=0,y=0,jie=2,bujin=1,zanting=0,chuzanting=0;

    //初始化,m 、n 为分、秒计时 x、y 为A 、B 两队分数 ,其余为中间变量

    sbit A_add = P3^0; // A 队加分按钮

    sbit B_add = P3^1; // B 队加分按钮

    sbit Time_add = P3^2; // 时间加按钮

    sbit Time_sub = P3^3; // 时间减按钮

    sbit A_sub = P3^4; // A 队减分按钮

    sbit B_sub = P3^5; // B 队减分按钮

    sbit pause = P3^6; // 暂停、启动按钮

    sbit change = P3^7; // 换场地按钮

    void keyScan(); //按键扫描函数

    void delay(int t) //延时子程序,通过参数t ,可以调整暂停时间

    {

    while(t--)

    {

    unsigned int i;

    for(i=0;i

    }

    }

    void display(int m,int n,int x,int y)//数码管动态刷新显示程序

    {

    if(jie==1&&bujin!=2) //中间变量jie=1时,为上半场,对p1赋值 P1=0xbf; //p1=0xbf,即p1=1011111B,点亮上半场对应指示灯 P2=0xfe; //数码管动态刷新显示程序p2=11111110,i 为分钟 P0=seg[m/10]; //刷新显示时间显示分钟十位,调用延时程序 delay(1); //延时数码管的点亮 P2=0xff; P0=0; P2=0xfd; P0=seg[m%10]; delay(1); P2=0xff; P0=0; //同理, 分钟个位并延时点亮 P2=0xfb; //秒钟十位 P0=seg[n/10]; delay(1); P0=0; P2=0xff; P2=0xf7; //秒钟个位 P0=seg[n%10]; delay(1); P0=0; P2=0xff;

    }

    P2=0xef; P0=seg[x/10]; delay(1); P2=0xff; P0=0; // A 队分数十位 P2=0xdf; //A队分数个位 P0=seg[x%10]; delay(10); P2=0xff; P0=0; P2=0xbf; P0=seg[y/10]; delay(1); P0=0; P2=0xff; P2=0x7f; P0=seg[y%10]; delay(1); P0=0; P2=0xff; //B队分数十位 //B队分数个位

    void t0(void) interrupt 1 //调用定时器T0 基本计时单位秒 中断

    {

    int i;

    TH0=0xb1; //利用定时器T0, 送入计数初值TH0,TL0

    TL0=0x10; //定时器定时单位为20ms

    i++;

    } if(i==50) //利用中间变量i ,令i 的值为50 50*20ms=1秒 { if(n==0) //分钟与秒时间的调整 当秒减到0后分钟减1 { n=60; if(m > 0) m--; } n--; //实现1秒计时 i=0; }

    void main() //主程序

    {

    TMOD=0x01; //设置定时器工作方式

    EA=1;

    ET0=1;

    }

    TH0=0xb1; TL0=0x10; TR0=1; P3=0xff; P1=0x7f; while(1) { } //定时计送计数初值,EA=1,开中断p3口电平拉高 //p1-0x7f,上半场指示灯点亮 //通过while (1),反复调用循环体内子程序 display(m,n,x,y); //调用动态刷新显示程序 keyScan(); //按键处理函数 if(m

    void keyScan() //按键扫描函数

    {

    int temp; //中间变量temp ,检测到有按键按下时交换A,B 两队分数

    if(A_add==0) //当检测到A 队加分按键按下,对应加分

    {

    delay(1); //调用延时子程序,实现按键抖动功能,即当检测到按键按下时,延时,按键仍按下,说明非抖动,A 队对应加分

    if(A_add==0)

    {

    x++;

    }

    }

    if(B_add==0) //B队加分键被按下

    {

    delay(1);

    { y++; } } if(A_sub==0) { delay(1); if(A_sub==0) { if(x>=1) x--; } } if(B_sub==0) { delay(1); if(B_sub==0) { if(y>=1)y--; } } //A队减分 //B队减分 if(Time_add==0) //时间增加按钮 { delay(10); if(Time_add==0) { n++; if(n==60) { m++; n=1; } } } if(Time_sub==0) //时间减少 { delay(10); if(Time_sub==0) { if(!(m == 0 && n == 0)) //防止被减成了负数

    } } } } if(n

    Proteus 仿真图:

    展开全文
  • 电子密码锁课程设计,本系统由AT89S51单片机系统(主要是AT89S51单片机最小系统)、4×4矩阵键盘、LCD1602显示和报警系统等组成,具有设置、修改六位用户密码、超次报警、超次锁定、密码错误报警等功能(本设计由P0...
  • 基于C51单片机的搬运机器人控制系统设计.pdf
  • C51单片机作为主要控制器,利用液晶显示器作为显示部分,使用3X8矩阵开关分别模拟医院病房与病床位数。病人按下按键时,C51立即获取病人的病房号和病床号,同时采集此时的时间并一起显示在液晶显示器上,当护士...
  • 基于C51单片机的智能分拣水果小车设计.pdf
  • 上电后设置定时时间,按键1选择设置的是小时分钟还是秒钟 按键2对其进行具体的数字设置 一次选择完成之后就默认进入计时模式 达到计时时间后响铃 按键3可以关闭响铃
  • 实现功能: 用户可以通过指纹进行验证,也可以用密码进行验证,密码可以擦除, 管理员可以更改密码,更改密码需要输入原密码进行... 使用模块 4*4矩阵按键 AS608光学指纹传感器 AT24C02存储模块 OLED 显示模块 ...led小灯
  • 基于C51单片机的8×8-LED点阵屏汉字显示一 设计要求  1、设计一个8*8点阵LED电子显示屏  2、要求在目测条件下LED显示屏各点亮度均匀、充足,可静态显示一个字。 二 总体方案设计 2.1系统框图  根据设计要求与设计...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,095
精华内容 2,438
关键字:

基于c51单片机