精华内容
下载资源
问答
  • 单片机C51学习资料 单片机C51例程-码制转换程序的调试
  • 三、程序设计程序用C语言编写,由主程序、外部中断0服务程序、定时器110中断服务程序、延时子程序等模块组成。主程序由初始化、车轮直径判定和键盘处理三部分组成。车轮直径判定的依据是接在P1口低四位的跳线,跳线...

    三、程序设计

    程序用C语言编写,由主程序、外部中断0服务程序、定时器110中断服务程序、延时子程序等模块组成。主程序由初始化、车轮直径判定和键盘处理三部分组成。车轮直径判定的依据是接在P1口低四位的跳线,跳线接地时表示低电平,不接时表示高电平。其取值与车轮直径、周长对应关系见附表。

    7d47e6f2ac9108c0e93258f83128f976.png

    外部中断0服务程序由测量、计算、读数等组成。从P3.2口输入的脉冲信号作为外部中断0的中断请求信号,外部中断采用边沿触发方式。在测量速度时,由于车轮转动脉冲信号的频率很低,不适宜用计数的方法测量,故采用测脉冲周期的方法进行测量,用脉冲信号系统来控制计时信号,通过计时数计算出脉冲周期。车轮的周长除以周期可得到自行车的行驶速度:在测量行驶里程时,通过对脉冲信号个数的计数,用计数值乘以车轮的周长即可获得行驶里程。需要说明的是:测量脉冲信号周期和个数是同时进行的,我们要做的只是用按钮开关切换显示不同的量。为了避免使用浮点数,程序中的运算结果长度是以十米为单位的。数据读出时在第二位数后加小数点就换算成干米了。

    定时器T0中断服务程序由计时、动态扫描显示、自行车停车判断等组成。T0的中断定时时间为10ms.每中断一次计时变量n加1,因此n的单位为10ms。例如,自行车车轮转一周对应的n值为50。则对应的时间为0.5s,假如自行车的车轮直径为26英寸。可得自行车的速度为14.90km/h。如果n值达到500,即5秒钟,仍没有发生外部中断,即表示自行车没有前进,则n也被清零,速度显示为0。

    读数采用四位显示,定时器T0每中断一次显示一位数,因此四次中断就可以刷新一次数据。即40ms刷新一次数据。

    四、安装与调试

    安装前用编程器或下载线将HEX文件写入AT89S51。DS1~DS4使用共阳数码管,SPK用工作电压为6V的有源蜂鸣器。电源使用4节5号充电电池。

    使用前,根据车轮直径参照附表进行跳线,也可以不用跳线直接在电路板上用连线焊接。附图中对应的是26英寸的跳线设置。

    传感器的安装与调试是一个关键,把传感器安装在前轮的位置,把一小块永久磁铁固定在车轮辐条上UGN3020作防潮密封后固定在前叉上。使得车轮转动时磁铁从它的前面经过,应使两者相遇时间隔尽量小。安装时,要使磁铁的S极面向UGN3020的正面,判定磁铁极性方法是把磁铁的两个极分别靠近UGN3020的正面,当其③脚电平由高变低时即为正确的安装位置。传感器安装完成后,转动车轮,UGN3020③脚应有脉冲信号输出,否则说明两者的间隔偏大。应缩小距离,直至有脉冲信号输出为止。间隔一般为5mm左右。如果小于5mm仍无脉冲信号输出。说明磁铁的磁场强度偏小,应更换。

    调试结束后,把里程速度表安装在车把手上。打开电源开关S3,骑动自行车,这时数码管显示的是速度,按S1可调到需要的显示模式。

    展开全文
  • 51单片机使用汇编语言,6个七段显示,简易制作电子手表
  • 制作10S时钟 任务单 原理图绘制 程序编写及讲解 总结 制作10S时钟 任务单 任务描述 通过本任务的学习学会利用单片机控制数码管制作10S时钟 任务要求 1用P1口和P2口控制8位数管制作10S时钟 实现方法 利用Proteus...
  • 用51单片机制作的出租车计价器 6位数管显示,路程 总价 单价 单价可调 延时计价
  • 基于单片机的音乐播放器,含有proteus原理图,含有c 汇编程序, 机器
  • 两点间温度控制,电子密码锁设计,一键多功能按键识别技术,报警产生器,8X8 LED点阵显示技术,数字电压表,四位数数字温度计,4×4键盘及8位数管显示构成的电子密码锁邓十多个单片机入门制作的电路图,...
  • 摘要:本文介绍了一种用MCS-51系列单片机AT89C52代替专用遥控芯片的设计方案,通过软件模拟实现了电视机遥控编码的发射,并且达到“一器多用”。 关键词:全码;简码;引导;系统;数据  引言  上世纪八...
  • 自己在做51单片机时的心得体会,拿出来供大家参考 (混字数)
  • 基于单片机制作的密码锁程序,用户可以自己更改密码。
  • 51单片机项目发短信

    千次阅读 2015-09-30 21:45:19
    //声明发送字符(ASCII)函数 void Delay_ms(unsigned int time); //声明延时函数 void CLR_Buf(void);  //声明清除缓存内容 void Send_Hex(unsigned char b); //声明发送字符(十六进制)函数 bit ...
    #include<reg51.h>
    
    #include<string.h>


    #define Buf_Max 100 //缓存长度100
    #define Delay_Time 2000  //延时长度


    sbit LED1 = P0^0; //状态指示灯1
    sbit LED2 = P0^1; //状态指示灯2
    sbit LED3 = P0^2; //状态指示灯3
    sbit LED4 = P0^3; //状态指示灯4


    sbit IGT = P2^4;  //点火信号


    unsigned char i = 0;               //定义缓存指针
    unsigned char  Rec_Buf[Buf_Max];    //定义缓存数组


    void Serial_Init(void);            //声明串口初始化函数
    void Send_ASCII(unsigned char *b); //声明发送字符(ASCII码)函数
    void Delay_ms(unsigned int time);  //声明延时函数
    void CLR_Buf(void);   //声明清除缓存内容
    void Send_Hex(unsigned char b);    //声明发送字符(十六进制)函数
    bit  Hand(unsigned char *a);       //声明判断缓存中是否含有指定的字符串函数
    void  init_Faduanxin();
    /**********************************主函数******************************/
    void main(void)
    {
               init_Faduanxin();
    while(1)

    LED2 = 0;
        if(strstr(Rec_Buf,"+CMTI")!=NULL)    //若缓存字符串中含有"+CMTI"就表示有新的短信
            {
       
    CLR_Buf();                   //清除缓存内容
    Delay_ms(Delay_Time);        //延时
    Send_ASCII("AT+CMGR=1");     //发送读取信息指令
        Send_Hex(0x0d);              //发送回车符
      Send_Hex(0x0a);              //发送换行符
    Delay_ms(Delay_Time);        //延时
                // while(!Hand("OK"));          //等待设置成功
    //LED2 = 0;                    //点亮设置成功指示灯

            if(strstr(Rec_Buf,"open")!=NULL)       //如果信息内容是"open1"
                {
     LED1 = 0; 
        Delay_ms(3000); 
    LED1 = 1; 
              }
     else
     {
        LED3 = 0;
     }


    CLR_Buf();                              //清除缓存内容
     
    Delay_ms(Delay_Time);                   //延时
    Send_ASCII("AT+CMGD=1");                //删除读取后的信息
    Send_Hex(0x0d);                         //发送回车符
      Send_Hex(0x0a);                         //发送换行符
    Delay_ms(Delay_Time);                   //延时
    while(!Hand("OK"));                    //等待设置成功
    CLR_Buf();                              //清除缓存内容
    }
                   }
    }




    void  init_Faduanxin()
    {
     IGT=0;
                Delay_ms(1000);        //延时
                IGT=1;

           Serial_Init();         //初始化串口
    CLR_Buf();             //清除缓存内容
           Delay_ms(3000);        //延时
           while(!Hand("OK"))     //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
    {
    Send_ASCII("AT"); //发送联机指令 
                   Send_Hex(0x0d);   //发送回车符    
    Send_Hex(0x0a);   //发送换行符
    Delay_ms(3000);   //延时
    }
    CLR_Buf();                //清除缓存内容
    //LED1 = 0;                 //点亮握手成功指示灯

    Delay_ms(Delay_Time);     //延时
       Send_ASCII("AT+CPMS=\"MT\",\"MT\",\"MT\"");//所有操作都在MT(模块终端)中进行
    Send_Hex(0x0d);           //发送回车符
      Send_Hex(0x0a);           //发送换行符
    Delay_ms(Delay_Time);     //延时

    // while(!Hand("OK"));       //等待设置成功

    CLR_Buf();                //清除缓存内容

    Delay_ms(Delay_Time);     //延时
    Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示 
    Send_Hex(0x0d);           //发送回车符
      Send_Hex(0x0a);           //发送换行符
    Delay_ms(Delay_Time);     //延时
    // while(!Hand("OK"));       //等待设置成功
    CLR_Buf();                //清除缓存内容
    //LED3 = 0;                 //点亮设置成功指示灯


    Delay_ms(Delay_Time);     //延时
    Send_ASCII("AT+CMGF=1");  //文本(TEXT)模式 
    Send_Hex(0x0d);           //发送回车符
    Send_Hex(0x0a);           //发送换行符
    Delay_ms(Delay_Time);     //延时
    // while(!Hand("OK"));      //等待设置成功
    CLR_Buf();                //清除缓存内容
    //LED4 = 0;                 //点亮设置成功指示灯


    Delay_ms(Delay_Time);     //延时
    Send_ASCII("AT+CMGD=1");  //删除第一条信息
    Send_Hex(0x0d);           //发送回车符
      Send_Hex(0x0a);           //发送换行符
    Delay_ms(Delay_Time);     //延时
    // while(!Hand("OK"));      //等待设置成功
    CLR_Buf();                //清除缓存内容
    // LED1 = 0;                 //点亮设置成功指示灯
    }
    /***************************串口初始化函数*****************************/
    /*函数原型:void Serial_Init(void)
    /*函数功能:串口初始化
    /*输入参数:无
    /*输出参数:无
    /**********************************************************************/
    void Serial_Init(void)//串口初始化函数
    {
     SCON = 0x50;//串口:方式1,允许发送和接收
     TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率    
     TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600
     TL1 = 0xFD;   
     TR1 = 1;    //开启定时器1   
     ES = 1;     //开启串口中断
     EA = 1;     //开启全局中断
    }


    /****************************串口中断处理函数**************************/
    /*函数原型:void Serial_Int(void)
    /*函数功能:串口中断处理
    /*输入参数:无
    /*输出参数:无
    /**********************************************************************/
    void Serial_Int() interrupt 4 
    {
    ES = 0; //关串口中断,防止中断嵌套
    if(TI) //如果是发送中断,则不做任何处理
    {
    TI = 0;  //清除发送中断标志位
    }
    if(RI) //如果是接送中断,则进行处理
    {
    RI = 0; //清除接收中断标志位
    Rec_Buf[i] = SBUF; //将接收到的字符串存到缓存中
    i++;               //缓存指针向后移动
    if(i>200)          //如果缓存满,将缓存指针指向缓存的首地址
    {
    i = 0;
    }
    }
    ES = 1; //开启串口中断
    }
    /****************************发送字符(ASCII)函数***********************/
    /*函数原型:void Send_ASCII(unsigned char *b) 
    /*函数功能:发送字符(ASCII码)
    /*输入参数:unsigned char *b
    /*输出参数:无
    /**********************************************************************/
    void Send_ASCII(unsigned char *b)         
    {
        ES = 0;                   //关串口中断
        for (b; *b!='\0';b++)
        {
            SBUF = *b;
            while(TI!=1);     //等待发送完成
    TI = 0;           //清除发送中断标志位
    }   
    ES = 1;                   //开串口中断
    }
    /****************************time ms延时函数***************************/
    /*函数原型:Delay_ms(unsigned int time)
    /*函数功能:延时Time ms
    /*输入参数:time
    /*输出参数:无
    /**********************************************************************/
    void Delay_ms(unsigned int time)
    {
     unsigned char j;
     for(;time>0;time--)
      {
      j = 1500;
      while(j--);
      }
    }


    /**************************清除缓存数据函数****************************/
    /*函数原型:void CLR_Buf(void)
    /*函数功能:清除缓存数据
    /*输入参数:无
    /*输出参数:无
    /*调用模块:无
    /**********************************************************************/
    void CLR_Buf(void)
    {
    unsigned char k;
        for(k=0;k<Buf_Max;k++)    //将缓存内容清零
       {
    Rec_Buf[k] = 0;
    }
        i = 0;                    //接收字符串的起始存储位置
    }


    /*************************发送字符(十六进制)函数********************/
    /*函数原型:void Send_Hex(unsigned char c)
    /*函数功能:发送字符(十六进制)
    /*输入参数:unsigned char c
    /*输出参数:无
    /*调用模块:无
    /******************************************************************/ 
    void Send_Hex(unsigned char c)         
    {
        ES = 0;               //关串口中断
        SBUF = c;
        while(TI!=1);         //等待发送完成
        TI = 0;               //清除发送中断标志位
    ES = 1;               //开串口中断
    }


    /*****************判断缓存中是否含有指定的字符串函数******************/
    /*函数原型:bit Hand(unsigned char *a)
    /*函数功能:判断缓存中是否含有指定的字符串
    /*输入参数:unsigned char *a 指定的字符串
    /*输出参数:bit 1---含有    0---不含有
    /*调用模块:无
    /*******************************************************************/
    bit Hand(unsigned char *a)

        if(strstr(Rec_Buf,a)!=NULL)
       return 1;
    else
    return 0;
    }
    展开全文
  • AT89C51单片机制作简易密码锁

    万次阅读 多人点赞 2019-06-16 18:33:39
    51单片机课程设计—制作密码锁 由于代码注释较多,不再编辑思路 #include<reg51.h> //定义IO口 sbit Beep=P3^6; sbit LED1=P3^7; //定义全局变量 int count=-1; int count1=0;//用于记录输入密码错误...

    51单片机课程设计—制作密码锁

    1.设计要求

    1.1能设定一组4位的数字开启密码(设定密码功能)
    1.2用LED小灯代替锁开启显示,输入密码正确,则小灯亮起(开锁功能)
    1.3如果3次密码错误,则进行鸣叫报警,并在1分钟之内不能再次输入(报警)
    1.4.密码输入显示在数码管上,输入正确显示on,输入错误显示err(显示功能)
    可在以上功能上扩展。

    2.设计流程图

    在这里插入图片描述

    3.重要代码解释

    3.1 本次开发为使用按键中断,只进行了矩阵按键的使用,在第一次按键与第二次按键的过程间,均进行了按键的等待释放,以及等待按键按下的判断,提高程序的正确性
    在这里插入图片描述3.2 合理的设置按键扫描函数,达到按键的准确判断
    在这里插入图片描述3.3 输入密码时严格控制密码设置的位数,代码精简
    在这里插入图片描述

    4.仿真电路设计

    在这里插入图片描述

    5.完整代码设计

    #include<reg51.h>
    //定义IO口
    sbit Beep=P3^6;
    sbit LED1=P3^7;
    //定义全局变量
    int count=-1;
    int count1=0;//用于记录输入密码错误的次数
    int counter;//用于计数是定时器能够定时1分钟
    int counter1=0;
    int temp=99,signal=0;
    //初始化密码
    int key_word[4]={99,99,99,99};
    //用于接收按键接收的值
    int get_word[4]={0,0,0,0};
    char key_buf[]={0xee,0xde,0xbe,0x7e,
    				0xed,0xdd,0xbd,0x7d,
    				0xeb,0xdb,0xbb,0x7b,
                    0xe7,0xd7,0xb7,0x77};//键模
    //LED字模
    char led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
    //函数声明
    void set_key();
    void show1(int);
    void open_key();
    void input_key();
    void show2(int);
    void show3();
    void show4();
    int get_key();
    //延时函数
    void delay(int x)
    {
    	int j=0;
    	for(;x>0;x--)
    		for(j=0;j<125;j++);
    }
    
    //设定密码功能
    void set_key()
    {
    	int i;
    	for(i=0;i<4;i++)
    	{	
    		while(get_key()==-1)//等待按键按下
    		{
    			if(count!=0&&count!=-1)
    			{
    				show1(count);//显示设置的密码
    			}
    		}
    		if(signal==1)//将按键的值保存
    		{
    			key_word[i]=get_key();
    			count++;
    			show1(count);
    			signal=0;
    			temp=99;
    		}
    		while(temp==get_key())//一旦长时间按按键,就一直显示密码
    		{	
    			show1(count);
    		}
    	}
    }
    
    //输入密码
    void input_key()
    {
    	int i;
    	for(i=0;i<4;i++)
    	{	
    		while(get_key()==-1)//等待按键按下
    		{
    			if(count!=0&&count!=-1)
    			{
    				show2(count);//显示设置的密码
    			}
    		}
    		if(signal==1)//将按键的值保存
    		{
    			get_word[i]=get_key();
    			count++;
    			show2(count);
    			signal=0;
    			//temp=99;
    		}
    		while(temp==get_key())//一旦长时间按按键,就一直显示密码
    		{	
    			show2(count);
    		}
    	}
    }
    //显示输入的密码
    void show2(int count)
    {
    	if(count==0)//显示1位数据
    	{
    		P1=0x0e;
    		P0=led[get_word[0]];
    	}
    	if(count==1)//显示2位数据
    	{
    		P1=0x0e;
    		P0=led[get_word[0]];
    		delay(10);
    		P1=0x0d;
    		P0=led[get_word[1]];
    		delay(10);
    	}
    	
    	if(count==2)//显示3位数据
    	{
    		P1=0x0e;
    		P0=led[get_word[0]];
    		delay(10);
    		P1=0x0d;
    		P0=led[get_word[1]];
    		delay(10);
    		P1=0x0b;
    		P0=led[get_word[2]];
    		delay(10);
    	}
    	if(count==3)//显示4位数据
    	{
    			P1=0x0e;
    			P0=led[get_word[0]];
    			delay(10);
    			P1=0x0d;
    			P0=led[get_word[1]];
    			delay(10);
    			P1=0x0b;
    			P0=led[get_word[2]];
    			delay(10);
    			P1=0x07;
    			P0=led[get_word[3]];
    			delay(10);
    			P0=0;
    			//count=-1;
    			signal=0;
    	} 
    }
    //显示设置的密码
    void show1(int count)
    {
    	int i;
    	if(count==0)//显示一位数据
    	{
    		P1=0x0e;
    		i=key_word[0];
    		P0=led[i];
    	}
    	if(count==1)//显示两位数据
    	{
    		P1=0x0e;
    		P0=led[key_word[0]];
    		delay(10);
    		P1=0x0d;
    		P0=led[key_word[1]];
    		delay(10);
    	}
    	
    	if(count==2)//显示三位数据
    	{
    		P1=0x0e;
    		P0=led[key_word[0]];
    		delay(10);
    		P1=0x0d;
    		P0=led[key_word[1]];
    		delay(10);
    		P1=0x0b;
    		P0=led[key_word[2]];
    		delay(10);
    	}
    	if(count==3)//显示四位数据
    	{
    		P1=0x0e;
    		P0=led[key_word[0]];
    		delay(10);
    		P1=0x0d;
    		P0=led[key_word[1]];
    		delay(10);
    		P1=0x0b;
    		P0=led[key_word[2]];
    		delay(10);
    		P1=0x07;
    		P0=led[key_word[3]];
    		delay(10);
    		P0=0;
    		count=-1;
    		signal=0;
    	}
    }
    
    
    //主函数
    void main()
    {
    	int op;
    	LED1=0;
    	Beep=1;
    	while(1)
    	{
    		op=get_key();
    		switch(op)
    		{
    			case 13:
    					while(temp==get_key());//等待选择功能按键释放后再进行设置密码
    					count=-1;//在使用标志位时将标志位进行初始化
    					signal=1;
    					set_key();
    					break;
    			
    			case 14:
    					while(temp==get_key());
    					count=-1;//初始化标志位
    					signal=1;
    					input_key();
    					while(get_key()!=15)//当按下登陆键,输入的密码不再显示
    					{
    						show2(count);
    					}
    					if(compare()==-1)
    					{
    						count1++;
    						while(get_key()!=14&&count1!=3)
    						{
    							show3();//密码错误,显示ERR
    						}
    						P0=0;//按下输入密码键后,清屏
    						if(count1==3)
    						{
    							//开启定时器中断
    							TMOD=0x01;
    							TH0=0x9E;//装载初值25ms
    							TL0=0x58;
    							EA=1; //开总中断
    							ET0=1;//开定时器0
    							TR0=1;  //开启定时器0
    							while(counter1<60);//只有当蜂鸣器响完一分钟之后,才能退出循环
    							TR0=0;//关闭定时器
    					     }
    					}
    					else
    					{	
    						LED1=1;//当输入密码正确时,开启LED灯
    						while(get_key()!=12)//直到按下退出键,屏幕一直显示on
    						{
    							show4();
    						}
    						LED1=0;//退出后关闭LED灯
    						P0=0;//清屏
    					}
    					break;
    			default:break;		
    		}
    	}
    
    }
    
    //获取键值
    int get_key()
    {
    	char key_scan[]={0xef,0xdf,0xbf,0x7f};
    	int i=0;
    	int j=0;
    	for(i=0;i<4;i++)//判断
    	{
    		P2=key_scan[i];
    		if((P2&0x0f)!=0x0f)
    		{
    			for(j=0;j<16;j++)
    			{
    				if(key_buf[j]==P2)
    				{
    					if(temp!=key_buf[j])//一旦长时间按键,将只会读取一次按键的值
    					{
    						signal=1;
    						temp=j;
    						return j;
    					}
    					else signal=0;
    				}
    			}
    		}
    	}
    	return -1;
    }
    
    
    
    
    //输入的密码和设定的密码比较
    int compare()
    {
    	int i;
    	for(i=0;i<4;i++)
    	{
    		if(get_word[i]!=key_word[i])
    			return -1;//输入密码不等于设定的密码返回-1
    	}
    	return 1;//输入的密码等于设定密码返回1
    }
    
    void show3()//显示ERR
    {
    	P1=0x0e;
    	P0=0x79;
    	delay(10);
    	P1=0x0d;
    	P0=0x77;
    	delay(10);
    	P1=0x0b;
    	delay(10);
    }
    void show4()//显示on
    {
    	P1=0x0e;
    	P0=0x5c;
    	delay(10);
    	P1=0x0d;
    	P0=0x54;
    	delay(10);
    }
    
    //定时器中断函数,定时1分钟
    call_police() interrupt 1
    {
    	counter++;
    	if(counter==39)
    	{	
    		counter=0;
    		Beep=~Beep;
    		counter1++;
    		if(counter1==60)//定时一分钟
    		{
    			count1=0;
    			Beep=1;//关闭定时器
    		}
    	}
    	else
    	{
    		TH0=0x9E;
    		TL0=0x58;
    	}
    }
    

    6.仿真结果图

    在这里插入图片描述

    7.工程源码及protues仿真下载

    点击下载工程源码
    点击下载protues仿真程序

    展开全文
  • 51单片机密码锁制作的程序和流程图很详细
  • 51单片机电子制作------篮球比赛计分器

    千次阅读 多人点赞 2019-08-04 19:17:38
    51单片机电子制作------篮球比赛计分器 作者:李剀 出处:https://blog.csdn.net/Kevin_8_Lee 或者 https://www.cnblogs.com/kevin-nancy/ 欢迎转载,但也请保留上面这段声明。谢谢!(上面两个都是我的博客,只是...

    51单片机电子制作------篮球比赛计分器

    作者:李剀

    出处:https://blog.csdn.net/Kevin_8_Lee

    或者 https://www.cnblogs.com/kevin-nancy/

    欢迎转载,但也请保留上面这段声明。谢谢!(上面两个都是我的博客,只是在不同平台)

    这个也是可以用于单片机课设的一个小东西。 同样和之前的交通灯项目一样,我用同样的方法介绍一下

    1) 题目及设计要求

    题目: 篮球比赛计分器
    要求:
    1、两队各三位显示,共计六位数码显示;

    2、设A、B队加、减分按键,复位键;

    3、加减分实现1分、2分、3分加减。

    2) C51编程以及电路仿真软件

    编程:: 同样使用keil3或者keil4,以keil4为例

    软件就不截图了,可以看我关于交通灯的那篇blog
    https://www.cnblogs.com/kevin-nancy/p/10993057.html

    或者 https://blog.csdn.net/Kevin_8_Lee/article/details/91351632

    3) 解决思路

    使用矩阵键盘作为按键输入,分别设置A、B两队加减1、2、3分按键以及清零按键
    在这里插入图片描述

    在proteus中,我的接线如下

    在这里插入图片描述

    使用两个四位八段的数码管(共阴极)显示
    在这里插入图片描述
    **PS:**其他的都跟我之前的那篇交通灯的制作类似
    但是有一个问题在那篇博客忘记说了,这里写一下
    在这里插入图片描述
    上图圈起来那块那个复位用的电阻,必须设置为Digital类型的,否则无法使用复位按钮
    双击元件,即可修改
    在这里插入图片描述

    4)软件部分

    这个整个流程比较简单,程序流程图如下
    在这里插入图片描述

    同样由于时间问题,没心情用更简单的方法改了,直接是无限扫描按键,

    // 矩阵键盘扫描函数,返回16进制数
    uchar KeyScan()	
    {
    	uchar cord_c,cord_r;        
    	P3 = 0x0f;             
    	if( (P3 & 0x0f) != 0x0f)    
    	{
    		delay_ms(5);              
    		if( (P3 & 0x0f) != 0x0f)
    		{
    			  cord_r = P3 & 0x0f;
    			  P3 = cord_c | 0xf0;
    			  cord_c = P3 & 0xf0;
    			  while( (P3 & 0xf0) != 0xf0 );
    			  return (cord_c + cord_r);   
    		}	
    	}
    		
    }
    
    // 不同的按键按下 执行不同的操作
    void Key_score_Dispaly()
    {
    	switch( KeyScan() )
    	{
    		case 0xee: 
                    flag = 0;
                    teamA_scores++;	// A队加分
                    break;
    		case 0xde: 
                    flag = 1;
                    teamA_scores--;
                    break;
    		case 0xbe: 
                    flag = 2;
                    teamB_scores++;
            		break;
    		case 0x7e: 
                    flag = 3;
                    teamB_scores--;
            		break;
    		
    		case 0xed: 
                    flag = 4;
                    teamA_scores+=2;	// 两分球
            		break;
    		case 0xdd: 
                    flag = 5;
                    teamA_scores-=2;
            		break;
    		case 0xbd: 
                    flag = 6;
                    teamB_scores+=2;
            		break;
    		case 0x7d: 
                    flag = 7;
                    teamB_scores-=2;
            		break;
    
    		
    		case 0xeb:  
                    flag = 8;
                    teamA_scores+=3;	// 三分
            		break;
    		case 0xdb:
                    flag = 9;
                    teamA_scores-=3;
            		break;
    		case 0xbb:
                    flag = 10;
                    teamB_scores+=3;
            	    break;
    		case 0x7b:
                    flag = 11;
                    teamB_scores-=3;
            	    break;
    
    		
    		case 0xe7:
                    flag = 12;
                    teamA_scores=0;  // 清零
                    break;
    		case 0xd7:
                    flag = 13;
                    teamA_scores=0;
            	    break;
    		case 0xb7:
                    flag = 14;
                    teamB_scores=0;
            	    break;
    		case 0x77:
                    flag = 15;
                    teamB_scores=0;
            	    break;
    	}
    
        Display(teamA_scores, teamB_scores);  // 显示
    
    }
    
    // 主函数无限循环
    void main()
    {
        system_Init();  // 初始化只是关闭数码管
    	while(1)
        {
            Key_score_Dispaly();
        }
    }
    

    放一下最终的效果吧
    在这里插入图片描述

    路就在你脚下,只要走,就能到达远方! 加油吧!

    ps:这个做的并不是很好,代码大多都是在循环中做,所以没有太细致的讲,但是用来做单片机的课设还是足够了

    展开全文
  • 利用51单片机制作一个秒表的详细过程

    万次阅读 多人点赞 2017-07-25 12:53:30
    利用51单片机制作一个秒表的详细过程 前面的话: 和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大家...
  • 华工北校宿舍的们是没有外置门把的,每次同学来敲门都要走到门口开房门,非常麻烦,如果出门忘记带钥匙就没办法从...(4)平时不用时,单片机处于休眠模式(降低功耗),但接收到遥控器的消息后,单片机进入工作模式。
  • //位 unsigned char LED_z[3]; //数码管轮流显示数组 void main() { EA = 1; //打开总中断 shi = 0; fen = 0; miao =0; jia =1; jian=1; she=1; stop(); RTC(); displayRTC(); Timer0_uint(); //...
  • 简单判断按键输入的密码是否正确,用矩阵键盘输入密码,通过串口发送给电脑,液晶显示
  • 此时显示屏显示“已上锁”。...多次(次数为N)解锁失败后延时一段时间(时间为S)后才能继续解锁。...2 用独立按键设置成“unlock”、“lock”、“#”等3 用LCD屏显示所设置相关信息;4 用LED灯表示上锁或解锁状态发挥...
  • 本源是基于51单片机的基础开发,能够实现时间和当前温度显示(利用ds18b20测量),显示是通过LED显示而不是LCD显示,特此说明。
  • 单片机制作工具大汇总!! 单片机制作工具大汇总!!!这是一个神奇的帖子,我不会放很多的资料出来,我只放一个列表,大家需要哪个资料就回复告诉我,我再上传,然后先上传几个工具给大家玩玩:可以到闯客网技术...
  • 前面的话:和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大家一样,百思不得其解,最后头都弄大了才把这...
  • 本文介绍了一种用MCS-51系列单片机AT89C52代替专用遥控芯片的设计方案,通过软件模拟实现了电视机遥控编码的发射,并且达到“一器多用”。
  • 【已完成】51单片机定时器制作日志

    千次阅读 2014-03-01 19:34:57
    开始制作,暂定为STC12C5A60S2+水银开关+2位数管组合。水银开关未在本地买到,准备网购,先写定时器和显示部分的程序。 使用水银开关进行位置检测,更改定时时间,以分为单位在数码管上显示。 不定期更新日志。 ...
  • 【C51单片机】制作数字电压表(仿真)

    千次阅读 热门讨论 2019-08-07 13:42:40
    数字电压表:在AT89C52系统中采用PCF8591芯片,测量0-5V范围内的直流电压,并在2位数管上显示电压值。 2、使用PROTEUS元件 PCF8591数模转换 二位数码管 排阻 3、PROTEUS中设计的电路图 4、源代码 #include...
  • 51单片机对LCD1602液晶显示器的控制要想实现人机交互,显示装置是不可缺少的。这篇文章主要关于如何控制液晶显示,并在此基础上加上定时器的功能,把原来已用数码管显示的定时器搬到液晶屏上来。这里用到的液晶为LCD...
  • 1 引 言 在大型商场、车站、码头、地铁站以及各类办事窗口等越来越多的场所需要用LED点阵显示图形和汉字。LED行业已成为一个快速发展的新兴产业,市场空间巨大,前景广阔... 本文基于单片机(AT89C51)讲述了16×16 L
  • 51单片机制作脉冲发生器

    千次阅读 2020-10-26 19:53:20
    任务描述:应用单片机定时/计数器设计一个秒脉冲发生器,并用2位数管显示脉冲数 文章目录设计一个秒脉冲发生器要求总结 要求 1.在Keil IDE(u Vision2)中完成应用程序设计,并编译 2.在ISIS 7 Professional 中...
  • 本密码锁的特点是,假如按错了密码键顺序或按下了任何一个非密码键,电路即锁定为关断状态,各按键均失效,大大增加了开锁难度。本文主要介绍了其电路图
  • 我用的是6位。也可以多几位,更改相应变量即可。很简单。...调试成功,可以直接用。STC89C51RC单片机 ,万能板焊接 //实验板上24C02已写入数据 {2,3,4,6,7,0}#include#include #define uchar unsigned char#

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,772
精华内容 2,308
关键字:

单片机的码制