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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8136|回復: 11
打印 上一主題 下一主題
收起左側

STM8S003F3P6控制WS2812b時序對不上可以幫幫忙嗎

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





一個NOP是68NS 左右  空指令符合規格書要求Send_Dat = 1; 但是空指令后Send_Dat = 0;時間就變為1.2US了
同樣的單片機 我不知道別人怎么做到Send_Dat = 1的時候850NS的。有沒有高手指導指導一下。(我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   //數據輸出,接pb5腳
  6. #define Number   100
  7. typedef unsigned char uint8;
  8. typedef unsigned int uint16;

  9. //定義全局變量

  10. /*******************************************************************************
  11. **函數名稱:void Send_8bit(uchar dat)
  12. **功能描述:發送24個字節
  13. **入口參數:無
  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. **函數名稱:void Delay_us(uint16 x)
  121. **功能描述:延時函數
  122. **入口參數:無
  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. **函數名稱:rest()
  133. **功能描述:復位函數
  134. **入口參數:無
  135. **輸出:無
  136. *******************************************************************************/
  137. void rest()                        //復位
  138. {
  139.    Send_Dat = 0;
  140.    Delay_us(1);
  141. }
  142. /*******************************************************************************
  143. **函數名稱:void Timer2Init()
  144. **功能描述:定時器2參數初始化
  145. **入口參數:無
  146. **輸出:無
  147. *******************************************************************************/
  148. void Timer2Init()
  149. {
  150.   TIM2_PSCR = 0x00;   //定時器2預分頻數為 1 分頻,即定時器時鐘 = 系統時鐘 = 16MHz
  151.   TIM2_ARRH = 0x3e;   //設置1毫秒時間自動重載 16000 = 0x3e80
  152.   TIM2_ARRL = 0x80;   //
  153.   TIM2_CNTRH = 0;     //清除計數寄存器
  154.   TIM2_CNTRL = 0;     //
  155.   TIM2_IER = 0x01;    //使能定時器2允許更新中斷
  156.   TIM2_SR1 = 0x00;    //清除所有的中斷標示
  157.   TIM2_CR1 = 0x81;    //使能計數器,并允許自動預裝
  158. }

  159. /*******************************************************************************
  160. **函數名稱:void LED2Init()
  161. **功能描述:LED2->功能引腳初始化
  162. **入口參數:無
  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. **函數名稱:主函數
  210. **功能描述:1=55US
  211. **入口參數:無
  212. **輸出:無
  213. *******************************************************************************/
  214. int main(void)
  215. {
  216.   asm("sim");           //先關閉總中斷
  217.   CLK_CKDIVR = 0x00;    //CPUDIV = 1 HSIDIV = 1  內部時鐘 = 16Mhz
  218.   Init_GPIO();          //初始化IO口
  219.   Timer2Init();         //調用定時器2初始化函數
  220.   asm("rim");           //打開總中斷


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

  224.   }
  225. }


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

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

使用道具 舉報

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

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

WS2812B.png

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲日韩中文字幕一区 | 久久久久久久久99 | 91毛片在线看 | 亚洲精品一区二区三区四区高清 | 久久久久一区二区三区四区 | 精品三级在线观看 | 97伦理电影网 | 欧美日韩久久精品 | 中文字幕日本一区二区 | 亚洲每日更新 | 香蕉视频1024 | 久久久久久久久久久久久久av | 天堂久久久久久久 | 午夜三级视频 | 免费在线观看av网址 | aaaa网站 | 欧美成年网站 | 伊人婷婷| 久久高清免费视频 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 国产精品视频免费观看 | 羞羞视频在线观免费观看 | 狠狠操网站 | 日本韩国欧美在线观看 | av特级毛片 | 午夜影院在线观看视频 | 97成人在线| 九热在线| 精品国产一区二区三区观看不卡 | 日韩精品视频一区二区三区 | 国产精品久久av | 亚洲欧洲日本国产 | 人人看人人草 | 欧美专区在线 | 黄色免费在线网址 | 成人在线观看免费爱爱 | 综合激情av | 欧美黄色性生活视频 | 久久精品视频播放 | 天天综合久久网 | 91 中文字幕 |