久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM8S003F3P6控制WS2812b時序?qū)Σ簧峡梢詭蛶兔?/span>

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:235359 發(fā)表于 2017-11-4 15:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM8S003F3P6采用內(nèi)部16M晶振。我看市場上面有使用這個單片機采用內(nèi)部晶振進行控制的。不知道為什么我總是控制不到。





一個NOP是68NS 左右  空指令符合規(guī)格書要求Send_Dat = 1; 但是空指令后Send_Dat = 0;時間就變?yōu)?.2US了
同樣的單片機 我不知道別人怎么做到Send_Dat = 1的時候850NS的。有沒有高手指導(dǎo)指導(dǎo)一下。(我i采集過市場上面的他可以做到850NS)




  1. /*    添加包含芯片的頭文件    */
  2. #include<iostm8s103f3.h>
  3. #define nop()  asm("nop");
  4. #define LED             PB_ODR_ODR5  
  5. #define Send_Dat        PC_ODR_ODR7   //數(shù)據(jù)輸出,接pb5腳
  6. #define Number   100
  7. typedef unsigned char uint8;
  8. typedef unsigned int uint16;

  9. //定義全局變量

  10. /*******************************************************************************
  11. **函數(shù)名稱:void Send_8bit(uchar dat)
  12. **功能描述:發(fā)送24個字節(jié)
  13. **入口參數(shù):無
  14. **輸出:無
  15. *******************************************************************************/
  16. void send_24bits(uint8 dat1,uint8 dat2,uint8 dat3)   //WS2811B
  17. {
  18.     uint8 a;
  19.     for(a=0;a<8;a++)
  20.     {
  21.         if(dat1&0x80)       //code"1"
  22.         {
  23.           Send_Dat = 1;
  24.           nop();
  25.           nop();
  26.           nop();
  27.           nop();
  28.           nop();
  29.           Send_Dat = 0;         
  30.         }
  31.         else
  32.          {
  33.           Send_Dat = 1;   //code"0"
  34.           nop();
  35.           nop();
  36.           nop();
  37.           nop();
  38.           nop();
  39.           nop();
  40.           nop();
  41.           nop();
  42.           nop();
  43.           nop();
  44.           nop();
  45.           nop();
  46.           nop();
  47.           nop();

  48.           Send_Dat = 0;

  49.         }
  50.       dat1 = dat1<<1;
  51.     }

  52.      for(a=0;a<8;a++)
  53.     {
  54.         if(dat2&0x80)       //code"1"
  55.         {
  56.           Send_Dat = 0;
  57.           nop();
  58.           nop();
  59.           nop();
  60.           nop();
  61.           nop();
  62.           Send_Dat = 1;
  63.         }
  64.         else
  65.         {
  66.           Send_Dat = 1;   //code"0"
  67.           nop();
  68.           nop();
  69.           nop();
  70.           nop();
  71.           nop();
  72.           nop();
  73.           nop();
  74.           nop();
  75.           nop();
  76.           nop();
  77.           nop();
  78.           nop();
  79.           nop();
  80.           nop();
  81.           Send_Dat = 0;

  82.         }
  83.       dat1 = dat2<<1;
  84.     }

  85.      for(a=0;a<8;a++)
  86.     {
  87.         if(dat3&0x80)       //code"1"
  88.         {
  89.           Send_Dat = 0;
  90.           nop();
  91.           nop();
  92.           nop();
  93.           nop();
  94.           nop();
  95.           Send_Dat = 1;
  96.         }
  97.         else
  98.         {
  99.           Send_Dat = 1;   //code"0"
  100.           nop();
  101.           nop();
  102.           nop();
  103.           nop();
  104.           nop();
  105.           nop();
  106.           nop();
  107.           nop();
  108.           nop();
  109.           nop();
  110.           nop();
  111.           nop();
  112.           nop();
  113.           nop();
  114.           Send_Dat = 0;

  115.         }
  116.       dat1 = dat3<<1;
  117.     }
  118. }
  119. /*******************************************************************************
  120. **函數(shù)名稱:void Delay_us(uint16 x)
  121. **功能描述:延時函數(shù)
  122. **入口參數(shù):無
  123. **輸出:無
  124. *******************************************************************************/
  125. void Delay_us(uint16 x)
  126. {
  127.     uint8 j,k;
  128.     for(j=x;j>0;j--)
  129.       for(k=120;k>0;k--);
  130. }
  131. /*******************************************************************************
  132. **函數(shù)名稱:rest()
  133. **功能描述:復(fù)位函數(shù)
  134. **入口參數(shù):無
  135. **輸出:無
  136. *******************************************************************************/
  137. void rest()                        //復(fù)位
  138. {
  139.    Send_Dat = 0;
  140.    Delay_us(1);
  141. }
  142. /*******************************************************************************
  143. **函數(shù)名稱:void Timer2Init()
  144. **功能描述:定時器2參數(shù)初始化
  145. **入口參數(shù):無
  146. **輸出:無
  147. *******************************************************************************/
  148. void Timer2Init()
  149. {
  150.   TIM2_PSCR = 0x00;   //定時器2預(yù)分頻數(shù)為 1 分頻,即定時器時鐘 = 系統(tǒng)時鐘 = 16MHz
  151.   TIM2_ARRH = 0x3e;   //設(shè)置1毫秒時間自動重載 16000 = 0x3e80
  152.   TIM2_ARRL = 0x80;   //
  153.   TIM2_CNTRH = 0;     //清除計數(shù)寄存器
  154.   TIM2_CNTRL = 0;     //
  155.   TIM2_IER = 0x01;    //使能定時器2允許更新中斷
  156.   TIM2_SR1 = 0x00;    //清除所有的中斷標示
  157.   TIM2_CR1 = 0x81;    //使能計數(shù)器,并允許自動預(yù)裝
  158. }

  159. /*******************************************************************************
  160. **函數(shù)名稱:void LED2Init()
  161. **功能描述:LED2->功能引腳初始化
  162. **入口參數(shù):無
  163. **輸出:無
  164. *******************************************************************************/


  165. void Init_GPIO()
  166. {
  167.     PB_DDR_DDR5 = 1;
  168.     PB_CR1 = 0xff;
  169.     PB_CR2 = 0x00;
  170.     PC_DDR_DDR7 = 1;
  171.     PC_CR1 = 0xff;
  172.     PC_CR2 = 0x00;  
  173. }

  174. void rest_all()
  175. {
  176.     uint16 i;
  177.     for(i=0;i<Number;i++)
  178.               {
  179.           send_24bits(0,0,0);
  180.         }
  181.         rest();
  182. }

  183. void Five_Color_Flow() //5個同色燈珠流水
  184. {
  185.         uint8 i=0,mode_flag=0;
  186.         char a,b=0;
  187.         rest_all();
  188.         while(1)
  189.   {

  190.                 for(i=0;i<Number;i++)
  191.                 {
  192.                  if(a<5)        send_24bits(255,0,0);
  193.                  else if(a<10)        send_24bits(0,255,0);
  194.                  else if(a<15)  send_24bits(0,0,255);  
  195.                  else if(a<20)  send_24bits(255,255,0);
  196.                  else if(a<25)  send_24bits(0,255,255);
  197.                  else if(a<30)  send_24bits(255,255,0);
  198.                  else           send_24bits(255,255,255);
  199.                  a++;
  200.                  if(a>34) a=0;
  201.                 }
  202.                 rest();
  203.                 Delay_us(150);
  204.                 b--;
  205.                 if(b<0) b=34;
  206.         }
  207. }


  208. /*******************************************************************************
  209. **函數(shù)名稱:主函數(shù)
  210. **功能描述:1=55US
  211. **入口參數(shù):無
  212. **輸出:無
  213. *******************************************************************************/
  214. int main(void)
  215. {
  216.   asm("sim");           //先關(guān)閉總中斷
  217.   CLK_CKDIVR = 0x00;    //CPUDIV = 1 HSIDIV = 1  內(nèi)部時鐘 = 16Mhz
  218.   Init_GPIO();          //初始化IO口
  219.   Timer2Init();         //調(diào)用定時器2初始化函數(shù)
  220.   asm("rim");           //打開總中斷


  221.   while(1)             //進入死循環(huán),等待定時器2周期中斷
  222.   {
  223.     send_24bits(255,0,0) ;

  224.   }
  225. }


  226. /*******************************************************************************
  227. **函數(shù)名稱:__interrupt void TIM2_UPDATE_IRQHandler(void)
  228. **功能描述:定時器2重載更新中斷服務(wù)函數(shù)
  229. **入口參數(shù):無
  230. **輸出:無
  231. *******************************************************************************/
  232. #pragma vector = 15     //設(shè)置定時器2重載的中斷向量號 = 15
  233. __interrupt void TIM2_UPDATE_IRQHandler(void)
  234. {
  235.   TIM2_SR1 = 0x00;      //清除中斷標志

  236. /* ms_count++;           //中斷使 ms_count++ 做加法,記錄1毫秒產(chǎn)生的中斷次數(shù)
  237.   if(ms_count >= 1000)  //記錄達到1000毫秒,即1秒
  238.   {
  239.     ms_count = 0;       //復(fù)位記錄中斷次數(shù)
  240.    // PC_ODR ^= 0x80;     //對LED2進行異或取反,使LED2以1秒的周期亮滅
  241.   }
  242. */
  243. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

來自 2#
ID:273896 發(fā)表于 2018-8-24 00:12 | 只看該作者
某種原因 程序暫時無法提供,附一張WS2812B時序圖,供大家參考!

WS2812B.png (104.96 KB, 下載次數(shù): 65)

WS2812B.png

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:235359 發(fā)表于 2017-11-4 15:40 | 只看該作者
希望有人可以幫助我謝謝
回復(fù)

使用道具 舉報

地板
ID:273896 發(fā)表于 2018-3-21 13:55 | 只看該作者
我搞定了!加Q858554712 發(fā)你
回復(fù)

使用道具 舉報

5#
ID:40043 發(fā)表于 2018-4-16 11:29 | 只看該作者
樓上高手指點一下啊!
回復(fù)

使用道具 舉報

6#
ID:397060 發(fā)表于 2019-3-1 11:14 | 只看該作者
樓主   問題解決了嗎,  我前幾天剛好遇見和你一樣的問題   ,求助啊
回復(fù)

使用道具 舉報

7#
ID:633536 發(fā)表于 2019-11-1 22:08 | 只看該作者
我也碰到了這個問題,可能是脈沖時間太短了,單片機無法正常運行到那么多代碼,脈沖時間調(diào)長一點波形會正常但是又不能符合WS2812的時序,很苦惱啊,樓主解決了沒有
回復(fù)

使用道具 舉報

8#
ID:755407 發(fā)表于 2020-8-13 16:09 | 只看該作者
設(shè)置I/O口設(shè)置為高速模式10M
回復(fù)

使用道具 舉報

9#
ID:87063 發(fā)表于 2021-2-3 16:50 | 只看該作者
我也遇到這個問題,如何解決啊? 我就不延遲直接反轉(zhuǎn)引腳單片機執(zhí)行都要1us。。。。。
回復(fù)

使用道具 舉報

10#
ID:87063 發(fā)表于 2021-2-3 16:51 | 只看該作者
有沒有人解決的,說下怎么回事呢?
回復(fù)

使用道具 舉報

11#
ID:87063 發(fā)表于 2021-2-3 18:10 | 只看該作者
我終于解決了,用庫實現(xiàn)不了的,推薦寄存器操作
回復(fù)

使用道具 舉報

12#
ID:411116 發(fā)表于 2021-9-22 20:34 | 只看該作者
按照不同時鐘頻率適當加減_nop_();的數(shù)量調(diào)整時序
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线免费观看成人 | 99热精品在线 | 欧美日韩在线播放 | 免费观看羞羞视频网站 | av在线成人 | 成人天堂 | 在线观看免费av网 | 国产三级电影网站 | 国产乱码精品1区2区3区 | 久久久久无码国产精品一区 | 国产欧美精品区一区二区三区 | 亚洲国产精品日韩av不卡在线 | 亚洲精品电影网在线观看 | 日本h片在线观看 | 做a视频 | 国产aⅴ | 欧美日韩国产一区二区三区 | 亚洲国产成人精品久久 | 亚洲精品一 | 国产成人自拍一区 | 久久精品福利视频 | 亚洲精品免费视频 | 在线观看中文字幕 | 午夜成人在线视频 | 欧美日韩亚洲三区 | 欧美精品二区 | 先锋资源网 | 欧美日韩在线一区 | 男人天堂手机在线视频 | 日韩欧美二区 | 天天草视频 | 一区二区三区成人 | 视频二区| 精品日韩一区二区 | 一区二区三区在线 | 欧美日韩精品久久久免费观看 | 日本精品视频 | av中文字幕在线 | 亚洲国产精品一区二区第一页 | 狠狠色狠狠色综合日日92 | 午夜视频在线免费观看 |