![]() |
發(fā)布時間: 2019-2-12 02:37
正文摘要:本帖最后由 izhonguo 于 2019-3-7 00:59 編輯 各位大神新年好,想請教一個簡單的程序如何寫。想利用51單片機的P00和P01兩個串口輸出一個16位的數(shù)組【0 0 0 1 1 1 0 0 ****】等數(shù)據(jù),然后利用LS164這個芯片實現(xiàn)并 ... |
本帖最后由 wulin 于 2019-3-14 13:17 編輯 izhonguo 發(fā)表于 2019-3-13 21:40 izhonguo你好,很贊賞你勤于思考。給你的示例只是我隨手寫的,簡單展示了自定義通訊協(xié)議的框架。實際運用的自定義通訊協(xié)議要比這復(fù)雜些。由于使用環(huán)境因素,數(shù)據(jù)頭往往由好幾個字節(jié)組成,甚至在數(shù)據(jù)頭前加0x00無效數(shù)據(jù)引導(dǎo)以防數(shù)據(jù)頭錯碼。驗證有效數(shù)據(jù)的正確性是非常重要的措施。方法也很多,有用數(shù)據(jù)和、數(shù)據(jù)和取反+1、計算字節(jié)長度等等。目的都是為了保證有效數(shù)據(jù)的正確性。由于傳輸?shù)臄?shù)據(jù)幀包含的字節(jié)可能不確定,還要增加結(jié)束碼等等。串口中斷函數(shù)中還要有自動紀錄字節(jié)長度,超時不等侯措施。 |
wulin 發(fā)表于 2019-3-7 15:54 多謝總工!我再仔細學(xué)習(xí)一遍。。。 總工牛逼! ![]() ![]() ![]() |
izhonguo 發(fā)表于 2019-3-7 00:53 給你改了一下,已經(jīng)實物驗證,供參考。 ![]()
|
wulin 發(fā)表于 2019-2-14 08:48 總工,您好: 我自己學(xué)習(xí)了一下51單片機的串口接收程序,我想把您這個程序改進一下, 做到可以接收比如說從XCOM這類軟件發(fā)來的八個字符串(比如說1A2B3C4D), 然后寫入到dis_buf[8]定義的這個定義的緩存數(shù)組中。下面這樣子寫正確嗎?還望不吝賜教!謝謝!
|
izhonguo 發(fā)表于 2019-2-21 08:31 不用謝!51單片機的P0口驅(qū)動LED、通過三極管驅(qū)動繼電器,讀開關(guān)狀態(tài)之類的低速應(yīng)用問題不大,高速讀寫的情況下就要注意了,比如I2C、SPI接口等等 |
kmsj 發(fā)表于 2019-2-20 16:01 多謝經(jīng)驗分享,剛接觸單片機,還需要多向各位大牛勤快請教。 ![]() |
標題與內(nèi)容描述不符,內(nèi)容描述與程序不符,程序中數(shù)據(jù)類型定義與實際需要不符,最終全體不服! |
先不談程序,51單片機的P0口是個非常扯淡的口,我的仿真器的仿真頭排線在左邊,插到目標板上P1和P3口就擋住了,P1和P3口用起來就不太方便,P0和P2口沒有被擋住,P0口在左上角,接線最方便,所以我經(jīng)常用P0口仿真,直到有一次仿真74HC165,簡簡單單的移位程序,怎么都無法成功,搞的我焦頭爛額,后來用AVR單片機仿真,一次就成功。突發(fā)奇想,用51單片機的P2口仿真74HC165,也是一次成功。要知道,51單片機的P0口仿真CD4094、CD4014、CD4021都能成功,就是74HC165不能成功,我編了一些方波程序看P0口和其它口的差別,發(fā)現(xiàn)P0口下拉能力弱,速度也很慢,要想用P0口仿真74HC165成功,最簡單的方法就是降低速度,但是,如果使用和研究51單片機,少用和慎用P0口是少走彎路的重要方法的之一。 |
參與人數(shù) 1 | 黑幣 +70 | 收起 理由 |
---|---|---|
![]() | + 70 | 回帖助人的獎勵! |
樓主:設(shè)計不是想的那么簡單,實現(xiàn)相同的功能,選用什么樣的器件,很重要。 慢慢體會! |
wulin 發(fā)表于 2019-2-14 08:48 太感謝大神了!看的小弟我熱淚盈眶 |
izhonguo 發(fā)表于 2019-2-13 17:29 你的上述疑問是真實存在的,如果改用74HC595連級輸出可以解決你的上述疑問。給你一個示例程序和仿真。 ![]() #include <reg51.H> #define uint unsigned int #define uchar unsigned char sbit P_HC595_SER = P0^0; sbit P_HC595_SRCLK = P0^1; sbit P_HC595_RCLK = P0^2; /*******************定義8個字節(jié)64 bit緩存數(shù)組*************************/ uchar data dis_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};// /**************** 向HC595發(fā)送一個字節(jié)函數(shù) ******************/ void Send_595(uchar dat) { uchar i; for(i=0;i<8;i++) { dat <<= 1; P_HC595_SER = CY; //溢出位賦值數(shù)據(jù)輸出端 P_HC595_SRCLK = 1; //移位時鐘 P_HC595_SRCLK = 0; } } /**************** 向HC595發(fā)送八個字節(jié)函數(shù) ******************/ void DisplayScan() { uchar j; for(j=0;j<8;j++) { Send_595(dis_buf[j]);//向HC595發(fā)送一個字節(jié) } P_HC595_RCLK = 1;//鎖存輸出數(shù)據(jù) P_HC595_RCLK = 0; } void main() { P_HC595_SRCLK = 0;//初始化移位時鐘端 P_HC595_RCLK = 0;//初始化鎖存輸出端 DisplayScan(); //發(fā)送八個字節(jié) while(1); } |
izhonguo 發(fā)表于 2019-2-13 15:36 建議改用74HC595連級輸出。ST_CP(12腳):上升沿時移位寄存器的數(shù)據(jù)進入數(shù)據(jù)存儲寄存器,下降沿時存儲寄存器數(shù)據(jù)不變。通常將ST_CP置為低電平,這樣在移位過程中各輸出端狀態(tài)保持不變,當移位結(jié)束后,在ST_CP端產(chǎn)生一個正脈沖(5V時,大于幾十納秒就行了。通常都選微秒級),更新輸出數(shù)據(jù)。 |
yaoji123 發(fā)表于 2019-2-13 07:39 您好,請問P0的上拉電阻如何接線?是和51單片機的最小系統(tǒng)里的上拉電阻一樣接法就可以嗎?直接插一個10KΩ的電阻接地就可以嗎?謝謝! |
AT89C52的P0口在用時要加上拉電阻,否則電平不對 |
標題與內(nèi)容描述不符,內(nèi)容描述與程序不符,程序中數(shù)據(jù)類型定義與實際需要不符,看不明白樓主最終目的是什么。 |
Powered by 單片機教程網(wǎng)