欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 如何把一個固定的值,用單片機IO口發送出來.具體請看帖子內容 [打印本頁]

作者: xqleft    時間: 2020-8-19 19:26
標題: 如何把一個固定的值,用單片機IO口發送出來.具體請看帖子內容
  如題, 比如我把789這個數值. 通過IO口一高低電平的方式發送出來. 然后我用邏輯分析儀來抓波形, 通過波形的高低,來確定這個數值是不是我想要的數值, 中斷定時200US.如果有愿意幫主的老哥, 您給我一個模塊就可以了
作者: csmyldl    時間: 2020-8-19 22:29
可以借鑒紅外編碼方法,直接發出來似乎不可能,因為二進制位數太多
作者: dalaoshi    時間: 2020-8-20 03:00
先寫一個串口副程式,把要看的數值往串口送,打開下載ISP軟件的“串口助手”,把“下載后自動打開串口”打勾,就可以看到你要的數值了。
作者: wulin    時間: 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;    //觀察標記
  6. sbit SER = P2^1;    //數據輸出

  7. /**功能:串行發送兩個字節的數據**/
  8. void Serial(uint Data)
  9. {
  10.         uchar i;   
  11.         sign= 1;
  12.         for(i=0;i<16;i++)//由高位到低位發送16位數據
  13.         {
  14.                 Data<<=1;      
  15.                 SER = CY;                //溢出位賦值數據輸出端
  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;                //初始化數據輸入端
  31.         sign= 0;                //起始標記
  32.         while(1)                //循環周期200us
  33.         {
  34.                 Serial(num);
  35.         }
  36. }
復制代碼




作者: wulin    時間: 2020-8-20 07:21
說明:程序是按晶振頻率12MHz編寫
作者: TTQ001    時間: 2020-8-20 07:43
如果十進制數可以用8位二進制數表示,則首先將十進制數轉換為二進制數,然后將二進制數發送到IO端口,例如P1.0-P1.7,每一位都有其 相應的IO引腳。 最后,在將二進制數發送給端口后,讀取端口并將其與已知的十進制數進行比較。
作者: xqleft    時間: 2020-8-20 08:46
csmyldl 發表于 2020-8-19 22:29
可以借鑒紅外編碼方法,直接發出來似乎不可能,因為二進制位數太多

最好的方法是紅外的,但是不知道怎么把十進制的轉化為二進制,比如789的二進制是1100010101.我直接在IO口輸出高低就行了. 因為我要用邏輯分析儀抓波形出來, 我要根據波形的高低來轉換成十進制,高低相對應的就是二進制的1和0
作者: Y_G_G    時間: 2020-8-20 09:17
數值在單片機內部就是以二進制形式保存的,不用轉換
如果你要通過一個IO發送出去,那就像寫入24C01那種樣子發送出去就可以了呀
延時可以適當的延長,一秒延時就能肉眼看到發送的是什么了
但最好是再用另外一個端口來提示時鐘
作者: xqleft    時間: 2020-8-20 10:55
wulin 發表于 2020-8-20 07:17

感謝老哥的解答, 但是我有點看不懂.SER=CY;  這是什么意思? 是把CY的這個二進制的1和0通過SER這個IO口輸出來了么?還有就是前面的Data<<=1;這條指令是不是就是相當于一個十進制的數據,被轉換成了二進制,只是系統自己去轉換去了, 是這意思么?  
作者: xqleft    時間: 2020-8-20 11:05
感覺各位大佬的回復,感謝 . 我最開始沒有表述清楚是我的錯誤, 我現在再詳細的說一下我的需求, 我的IC 是八腳的,都被用完了.我采集出來的AD在線看不了,那么我想通過模擬紅外波形的方式通過IO口把這個AD值比如789這個AD值,他的二進制是1100010101.通過IO口發送1100010101.這樣的波形出來. 那么我通過邏輯分析儀,來接收,分析波形,根據波形的高低排列再轉換成789這個十進制的數值. 定時是200US ,比如最高位為1,那么中斷到了以后我就IO口輸出1,下一個中斷來的時候,我還是輸出1,反之如果是0我就輸出0  .這樣能行得通么?
作者: XTXB    時間: 2020-8-20 12:06
xqleft 發表于 2020-8-20 11:05
感覺各位大佬的回復,感謝 . 我最開始沒有表述清楚是我的錯誤, 我現在再詳細的說一下我的需求, 我的IC 是八 ...

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


  1. ////測試工作頻率為11.0592MHz
  2. #include "stc15.h"
  3. sbit TXD1 = P3 ^ 1; // 定義模擬串口發送腳
  4. void delay104us(void); //軟件延時STC15W  11.0592M
  5. void Tx1Send(unsigned char dat); //9600,N,8,1                發送一個字節
  6. unsigned char HEX2ASCII(unsigned char dat); //十六進制轉ASCII函數
  7. void Uart_Service(void);
  8. void PrintHex(unsigned char hex); // 發送一hex
  9. void PrintString(unsigned char code * puts); // 發送一串字符串
  10. //
  11. void delay104us(void) {  //(軟件延時STC15W  11.0592M  i=1,j=2,k=140)
  12.         unsigned char i,j,k;
  13.         for (i = 1; i > 0; i--) // 注意后面沒分號(   6M     i=1,j=3,k=49)
  14.                 for (j = 2; j > 0; j--) // 注意后面沒分號(11.0592M  i=1,j=2,k=140)
  15.                         for (k = 140; k > 0; k--); // 注意后面有分號(22.1184M  i=1,j=3,        k=189)
  16. }
  17. //
  18. //模擬串口發送
  19. void Tx1Send(unsigned char dat) //9600,N,8,1                發送一個字節
  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. // 發送hex,如果8位,則0xXX,16位,0xXXXX
  40. void PrintHex(u16 hex)
  41. {
  42.         PrintString("0x");
  43.         if(hex>0xff)
  44.         {
  45.                 Tx1Send(HEX2ASCII(hex>> 12)); // 用戶碼高字節的低半字節
  46.                 Tx1Send(HEX2ASCII(hex>> 8)); // 用戶碼高字節的低半字節
  47.         }
  48.         Tx1Send(HEX2ASCII(hex >> 4)); // 用戶碼高字節的低半字節
  49.         Tx1Send(HEX2ASCII(hex)); // 用戶碼高字節的低半字節
  50. }
  51. //十六進制轉ASCII函數
  52. unsigned char HEX2ASCII(unsigned char dat) {
  53.         dat &= 0x0f;
  54.         if (dat <= 9)
  55.                 return (dat + '0'); //數字0~9
  56.         return (dat - 10 + 'A'); //字母A~F
  57. }
  58. //
  59. // 發送一串字符串
  60. void PrintString(unsigned char code * puts)
  61. {
  62.         for (;  * puts != 0; puts++)
  63.                 Tx1Send( * puts); // 遇到停止符0結束
  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. ///
復制代碼




作者: xqleft    時間: 2020-8-20 15:34
XTXB 發表于 2020-8-20 12:06
用模擬串口,可以在任意端口輸出數據,串口助手顯示數據:

謝謝大佬的指點. 我先研究一下
作者: 黃youhui    時間: 2020-8-20 15:52
ASCII碼了了解下
作者: Sawardeakar    時間: 2020-8-20 16:59
過于天真,串口有發射與接收協議,你就想用邏輯分析儀的波形看去你的值,那別人的代碼讓你這樣一看都得破解了!
作者: 黃youhui    時間: 2020-8-22 08:40
xqleft 發表于 2020-8-20 11:05
感覺各位大佬的回復,感謝 . 我最開始沒有表述清楚是我的錯誤, 我現在再詳細的說一下我的需求, 我的IC 是八 ...

不能,應為ADC是專門的外設,他的信號轉換時間是固定的,很快的,你IO口手動切換,再快也不肯能和他一致




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1