熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2022-1-5 16:56
正文摘要:#include <reg51.h> #include "string.h" #define uchar unsigned char #define uint unsigned int sbit S1=P1^0; sbit S2=P1^1; sbit S3=P1^2; sbit S4=P1^3; void uart_init(v ... |
lkc8210 發(fā)表于 2022-1-7 15:21 //發(fā)送字符串到串口助手 #include <STC12C5410AD.h> #include "string.h" #define uchar unsigned char #define uint unsigned int sbit S1=P1^3; sbit S2=P1^2; sbit S3=P1^1; sbit S4=P1^0; char table_s1[] = {0xEF, 0x09, 0x73, 0x00, 0x01, 0x02, 0x96}; char table_s2[] = {0xEF, 0x09, 0x73, 0x00, 0x02, 0x01, 0x96}; char table_s3[] = {0xEF, 0x09, 0x66, 0x03, 0x00, 0x00, 0x83}; char table_s4[] = {0xEF, 0x09, 0x73, 0x01, 0x00, 0x00, 0x94}; //初始化 void uart_init(void) //9600bps@22.1184MHz { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位數(shù)據(jù),可變波特率 AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式 AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器 TMOD &= 0x0F; //設(shè)置定時(shí)器模式 TMOD |= 0x20; //設(shè)置定時(shí)器模式 TL1 = 0xFA; //設(shè)置定時(shí)初始值 TH1 = 0xFA; //設(shè)置定時(shí)重載值 ET1 = 0; //禁止定時(shí)器%d中斷 TR1 = 1; //定時(shí)器1開始計(jì)時(shí) ES = 1; EA = 1; } // void uart_tx_byte(uchar dat) { SBUF=dat; while(!TI); TI=0; } void uart_tx_string(uchar *P) { while(*P) { uart_tx_byte(*P); P++; } } void main() { uart_init(); while(1) {static unsigned char delay; if(S1==0 || S2==0 || S3==0 || S4==0)//有鍵按下 { if(delay<0xFF)delay++;//消抖延時(shí) if(delay == 250) { if(S1==0) //按鍵S1按下 { uart_tx_string(table_s1); } if(S2==0) //按鍵S2按下 { uart_tx_string(table_s2); } if(S3==0) //按鍵S3按下 { uart_tx_string(table_s3); } if (S4==0) //按鍵S4按下 { uart_tx_string(table_s4); } } }else{ delay = 0; } } }不全 高手,在幫我看看。怎么數(shù)據(jù)發(fā)不全 發(fā)送1:EF 09 73 00 01 02 96 接收1:EF 09 73 發(fā)送2:EF 09 66 03 00 00 83 接收2:EF 09 66 03 |
suncat0504 發(fā)表于 2022-1-8 11:09 謝謝指點(diǎn),要好好學(xué)習(xí)學(xué)習(xí)一下 |
稻草人008 發(fā)表于 2022-1-7 20:03 樓主,我覺(jué)得你應(yīng)該抽點(diǎn)時(shí)間,看看串口通訊在芯片、線路上是怎么實(shí)現(xiàn)的。這個(gè)是基礎(chǔ),學(xué)明白了,如何解決問(wèn)題,你會(huì)有重新認(rèn)識(shí)。用來(lái)實(shí)現(xiàn)數(shù)據(jù)傳送的,是芯片中的寄存器,你把數(shù)據(jù)送進(jìn)去,通過(guò)線路送到接收方的寄存器。收發(fā)正常的場(chǎng)合,兩邊寄存器里的內(nèi)容是一致的。當(dāng)你把可顯示、打印的ASCII和不可顯示、打印的16禁止數(shù)據(jù)混合傳輸?shù)臅r(shí)候,比如以下語(yǔ)句(假設(shè)printf做個(gè)輸出轉(zhuǎn)向,轉(zhuǎn)向給串口輸出,假設(shè)comout是輸出16進(jìn)制數(shù)據(jù)給串口): printf("12345"); // 注:這五個(gè)字符,對(duì)應(yīng)的6進(jìn)制數(shù)據(jù)為:0x31,0x32,0x33,0x34,0x35 unsigned char dat[]={0xF1,0xC1,0x00,0x23}; comout(dat,0,3); // 像串口發(fā)送dat數(shù)組中從0號(hào)元素開始,到3號(hào)元素截止的數(shù)據(jù),包含0號(hào)元素和3號(hào)元素 那么經(jīng)過(guò)這些發(fā)送,接收方收到的數(shù)據(jù),以16進(jìn)制表達(dá):0x31,0x32,0x33,0x34,0x35,0xF1,0xC1,0x00,0x23 當(dāng)你使用APP接收這些數(shù)據(jù),如果以文本形式表示出來(lái)的時(shí)候,因?yàn)榍拔鍌(gè)對(duì)應(yīng)的是可顯示打印的數(shù)據(jù),所以顯示“12345”,但后五個(gè)是沒(méi)法顯示的。 上面的發(fā)送,是可以用以下形式,一樣實(shí)現(xiàn): unsigned char dat[]={0x31,0x32,0x33,0x34,0x35,0xF1,0xC1,0x00,0x23}; comout(dat, 0, 8); |
lkc8210 發(fā)表于 2022-1-8 09:15 謝謝,我是搞硬件的,對(duì)軟件只知道點(diǎn)皮毛。。再次謝謝你的指點(diǎn)。 |
稻草人008 發(fā)表于 2022-1-7 19:02 對(duì)~ 所以你要以16進(jìn)數(shù)組來(lái)發(fā) char table_s1[] = {0xEF, 0x09, 0x73, 0x00, 0x02, 0x01, 0x96}; char table_s2[] = {0xEF, ...}; char table_s3[] = {0xEF, ...}; char table_s4[] = {0xEF, ...}; if(S1==0) //按鍵S1按下 { uart_tx_string(table_s1); } if(S2==0) //按鍵S2按下 { uart_tx_string(table_s2); } |
lkc8210 發(fā)表于 2022-1-6 14:45 大神你好,還是要請(qǐng)你幫忙。EF 09 73 00 01 02 96這串?dāng)?shù)就是16進(jìn)制的,在ascll上顯示正常,在16進(jìn)制下就被從編了一遍。是不是這樣。要怎么改。 |
suncat0504 發(fā)表于 2022-1-7 19:49 但是我要的數(shù)據(jù)它在ASCII里傳送正常,在16進(jìn)制里就被編了一次,設(shè)備不認(rèn) |
對(duì)于接收方,它不知道來(lái)的是什么數(shù)據(jù),是ASCII還是十六進(jìn)制數(shù)據(jù),它都統(tǒng)一按照16進(jìn)制收取。所以發(fā)送方即使發(fā)的是ASCII碼,接收方會(huì)按照16進(jìn)制收取ASCII碼對(duì)應(yīng)的16進(jìn)制數(shù)據(jù)。實(shí)際上,無(wú)論收發(fā),走在線路上的數(shù)據(jù)都是二進(jìn)制數(shù)據(jù)0和1的組合而已。所以才有協(xié)議一說(shuō),接收方按照發(fā)射方的意圖去解析數(shù)據(jù)。 |
lkc8210 發(fā)表于 2022-1-7 18:40 EF 09 73 00 01 02 96這串?dāng)?shù)就是16進(jìn)制的,在ascll上顯示正常,在16進(jìn)制下就被轉(zhuǎn)了一下。是不是這樣。 |
稻草人008 發(fā)表于 2022-1-7 19:02 "EF 09 73 00 01 02 96這串?dāng)?shù)就是16進(jìn)制的,在ascll上顯示正常,在16進(jìn)制下就被轉(zhuǎn)了一下。是不是這樣。 |
lkc8210 發(fā)表于 2022-1-7 18:40 是不是我發(fā)的被我指定為文本了,然后它在轉(zhuǎn)了一遍 |
稻草人008 發(fā)表于 2022-1-7 18:35 就是45 46 20 30 39 20 37 33 20 30 30 20 30 32 20 30 31 20 39 36 20 0A 0D嗎? 那就不用轉(zhuǎn) |
lkc8210 發(fā)表于 2022-1-7 15:21 我要的是16進(jìn)制下的EF 09 73 00 01 02 96 |
稻草人008 發(fā)表于 2022-1-7 15:08 如果你要的是0xEF 0x09 0x73...就要轉(zhuǎn)碼 |
lkc8210 發(fā)表于 2022-1-6 14:45 高手,你好,現(xiàn)在都調(diào)出來(lái)了, 但是我發(fā)的EF 09 73 00 01 02 96這字符在串口上讀出來(lái)的是ASCII正確,16進(jìn)制45 46 20 30 39 20 37 33 20 30 30 20 30 32 20 30 31 20 39 36 20 0A 0D 。但是我要的是16位進(jìn)制的。是不是需要轉(zhuǎn)碼 |
13205495918 發(fā)表于 2022-1-6 19:45 好的謝了,我去看看 |
![]() |
boboxuexi 發(fā)表于 2022-1-6 15:36 十分感謝,等忙完試試。 |
阻塞試延時(shí)是單片機(jī)程序設(shè)計(jì)最大的忌諱, |
如果你現(xiàn)實(shí)用的是stc12c5410ad 要把定時(shí)器設(shè)為12分頻 void UartInit(void) //9600bps@22.1184MHz { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位數(shù)據(jù),可變波特率 AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式 AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器 TMOD &= 0x0F; //設(shè)置定時(shí)器模式 TMOD |= 0x20; //設(shè)置定時(shí)器模式 TL1 = 0xFA; //設(shè)置定時(shí)初始值 TH1 = 0xFA; //設(shè)置定時(shí)重載值 ET1 = 0; //禁止定時(shí)器%d中斷 TR1 = 1; //定時(shí)器1開始計(jì)時(shí) ES = 1; EA = 1; } |
lkc8210 發(fā)表于 2022-1-5 17:45 十分感謝,用你的程序好了。 |
lkc8210 發(fā)表于 2022-1-5 17:45 十分感謝,我試試 |
天ノ憶 發(fā)表于 2022-1-5 17:51 謝了,跟盆友學(xué)寫了個(gè)蹩腳程序,望多指教 |
發(fā)9條多嗎,你這程序不發(fā)幾十條算少的了 你理順一下程序邏輯,看看你按下去按鍵的時(shí)候if判斷走了多少次 |
加個(gè)消抖延時(shí)就可以了
|
Powered by 單片機(jī)教程網(wǎng)