国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

51單片機的串口實驗之?dāng)?shù)碼管顯示與按鍵實驗(8位數(shù)字任意傳輸)

這篇具有很好參考價值的文章主要介紹了51單片機的串口實驗之?dāng)?shù)碼管顯示與按鍵實驗(8位數(shù)字任意傳輸)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目標(biāo)效果:

1、電腦發(fā)送任意小于<=8位數(shù)字(SUBF只有8位最大只能發(fā)送255,但是可以通過數(shù)組進(jìn)行臨時存儲來實現(xiàn)傳輸多字節(jié))數(shù)字,在數(shù)碼管上顯示對應(yīng)的數(shù)字且同時滿足高位是0可以不顯示

?2、矩陣按鍵按下后,電腦接收所按下的按鈕


實驗器材:

1、普中51單片機。2、STC官方下載器自帶的串口調(diào)試的功能


相關(guān)資料 (普中官方資料)

SCON寄存器的相關(guān)介紹51單片機的串口實驗之?dāng)?shù)碼管顯示與按鍵實驗(8位數(shù)字任意傳輸)

51單片機的串口實驗之?dāng)?shù)碼管顯示與按鍵實驗(8位數(shù)字任意傳輸)


最新的代碼(可以實現(xiàn)一次性傳輸多字節(jié)也就是可以傳輸8位數(shù)字)

#include <REGX52.H>
 
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long int u32;
#define SMG_A_DP_PORT P0 //使用宏定義數(shù)碼管段碼口
#define KEY_MATRIX_PORT P1 //使用宏定義矩陣按鍵控制口
 
 
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
 
#define SMG_A_DP_PORT P0 //使用宏定義數(shù)碼管段碼口
#define KEY_MATRIX_PORT P1 //使用宏定義矩陣按鍵控制口
 
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
u16 shuju[8]=0;
u32 a,key;//a用來接收收到的數(shù)字,key是接收到的按鍵
u8 num=0,flag=0;
void configuart(u16 baud);
 
void delay (u16 time)
{
	while(time--);
}
 
u8 anjian_scan(void)
{
	static u8 keyvalue=0;
	KEY_MATRIX_PORT=0x0f;
	if(KEY_MATRIX_PORT!=0x0f)
	{
		delay(1000);
		if(KEY_MATRIX_PORT!=0x0f)
		{
			KEY_MATRIX_PORT=0x0f;
			switch(KEY_MATRIX_PORT)//保存行為 0,按鍵按下后的列值
			{
				case 0x07: keyvalue=1;break;
				case 0x0b: keyvalue=2;break;
				case 0x0d: keyvalue=3;break;
				case 0x0e: keyvalue=4;break;
			}
			KEY_MATRIX_PORT=0xf0;
			switch(KEY_MATRIX_PORT)//保存列為 0,按鍵按下后的鍵值
			{
				case 0x70: keyvalue=keyvalue;break;
				case 0xb0: keyvalue=keyvalue+4;break;
				case 0xd0: keyvalue=keyvalue+8;break;
				case 0xe0: keyvalue=keyvalue+12;break;
			}
			while(KEY_MATRIX_PORT!=0xf0);
		}
	}
	else
		keyvalue=0;
	return keyvalue;
}
 
