找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4888|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

如何把一個(gè)固定的值,用單片機(jī)IO口發(fā)送出來(lái).具體請(qǐng)看帖子內(nèi)容

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
  如題, 比如我把789這個(gè)數(shù)值. 通過(guò)IO口一高低電平的方式發(fā)送出來(lái). 然后我用邏輯分析儀來(lái)抓波形, 通過(guò)波形的高低,來(lái)確定這個(gè)數(shù)值是不是我想要的數(shù)值, 中斷定時(shí)200US.如果有愿意幫主的老哥, 您給我一個(gè)模塊就可以了
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:235200 發(fā)表于 2020-8-19 22:29 | 只看該作者
可以借鑒紅外編碼方法,直接發(fā)出來(lái)似乎不可能,因?yàn)槎M(jìn)制位數(shù)太多
回復(fù)

使用道具 舉報(bào)

板凳
ID:283954 發(fā)表于 2020-8-20 03:00 | 只看該作者
先寫(xiě)一個(gè)串口副程式,把要看的數(shù)值往串口送,打開(kāi)下載ISP軟件的“串口助手”,把“下載后自動(dòng)打開(kāi)串口”打勾,就可以看到你要的數(shù)值了。
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2020-8-20 07:17 | 只看該作者

  1. #include <reg51.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned int  uint;

  5. sbit sign= P2^0;    //觀察標(biāo)記
  6. sbit SER = P2^1;    //數(shù)據(jù)輸出

  7. /**功能:串行發(fā)送兩個(gè)字節(jié)的數(shù)據(jù)**/
  8. void Serial(uint Data)
  9. {
  10.         uchar i;   
  11.         sign= 1;
  12.         for(i=0;i<16;i++)//由高位到低位發(fā)送16位數(shù)據(jù)
  13.         {
  14.                 Data<<=1;      
  15.                 SER = CY;                //溢出位賦值數(shù)據(jù)輸出端
  16.         }  
  17.         _nop_();
  18.         _nop_();
  19.         _nop_();
  20.         _nop_();
  21.         _nop_();
  22.         _nop_();
  23.         SER = 0;
  24.         sign= 0;
  25.         _nop_();
  26. }

  27. void main()
  28. {         
  29.         uint num=789;//0000 0011 0001 0101
  30.         SER = 0;                //初始化數(shù)據(jù)輸入端
  31.         sign= 0;                //起始標(biāo)記
  32.         while(1)                //循環(huán)周期200us
  33.         {
  34.                 Serial(num);
  35.         }
  36. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2020-8-20 07:21 | 只看該作者
說(shuō)明:程序是按晶振頻率12MHz編寫(xiě)
回復(fù)

使用道具 舉報(bào)

6#
ID:420836 發(fā)表于 2020-8-20 07:43 | 只看該作者
如果十進(jìn)制數(shù)可以用8位二進(jìn)制數(shù)表示,則首先將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),然后將二進(jìn)制數(shù)發(fā)送到IO端口,例如P1.0-P1.7,每一位都有其 相應(yīng)的IO引腳。 最后,在將二進(jìn)制數(shù)發(fā)送給端口后,讀取端口并將其與已知的十進(jìn)制數(shù)進(jìn)行比較。
回復(fù)

使用道具 舉報(bào)

7#
ID:548551 發(fā)表于 2020-8-20 08:46 | 只看該作者
csmyldl 發(fā)表于 2020-8-19 22:29
可以借鑒紅外編碼方法,直接發(fā)出來(lái)似乎不可能,因?yàn)槎M(jìn)制位數(shù)太多

最好的方法是紅外的,但是不知道怎么把十進(jìn)制的轉(zhuǎn)化為二進(jìn)制,比如789的二進(jìn)制是1100010101.我直接在IO口輸出高低就行了. 因?yàn)槲乙眠壿嫹治鰞x抓波形出來(lái), 我要根據(jù)波形的高低來(lái)轉(zhuǎn)換成十進(jìn)制,高低相對(duì)應(yīng)的就是二進(jìn)制的1和0
回復(fù)

使用道具 舉報(bào)

