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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

stc15W105單片機怎么最快將DI口數(shù)據(jù)賦給DO口?

查看數(shù): 2572 | 評論數(shù): 10 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2022-4-2 16:43

正文摘要:

問題:DI口輸入一組400*24bit的數(shù)據(jù),如何使用單片機實現(xiàn):前40*24bit的數(shù)據(jù)不接收,剩下的數(shù)據(jù)全部轉(zhuǎn)給DO口輸出,并保證輸出數(shù)據(jù)的準確性,不亂碼。輸入數(shù)據(jù)0碼高電平時間為300ns左右。 已嘗試方法: 使用單 ...

回復(fù)

ID:624769 發(fā)表于 2022-4-13 21:03
以夢為舟 發(fā)表于 2022-4-12 16:42
其實就是想用單片機實現(xiàn)上圖表現(xiàn)的效果,不一定要用STC的,當然了,越便宜越好。

所以, 你既然 確定了, CLK_DIV |= 0x10 的中繼輸出 可以滿足你的輸出需要,(如果輸出高電平的驅(qū)動力不夠,開推挽輸出)

你現(xiàn)在唯一需要的就是: 理清楚,前面放棄數(shù)據(jù)的“過濾條件”, 達到這個條件后, 打開 中繼輸出 通道,然后達到什么條件以后 再次關(guān)閉中繼輸出, 就是那么簡單的一個工作而已。
ID:887371 發(fā)表于 2022-4-13 14:43
你這個需要的mcu要支持雙邊沿觸發(fā)中斷,并且時鐘夠快。

現(xiàn)在所有的mcu都能做到。
引腳變化中斷了解下。
ID:887371 發(fā)表于 2022-4-13 14:32
以夢為舟 發(fā)表于 2022-4-8 17:00
不要求解碼,只要轉(zhuǎn)發(fā)就行。前面代碼有的忘注釋掉了,其實就是想表達直接用 DO=DI行不通,加上計數(shù)之后就 ...

把你的代碼改了下,應(yīng)該能做到前20*24bit不接收。
  1. #include <IAP15F105W.h>
  2. bit flag;
  3. unsigned int count = 480;//外部中斷4計數(shù)值

  4. void timer0Init(void) // 300微秒@33.1776MHz
  5. {
  6.         AUXR &= 0x7F; //定時器時鐘12T模式
  7.         TMOD &= 0xF0; //設(shè)置定時器模式
  8.         // TL0 = 0xC3;          //設(shè)置定時初值
  9.         TH0 = 0xFC;          //設(shè)置定時初值
  10.         TF0 = 0;          //清除TF0標志
  11.         TR0 = 1;          //定時器0開始計時
  12. }
  13. void main(void)
  14. {
  15.         CLK_DIV &= 0xEF;
  16.         EA = 1;
  17.         ET0 = 1;
  18.         INT_CLKO |= 0x40;
  19.         flag = 0;
  20.         while (1)
  21.         {
  22.         }
  23. }
  24. void int4_Routine(void) interrupt 16
  25. {
  26.         if (!flag)
  27.         {
  28.                 if (--count == 0)
  29.                 {
  30.                         flag = 1;
  31.                         CLK_DIV |= 0x10;
  32.                 }
  33.         }
  34.         else
  35.         {
  36.                 // TL0 = 0xC3;
  37.                 TH0 = 0xFC; //計時300us則復(fù)位
  38.         }
  39. }
  40. void Timer0_Routine(void) interrupt 1 //定時器0中斷服務(wù)函數(shù)
  41. {
  42.         // TL0 = 0xC3;
  43.         TH0 = 0xFC; //計時300us則復(fù)位
  44.         flag = 0;
  45.         count = 480;
  46.         CLK_DIV &= 0xEF;
  47. }
復(fù)制代碼
ID:624769 發(fā)表于 2022-4-8 22:07
其實不太確定你的意圖, 你的計數(shù)到底計數(shù)的什么, 如果是 計數(shù)480個下降沿的話,  是不是應(yīng)該這樣?

void int4_Routine(void) interrupt 16
{
         if(++count==480)
       {
                 CLK_DIV  |=  0x10;
       }
       if(++count>=9600)
      {
               count = 0;
               CLK_DIV  &=  0xEF;
      }
}