void smg_display(u32 b)
{
	u8 i=0,flag=0;
	shuju[0]=b%16;
	shuju[1]=b/16%16;
	shuju[2]=b/16/16%16;
	shuju[3]=b/16/16/16%16;
	shuju[4]=b/16/16/16/16%16;
	shuju[5]=b/16/16/16/16/16%16;
	shuju[6]=b/16/16/16/16/16/16%16;
	shuju[7]=b/16/16/16/16/16/16/16;
	for(i=7;i>=0;i--)
	{
		if(shuju[i]==0)
			shuju[i]=16;
		else if(shuju[i]!=0)//從高位開始檢測是不是有0一旦檢測到有0退出循環(huán)
			break;
	}
	for(i=0;i<8;i++)
	{
		switch(i)//位選
		{
			case 7: LSC=1;LSB=1;LSA=1;break;
			case 6: LSC=1;LSB=1;LSA=0;break;
			case 5: LSC=1;LSB=0;LSA=1;break;
			case 4: LSC=1;LSB=0;LSA=0;break;
			case 3: LSC=0;LSB=1;LSA=1;break;
			case 2: LSC=0;LSB=1;LSA=0;break;
			case 1: LSC=0;LSB=0;LSA=1;break;
			case 0: LSC=0;LSB=0;LSA=0;break;
		}
		SMG_A_DP_PORT=gsmg_code[shuju[i]];//傳送段選數(shù)據(jù)
		delay(100);//延時一段時間,等待顯示穩(wěn)定
		SMG_A_DP_PORT=0x00;//消影
	}
}
 
void main()
{
	EA=1;
	configuart(9600);
	while(1)
	{
		smg_display(a);
		num=0;
		key=anjian_scan();
		if(key!=0)
			SBUF=key-1;
	}
}
 
void configuart(u16 baud)
{
	SCON=0x50;
	TMOD&=0x0f;
	TMOD|=0X20;
	TH1=256-(11059200/12/32/baud);
	TL1=TH1;
	ET1=0;
	TR1=1;
	ES=1;
}
 
void interruptUART() interrupt 4
{
	unsigned long int i,b,c;
	EA=0;
	if(RI==1)
	{
		RI=0;
		shuju[num]=SBUF;
		num++;
		flag=1;
	}
	EA=1;
	if(flag==1)               
	{
		a=0;
		for(i=0;i<num;i++)     
		{
			b=shuju[i]/16;
			c=shuju[i]%16;
			if(b!=0)
			{
				a=a*16*16+shuju[i];
			}else{
				a=a*16+c;
			}
		}
	}
	if(TI==1)
		TI=0;
}

代碼(原先第一次寫的舊代碼只能實現(xiàn)傳輸<=255的數(shù)字)

#include <REGX52.H>

typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

#define SMG_A_DP_PORT P0 //使用宏定義數(shù)碼管段碼口
#define KEY_MATRIX_PORT P1 //使用宏定義矩陣按鍵控制口

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
u16 shuju[8]=0;
u16 a,key;//a用來接收收到的數(shù)字,key是接收到的按鍵

void configuart(u16 baud);

void delay (u16 time)
{
	while(time--);
}

u8 anjian_scan(void)
{
	static u8 keyvalue=0;
	KEY_MATRIX_PORT=0x0f;
	if(KEY_MATRIX_PORT!=0x0f)
	{
		delay(1000);
		if(KEY_MATRIX_PORT!=0x0f)
		{
			KEY_MATRIX_PORT=0x0f;
			switch(KEY_MATRIX_PORT)//保存行為 0,按鍵按下后的列值
			{
				case 0x07: keyvalue=1;break;
				case 0x0b: keyvalue=2;break;
				case 0x0d: keyvalue=3;break;
				case 0x0e: keyvalue=4;break;
			}
			KEY_MATRIX_PORT=0xf0;
			switch(KEY_MATRIX_PORT)//保存列為 0,按鍵按下后的鍵值
			{
				case 0x70: keyvalue=keyvalue;break;
				case 0xb0: keyvalue=keyvalue+4;break;
				case 0xd0: keyvalue=keyvalue+8;break;
				case 0xe0: keyvalue=keyvalue+12;break;
			}
			while(KEY_MATRIX_PORT!=0xf0);
		}
	}
	else
		keyvalue=0;
	return keyvalue;
}