8#
ID:401564 發(fā)表于 2020-8-20 09:17 | 只看該作者
數(shù)值在單片機(jī)內(nèi)部就是以二進(jìn)制形式保存的,不用轉(zhuǎn)換
如果你要通過(guò)一個(gè)IO發(fā)送出去,那就像寫(xiě)入24C01那種樣子發(fā)送出去就可以了呀
延時(shí)可以適當(dāng)?shù)难娱L(zhǎng),一秒延時(shí)就能肉眼看到發(fā)送的是什么了
但最好是再用另外一個(gè)端口來(lái)提示時(shí)鐘
回復(fù)

使用道具 舉報(bào)

9#
ID:548551 發(fā)表于 2020-8-20 10:55 | 只看該作者

感謝老哥的解答, 但是我有點(diǎn)看不懂.SER=CY;  這是什么意思? 是把CY的這個(gè)二進(jìn)制的1和0通過(guò)SER這個(gè)IO口輸出來(lái)了么?還有就是前面的Data<<=1;這條指令是不是就是相當(dāng)于一個(gè)十進(jìn)制的數(shù)據(jù),被轉(zhuǎn)換成了二進(jìn)制,只是系統(tǒng)自己去轉(zhuǎn)換去了, 是這意思么?  
回復(fù)

使用道具 舉報(bào)

10#
ID:548551 發(fā)表于 2020-8-20 11:05 | 只看該作者
感覺(jué)各位大佬的回復(fù),感謝 . 我最開(kāi)始沒(méi)有表述清楚是我的錯(cuò)誤, 我現(xiàn)在再詳細(xì)的說(shuō)一下我的需求, 我的IC 是八腳的,都被用完了.我采集出來(lái)的AD在線看不了,那么我想通過(guò)模擬紅外波形的方式通過(guò)IO口把這個(gè)AD值比如789這個(gè)AD值,他的二進(jìn)制是1100010101.通過(guò)IO口發(fā)送1100010101.這樣的波形出來(lái). 那么我通過(guò)邏輯分析儀,來(lái)接收,分析波形,根據(jù)波形的高低排列再轉(zhuǎn)換成789這個(gè)十進(jìn)制的數(shù)值. 定時(shí)是200US ,比如最高位為1,那么中斷到了以后我就IO口輸出1,下一個(gè)中斷來(lái)的時(shí)候,我還是輸出1,反之如果是0我就輸出0  .這樣能行得通么?
回復(fù)

使用道具 舉報(bào)

11#
ID:147710 發(fā)表于 2020-8-20 12:06 | 只看該作者
xqleft 發(fā)表于 2020-8-20 11:05
感覺(jué)各位大佬的回復(fù),感謝 . 我最開(kāi)始沒(méi)有表述清楚是我的錯(cuò)誤, 我現(xiàn)在再詳細(xì)的說(shuō)一下我的需求, 我的IC 是八 ...