這只是一個建議, 因為我沒理解你希望的 效果,CLK_DIV 你應(yīng)該理解為一個 開關(guān),在你認為適當?shù)臅r候,打開開關(guān) 讓 P3.1 輸出 P3.0 不需要的時候關(guān)閉。這個開關(guān)只是一個動作,你在某一個中斷中 設(shè)置 開/關(guān) 即可,不需要再while里面反復(fù)去操作這個開關(guān)。你要知道,STC15系列 即便你 頻率定為 35MHz, 1us 可以有35個機器時鐘,處理一個if 判斷 一個雙字節(jié)16位數(shù)字  需要20個時鐘 已經(jīng)超過 0.5us了,所以,按你的需要你必須把不必要的步驟精簡再精簡。
ID:624769 發(fā)表于 2022-4-7 01:00
以夢為舟 發(fā)表于 2022-4-6 15:30
把DI定在p3.0口后發(fā)現(xiàn)輸入數(shù)據(jù)的電平被拉低且會使數(shù)據(jù)碼混亂,導(dǎo)致整體不受控,這是什么原因....

設(shè)置 CLK_DIV |= 0x10;  之后,
P3.1 是 無縫輸出 P3.0 電平的,這個過程類似于中繼功能是不會有任何差錯的(硬件電路問題除外)。檢查一下你的外部電路,比如,下載電路是否有斷開等等。
作為你的問題“怎么最快將DI口數(shù)據(jù)賦給DO口?”  就你這個單片機而言,這個方法應(yīng)該是最快的了,沒有之一。

至于,你說的“輸入數(shù)據(jù)的電平被拉低且會使數(shù)據(jù)碼混亂” 我不太理解, 粗看你貼的代碼, 也沒看出你程序的運行原理,
比如:
1)你 外部中斷設(shè)定的是 下降沿觸發(fā),換句話說只能 DI == 0 的瞬間才觸發(fā),你中斷里卻判斷 DI == 1 還是0。 個人認為這是毫無意義的行為。
2)雖然你寫了定時期中斷, 但是只看到 TR0 = 0 沒看到 TR0 =1, 感覺 count = 0 這個操作,對 外部中斷沒有任何實際作用, 分析不出你貼著兩段代碼的目的。

最后,你解碼必定要有一個接收解析過程吧? 按你說的時序要求,這個解碼,或者解析需要嚴格時間控制的吧? 也沒看你在定時器里面解碼,所以,諸多不解,看你有什么補充說明再說吧。
ID:1015222 發(fā)表于 2022-4-6 15:30
188610329 發(fā)表于 2022-4-4 00:31
把  DI 定在  P3.0  DO定在 P3.1, 通過:
CLK_DIV  |=  0x10;
可以直接在 DO 輸出 DI 的電平,無需中斷, ...

把DI定在p3.0口后發(fā)現(xiàn)輸入數(shù)據(jù)的電平被拉低且會使數(shù)據(jù)碼混亂,導(dǎo)致整體不受控,這是什么原因....
ID:624769 發(fā)表于 2022-4-4 00:31
把  DI 定在  P3.0  DO定在 P3.1, 通過:
CLK_DIV  |=  0x10;
可以直接在 DO 輸出 DI 的電平,無需中斷,無需任何其他代碼,幾乎沒有延時。
至于你之前說的計數(shù),可以通過 外部中斷  EX4  進行計數(shù)
來控制打開DO輸出:CLK_DIV  |=  0x10;  
還是關(guān)閉DO輸出: CLK_DIV  &=  0xEF;
ID:688692 發(fā)表于 2022-4-3 00:09
這個是做WS2812的驅(qū)動的吧。單片機指令周期都一兩百ns了,用程序來處理肯定來不及了。數(shù)據(jù)400個一組也就是1.2kb,先存下來再轉(zhuǎn)發(fā)內(nèi)存也不夠用。不借助外部硬件恐怕是難。你程序直接中轉(zhuǎn)都達到600ns的原因是因為循環(huán)跳轉(zhuǎn)和中斷出入的代碼。單單MOVE bit指令也要3個周期,就算跑到33MHZ也要100ns所以純軟件是不夠的。

其實外部借助兩顆二極管就可以了,做個簡易的與門。收到前期bit后開通這個與門,這樣信號就能通過這個與門向后傳遞。也就沒有速度上的問題了,4148處理1MHz這樣的信號問題還是不大的。

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

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

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