void smg_display(u16 b)
{
	u8 i=0,flag=0;
	shuju[0]=b%10;
	shuju[1]=b/10%10;
	shuju[2]=b/100%10;
	shuju[3]=b/1000%10;
	shuju[4]=b/10000%10;
	shuju[5]=b/100000%10;
	shuju[6]=b/1000000%10;
	shuju[7]=b/10000000;
	for(i=7;i>=0;i--)
	{
		if(shuju[i]==0)
			shuju[i]=16;
		else if(shuju[i]!=0)//從高位開始檢測是不是有0一旦檢測到有0退出循環(huán)
			break;
	}
	for(i=0;i<8;i++)
	{
		switch(i)//位選
		{
			case 7: LSC=1;LSB=1;LSA=1;break;
			case 6: LSC=1;LSB=1;LSA=0;break;
			case 5: LSC=1;LSB=0;LSA=1;break;
			case 4: LSC=1;LSB=0;LSA=0;break;
			case 3: LSC=0;LSB=1;LSA=1;break;
			case 2: LSC=0;LSB=1;LSA=0;break;
			case 1: LSC=0;LSB=0;LSA=1;break;
			case 0: LSC=0;LSB=0;LSA=0;break;
		}
		SMG_A_DP_PORT=gsmg_code[shuju[i]];//傳送段選數(shù)據(jù)
		delay(100);//延時一段時間,等待顯示穩(wěn)定
		SMG_A_DP_PORT=0x00;//消影
	}
}

void main()
{
	EA=1;
	configuart(9600);
	while(1)
	{
		smg_display(a);
		key=anjian_scan();
		if(key!=0)
			SBUF=key-1;
	}
}

void configuart(u16 baud)
{
	SCON=0x50;
	TMOD&=0x0f;
	TMOD|=0X20;
	TH1=256-(11059200/12/32/baud);
	TL1=TH1;
	ET1=0;
	TR1=1;
	ES=1;
}

void interruptUART() interrupt 4
{
	if(RI==1)//接收到字節(jié)
	{
		RI=0;
		a=SBUF;
	}
	if(TI==1)
		TI=0;
}

高位不顯示的代碼

原理:通過循環(huán)檢測是否有0,如果檢測到有0,則將該位賦值為16,對應(yīng)數(shù)碼管的就是0x00。

注意的是我們數(shù)碼管采用的是共陰數(shù)碼管,所以0x00才是不顯示。

for(i=7;i>=0;i--)
	{
		if(shuju[i]==0)
			shuju[i]=16;
		else if(shuju[i]!=0)//從高位開始檢測是不是有0一旦檢測到有0退出循環(huán)
			break;
	}

?注意還要在數(shù)碼管數(shù)組那里補充一個0x00。

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

特別注意:

在傳輸大于4位的時候要使用long int數(shù)據(jù)類型,如果使用int會導(dǎo)致長度不夠而儲存不下


實驗步驟:

1、首先要打開串口助手頁面,并打開串口

2、選擇合適的波特率,這里根據(jù)代碼我選擇9600

51單片機的串口實驗之?dāng)?shù)碼管顯示與按鍵實驗(8位數(shù)字任意傳輸)

?3、在發(fā)送緩沖區(qū)選擇hex模式,注意這里填入的數(shù)字是以16進(jìn)制返回,這就意味著填入10,數(shù)碼管顯示的是16,(如果我們想要達(dá)到輸入10返回也是10,則需要在用數(shù)組重新變回原數(shù)字的時候/16,%16處理)(最新代碼已經(jīng)實現(xiàn))且因為SBUF寄存器只有8位,所以最大只能填入FF,對應(yīng)的10進(jìn)制就是255(但是可以通過數(shù)組的形式暫時儲存數(shù)據(jù),然后等所有數(shù)據(jù)也就是帶個字節(jié)都接受過來再處理重新組合成原來的數(shù)字)(最新代碼已經(jīng)實現(xiàn))

4、在發(fā)送緩沖區(qū)填入數(shù)字即可看到對應(yīng)的結(jié)果

5、任意按下對應(yīng)的按鈕即可看到接收緩沖區(qū)收到的數(shù)據(jù)