用模擬串口,可以在任意端口輸出數(shù)據(jù),串口助手顯示數(shù)據(jù):


  1. ////測(cè)試工作頻率為11.0592MHz
  2. #include "stc15.h"
  3. sbit TXD1 = P3 ^ 1; // 定義模擬串口發(fā)送腳
  4. void delay104us(void); //軟件延時(shí)STC15W  11.0592M
  5. void Tx1Send(unsigned char dat); //9600,N,8,1                發(fā)送一個(gè)字節(jié)
  6. unsigned char HEX2ASCII(unsigned char dat); //十六進(jìn)制轉(zhuǎn)ASCII函數(shù)
  7. void Uart_Service(void);
  8. void PrintHex(unsigned char hex); // 發(fā)送一hex
  9. void PrintString(unsigned char code * puts); // 發(fā)送一串字符串
  10. //
  11. void delay104us(void) {  //(軟件延時(shí)STC15W  11.0592M  i=1,j=2,k=140)
  12.         unsigned char i,j,k;
  13.         for (i = 1; i > 0; i--) // 注意后面沒(méi)分號(hào)(   6M     i=1,j=3,k=49)
  14.                 for (j = 2; j > 0; j--) // 注意后面沒(méi)分號(hào)(11.0592M  i=1,j=2,k=140)
  15.                         for (k = 140; k > 0; k--); // 注意后面有分號(hào)(22.1184M  i=1,j=3,        k=189)
  16. }
  17. //
  18. //模擬串口發(fā)送
  19. void Tx1Send(unsigned char dat) //9600,N,8,1                發(fā)送一個(gè)字節(jié)
  20. {
  21.         unsigned char i;
  22.         EA = 0;
  23.         TXD1 = 0;
  24.         delay104us();
  25.         for (i = 0; i < 8; i++) {
  26.                 if (dat & 1)
  27.                         TXD1 = 1;
  28.                 else
  29.                         TXD1 = 0;
  30.                 dat >>= 1;
  31.                 delay104us();
  32.         }
  33.         TXD1 = 1;
  34.         EA = 1;
  35.         delay104us();
  36.         delay104us();
  37. }
  38. //
  39. // 發(fā)送hex,如果8位,則0xXX,16位,0xXXXX
  40. void PrintHex(u16 hex)
  41. {
  42.         PrintString("0x");
  43.         if(hex>0xff)
  44.         {
  45.                 Tx1Send(HEX2ASCII(hex>> 12)); // 用戶碼高字節(jié)的低半字節(jié)
  46.                 Tx1Send(HEX2ASCII(hex>> 8)); // 用戶碼高字節(jié)的低半字節(jié)
  47.         }
  48.         Tx1Send(HEX2ASCII(hex >> 4)); // 用戶碼高字節(jié)的低半字節(jié)
  49.         Tx1Send(HEX2ASCII(hex)); // 用戶碼高字節(jié)的低半字節(jié)
  50. }
  51. //十六進(jìn)制轉(zhuǎn)ASCII函數(shù)
  52. unsigned char HEX2ASCII(unsigned char dat) {
  53.         dat &= 0x0f;
  54.         if (dat <= 9)
  55.                 return (dat + '0'); //數(shù)字0~9
  56.         return (dat - 10 + 'A'); //字母A~F
  57. }
  58. //
  59. // 發(fā)送一串字符串
  60. void PrintString(unsigned char code * puts)
  61. {
  62.         for (;  * puts != 0; puts++)
  63.                 Tx1Send( * puts); // 遇到停止符0結(jié)束
  64. }
  65. //


  66. void main()
  67. {
  68.                 u32 i=0;
  69.                 unsigned int ui_number=0x6789;       
  70.                 P3M1=P3M0=0;
  71.                 P1M1=P1M0=0;
  72.     while (1)
  73.                 {
  74.                         i++;
  75.                         if(i>150000)
  76.                         {
  77.                                 i=0;
  78.          PrintHex(ui_number);
  79.                                 P33=!P33;
  80.                                 PrintString(" ");
  81.                         }
  82.                 }
  83. }

  84. ///
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

12#
ID:548551 發(fā)表于 2020-8-20 15:34 | 只看該作者
XTXB 發(fā)表于 2020-8-20 12:06
用模擬串口,可以在任意端口輸出數(shù)據(jù),串口助手顯示數(shù)據(jù):

謝謝大佬的指點(diǎn). 我先研究一下
回復(fù)

使用道具 舉報(bào)

13#
ID:592807 發(fā)表于 2020-8-20 15:52 | 只看該作者
ASCII碼了了解下
回復(fù)

使用道具 舉報(bào)

14#
ID:469932 發(fā)表于 2020-8-20 16:59 | 只看該作者
過(guò)于天真,串口有發(fā)射與接收協(xié)議,你就想用邏輯分析儀的波形看去你的值,那別人的代碼讓你這樣一看都得破解了!
回復(fù)

使用道具 舉報(bào)

15#
ID:592807 發(fā)表于 2020-8-22 08:40 | 只看該作者
xqleft 發(fā)表于 2020-8-20 11:05
感覺(jué)各位大佬的回復(fù),感謝 . 我最開(kāi)始沒(méi)有表述清楚是我的錯(cuò)誤, 我現(xiàn)在再詳細(xì)的說(shuō)一下我的需求, 我的IC 是八 ...

不能,應(yīng)為ADC是專(zhuān)門(mén)的外設(shè),他的信號(hào)轉(zhuǎn)換時(shí)間是固定的,很快的,你IO口手動(dòng)切換,再快也不肯能和他一致
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表