目標(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)介紹
最新的代碼(可以實現(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
?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
舊版代碼效果最大只能傳輸255?
新版代碼可以傳輸8位數(shù)下面是效果圖(電腦端輸入11223344)
文章來源:http://www.zghlxwxcb.cn/news/detail-433500.html
?這是按鈕0到7按下后收到的數(shù)據(jù)
文章來源地址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)!