實驗現(xiàn)象:

電腦在發(fā)送緩沖區(qū)輸入9,數(shù)碼管顯示9

51單片機的串口實驗之?dāng)?shù)碼管顯示與按鍵實驗(8位數(shù)字任意傳輸)

舊版代碼效果最大只能傳輸255?51單片機的串口實驗之?dāng)?shù)碼管顯示與按鍵實驗(8位數(shù)字任意傳輸)

新版代碼可以傳輸8位數(shù)下面是效果圖(電腦端輸入11223344)

51單片機的串口實驗之?dāng)?shù)碼管顯示與按鍵實驗(8位數(shù)字任意傳輸)

?這是按鈕0到7按下后收到的數(shù)據(jù)51單片機的串口實驗之?dāng)?shù)碼管顯示與按鍵實驗(8位數(shù)字任意傳輸)文章來源地址http://www.zghlxwxcb.cn/news/detail-433500.html

到了這里,關(guān)于51單片機的串口實驗之?dāng)?shù)碼管顯示與按鍵實驗(8位數(shù)字任意傳輸)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 51單片機數(shù)碼管

    51單片機數(shù)碼管

    51單片機的數(shù)碼管是一種常用的數(shù)字顯示設(shè)備,用于在嵌入式系統(tǒng)中顯示數(shù)字和一些特定的符號。數(shù)碼管通常由七段LED組成,每個LED段可以顯示數(shù)字0到9以及一些字母和符號。通過控制每個LED段的亮滅,可以顯示不同的數(shù)字和字符。 在51單片機中,數(shù)碼管通常連接到GPIO(通用

    2024年01月21日
    瀏覽(20)
  • 51單片機(四)靜態(tài)數(shù)碼管和動態(tài)數(shù)碼管顯示

    51單片機(四)靜態(tài)數(shù)碼管和動態(tài)數(shù)碼管顯示

    ?? 專欄簡介:本專欄記錄了從零學(xué)習(xí)單片機的過程,其中包括51單片機和STM32單片機兩部分;建議先學(xué)習(xí)51單片機,其是STM32等高級單片機的基礎(chǔ);這樣再學(xué)習(xí)STM32時才能融會貫通。 ?? 專欄適用人群 :適用于想要從零基礎(chǔ)開始學(xué)習(xí)入門單片機,且有一定C語言基礎(chǔ)的的童鞋

    2024年02月09日
    瀏覽(19)
  • 【51單片機】動態(tài)數(shù)碼管

    【51單片機】動態(tài)數(shù)碼管

    0、前言 參考: 普中51單片機開發(fā)攻略–A2.pdf 上一章我們主要是介紹一位數(shù)碼管的內(nèi)部結(jié)構(gòu)及控制原理。下面我們再來介 紹下多位數(shù)碼管及動態(tài)顯示原理的相關(guān)知識。 本章所要實現(xiàn)的功能是:控制動態(tài)數(shù)碼管從左至右顯示數(shù)字 0-7。 為了正規(guī)點,工程弄個正規(guī)文件夾: http

    2024年01月21日
    瀏覽(43)
  • 51單片機數(shù)碼管顯示(三)

    51單片機數(shù)碼管顯示(三)

    目錄 一、靜態(tài)數(shù)碼管顯示 1、一位數(shù)碼管 (1)LED數(shù)碼管各段名稱 (2)數(shù)碼管引腳定義 (3)?共陰極(89C52RC單片機LED數(shù)碼管采用共陰極方式) (4)共陽極 2、四位一體數(shù)碼管 (1)四位一體數(shù)碼管引腳定義 (2)上面共陰極和下面共陽極 ?3、數(shù)碼管模塊原理圖詳解 4、編寫

    2024年02月08日
    瀏覽(28)
  • 51單片機靜態(tài)數(shù)碼管顯示

    51單片機靜態(tài)數(shù)碼管顯示

    51單片機靜態(tài)數(shù)碼管顯示 數(shù)碼管是一種簡單、廉價的顯示器,是由多個發(fā)光二極管封裝在一起組成“8”字型的器件。 ? 數(shù)碼管從上右下左中有ABCDEFGDP,共10個引腳,其中3、8號引腳是連接到所有二極管的陰極,A二級管對應(yīng)7號和38號引腳,B二極管對應(yīng)6號和38號引腳。所有陰極

    2024年02月08日
    瀏覽(27)
  • 二、51單片機控制數(shù)碼管

    二、51單片機控制數(shù)碼管

    (1)數(shù)碼管的外觀: 數(shù)碼管可分為單個的,聯(lián)排的(2位、4位、8位) (2)數(shù)碼管的作用: 數(shù)碼管是顯示器件,是用來顯示數(shù)字的。 (1)數(shù)碼管的亮滅是由內(nèi)部的照明LED的亮滅實現(xiàn)的。 (2)一位數(shù)碼管內(nèi)部有八顆LED燈,利用內(nèi)部的LED燈的亮和滅讓數(shù)碼管顯示不同的數(shù)字。 (1)驅(qū)動方法的

    2023年04月09日
    瀏覽(29)
  • 51單片機(數(shù)碼管可調(diào)時鐘)

    51單片機(數(shù)碼管可調(diào)時鐘)

    1.數(shù)碼管(共陰極)如何顯示數(shù)字:位選+段選(單個) 位選:138譯碼器通過P22、P23、P24三個端口輸入二進(jìn)制數(shù)(011、000等)來選擇連同譯碼器右邊的哪一條線,而這些線又分別連著數(shù)碼管的LED12345678、決定選擇哪一個來顯示數(shù)字 段選:決定輸出什么數(shù)字,數(shù)碼管下方又連著一

    2024年02月05日
    瀏覽(25)
  • 51單片機入門————數(shù)碼管顯示

    51單片機入門————數(shù)碼管顯示

    我們在馬路上看到的紅綠燈,就是由數(shù)碼管來實現(xiàn)的,就是其中可能加入了一些延時和轉(zhuǎn)換 數(shù)碼管是通過控制138譯碼器與74HC245來控制數(shù)碼管的亮滅與數(shù)字的顯示 我們先討論一個數(shù)碼管 數(shù)碼管有共陽極和共陰極,我們現(xiàn)在使用的STC89C52是共陰極的,說明數(shù)碼管共用陰極 上面是

    2024年02月13日
    瀏覽(17)
  • 51單片機:數(shù)碼管和矩陣按鍵

    51單片機:數(shù)碼管和矩陣按鍵

    目錄 一:動態(tài)數(shù)碼管模塊 1:介紹 ?2:共陰極和共陽極 A:共陰極 B:共陽極 C:轉(zhuǎn)化表 ?3:74HC138譯碼器 4:74HC138譯碼器控制動態(tài)數(shù)碼管(位選) 5:數(shù)碼管顯示完整代碼 6:74HC573鎖存器 A:基本點 B:原理圖介紹 c:74HC573控制數(shù)碼管代碼 二:矩陣按鍵模塊 1:介紹 2:原理圖 ?3:矩陣按鍵代碼 ??????

    2024年02月15日
    瀏覽(26)
  • 51單片機矩陣鍵盤——數(shù)碼管顯示

    當(dāng)我們熟悉了數(shù)碼管的位選與段選,并了解的矩陣鍵盤的掃描之后就可以編寫程序了。 按下矩陣鍵盤S1并松開,數(shù)碼管第一位(LED8)顯示0;按下矩陣鍵盤S2并松開,數(shù)碼管第一位顯示1;...按下矩陣鍵盤S16并松開,數(shù)碼管第一位顯示F; 矩陣鍵盤掃描(輸入掃描) ?? ?原理:

    2024年02月11日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包