基於STC51單片機的計數器


基於STC51單片機的計數器

設計要求:

  • 寫出矩陣鍵盤的驅動

  • 分別按下對應的鍵。數碼管會將鍵盤對應的值累加並顯示

設計概述:

  按照設計要求,所需要的單片機芯片為STC89C52,所用的硬件工具是由華清遠見開發的基於STC89C52的智能小車。該小車配備所需要的矩陣按鍵模塊和數碼管模塊,矩陣按鍵模塊由P3口控制,數碼管模塊位選P2.7口控制,段選由P2.6口控制,數字顯示由P0口控制。STC89C52是一種低功耗,高性能的8位微控制器,是加強版的80C51單片機。

矩陣鍵盤:4x4矩陣鍵盤共有16個按鍵,每個按鍵的左端都連接在一根線上形成行線,每個按鍵的右端也都連接在一根線上形成列線。P3口的低4位分別於行線連接,高4位分別與列線連接。通過掃描矩陣鍵盤中按鍵兩端的電平變化來准確識別其中的按鍵。

源代碼:

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit WELA = P2^7; //定義位選IO口
sbit DULA = P2^6;//定義段選IO口

void matrix_key_scan();
void delay_ms(uint ms);
void sum_key();
void display_num(unsigned int num);
void display_digit(unsigned char wela,unsigned char dula);

uint key_value = 0; //定義全局變量保存鍵值
uint keynum1 = 0;
uint keynum2 = 0;

//數碼管0-9段選編碼
uchar code Du[] = {0x3f,0x06,0x5b,0x4f,
                   0x66,0x6d,0x7d,0x07,
                   0x7f,0x6f}; 

/*-----矩陣鍵盤掃描函數-----*/
void matrix_key_scan()
{
   uchar temp;
   uchar a = 0;
   P3 = 0x0f;//將所有行電平拉高,列電平拉低,進行行掃描
   temp = P3;
   if(temp != 0x0f)//檢測是否有鍵按下
   {
   	   delay_ms(5);//延時去抖
	   if(temp != 0x0f)//再次確認按鍵按下
	   {
	   	  P3 = 0x0f;//將所有行電平拉高,列電平拉低,進行行掃描
          temp = P3;
		  switch(temp)
		  {
		     case 0x0e:key_value = 0;	//第1行
			           break;
		  	 case 0x0d:key_value = 4;  //第2行
			           break;
			 case 0x0b:key_value = 8;	//第3行
			           break;
			 case 0x07:key_value = 12; //第4行
			           break;
		  }
		  P3 = 0xf0;//將所有列電平拉高,行電平拉低,進行列掃描
          temp = P3;	  
		  switch(temp)
		  {
		  	 case 0xe0:key_value = key_value + 0;//第1列
			           break;
		  	 case 0xd0:key_value = key_value + 1;//第2列
			           break;
             case 0xb0:key_value = key_value + 2;//第3列
			           break;
			 case 0x70:key_value = key_value + 3;//第4列
			           break;
		  
		  
		  //這里需要延時200ms,因為矩陣鍵盤掃描函數在while循環中是不斷執行
		  //如果按下鍵后不松開或者松開鍵慢了,keynum2變量就會不斷累加,
		  delay_ms(200);
		  keynum1 = key_value;![image](https://img2020.cnblogs.com/blog/2427665/202109/2427665-20210902095257265-732916178.jpg)
		  keynum2 = keynum2 + keynum1;

	  }
	}
   
   while((a < 50)&&(temp != 0xf0))//等待按鍵釋放
   {
   	   a++;
   }
}

/*-----毫秒級延時函數-----*/
void delay_ms(uint ms)
{
   volatile uint i,j;
   for(i = ms;i > 0;i--)
   {
      for(j=0;j<110;j++);
   }
  
}

/*--------數碼管顯示數字函數---------*/
void display_num(unsigned int num)
{
	unsigned int div = 0;
	unsigned char rema = 0;
	unsigned char index = 0;
		
	while((div = num / 10) > 0)
	{
		rema = num % 10;
		display_digit(index,rema);
		num = div;
		index++;
		delay_ms(2);
	}
	rema = num % 10;
	display_digit(index,rema);
}

/*-------數碼管位選函數-------*/
void display_digit(unsigned char wela,unsigned char dula)
{
	WELA = 1;// 位選端鎖存器置高,送數據
	P0 = 0xFF;//消影
	P0 &= ~(1 << (7 - wela));//1000 0000	  0111 1111
	WELA = 0;// 位選端鎖存器置低,保存數據

	DULA = 1;// 段選端鎖存器置高,送數據
	P0 = Du[dula];//送數據
	DULA = 0;// 段選端鎖存器置低,保存數據
}

void main()
{
	while(1)   
	{  
	   matrix_key_scan();
	   display_num(keynum2);
 	}
}

小車部分原理圖:

image

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM