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

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

QQ登錄

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

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

用stc單片機(jī)制作PC流光溢彩 源程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:687694 發(fā)表于 2020-10-19 20:13 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
近日在B站看到許多PC流光溢彩效果,如:https://www.bilibili.com/video/BV1fJ411B7bp?from=search&seid=16736407731500993634還有https://www.bilibili.com/video/BV1MC4y1h7iB?from=search&seid=16736407731500993634
效果是真不錯(cuò),還有許多制作的視頻帖子,但是。。。。。。都是基于arduino制作的,我手頭上只有一塊自制的arduino uno,個(gè)頭有點(diǎn)大,洞洞板上還沒(méi)有usb轉(zhuǎn)串口,有點(diǎn)麻煩。正好上次制作rgb環(huán)形時(shí)鐘的硬件符合條件,板上60顆燈珠,stc主控,帶usb轉(zhuǎn)串口,那么我們就用這個(gè)stc來(lái)做流光溢彩吧。
查了一下網(wǎng)上也沒(méi)有stc的教程,就自己分析了一下運(yùn)行過(guò)程。
首先由PC機(jī)運(yùn)行AmbiBox軟件抓取屏幕點(diǎn),取得rgb顏色數(shù)據(jù)。
然后由串口發(fā)送至單片機(jī)解析。
解析后的數(shù)據(jù)刷新至rgbled顯示。
過(guò)程貌似比較簡(jiǎn)單,但我們得分析其中的協(xié)議。
網(wǎng)查資料得到 Ada模式協(xié)議如下:
前三個(gè)字節(jié)分別是Ada,然后3個(gè)字節(jié)的前2個(gè)是led個(gè)數(shù),最后一個(gè)是校驗(yàn)碼,接著就是對(duì)應(yīng)個(gè)數(shù)的rgb數(shù)據(jù),每個(gè)led3字節(jié),分別對(duì)應(yīng)r,g,b。
有了這個(gè)就簡(jiǎn)單了。構(gòu)建程序流程如下
單片機(jī)主頻33.1776(為了配合串口波特率)
啟動(dòng)程序->初始化串口(定時(shí)器2,波特率115200,)->初始化led數(shù)組 ->檢測(cè)顯示(紅,綠,藍(lán)各顯示一遍)->開(kāi)啟串口接收中斷->主循環(huán)判斷如果不允許中斷則刷新rgbled,刷新完成后開(kāi)啟中斷,如果允許中斷則等待不允許中斷。
中斷函數(shù)中流程->依次判斷接收字符是否對(duì)應(yīng),如果前3個(gè)字節(jié)對(duì)應(yīng)則 接收電燈數(shù)據(jù),并將數(shù)據(jù)保存至數(shù)組中,接收一組數(shù)據(jù)完畢,失能中斷,這樣不會(huì)因中斷接收數(shù)據(jù)影響刷新。
圖我也懶得拍照了,程序上傳上來(lái),大家想做的可以自己畫(huà)個(gè)板子,燒上代碼就行了,至于AmbiBox自行某度即可。

單片機(jī)源程序如下:
  1. #include "stc15.h"
  2. #include "ws2812.h"
  3. uchar xdata rgb[60][3];//led數(shù)組
  4. uchar sendrgb=0;//預(yù)發(fā)送rgb變量
  5. uchar h=0,l=0,o=0;
  6. uchar in=0;
  7. void delayms(int x)
  8. {
  9.         int i,j;
  10.         for(i=0;i<x;i++)
  11.         for(j=0;j<1000;j++);
  12. }

  13. void UartInit(void)                //115200bps@33.1776MHz
  14. {
  15.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  16.         AUXR |= 0x01;                //串口1選擇定時(shí)器2為波特率發(fā)生器
  17.         AUXR |= 0x04;                //定時(shí)器2時(shí)鐘為Fosc,即1T
  18.         T2L = 0xB8;                //設(shè)定定時(shí)初值
  19.         T2H = 0xFF;                //設(shè)定定時(shí)初值
  20.         AUXR |= 0x10;                //啟動(dòng)定時(shí)器2
  21.         ES = 1;              //使能串口1中斷
  22. }
  23. void initrgb(uchar st,uchar sp,uchar rg0,uchar rg1,uchar rg2)//起始位,結(jié)束位,rgb1,2,3(初始化數(shù)組)
  24. {
  25. uchar i,j;
  26.         for(i=st;i<sp;i++)
  27.         {               
  28.                 for(j=0;j<3;j++)
  29.                 {
  30.                         switch(j)
  31.                         {
  32.                                 case 0:
  33.                         rgb[i][j]=rg0;
  34.                                 break;
  35.                                 case 1:
  36.                         rgb[i][j]=rg1;
  37.                                 break;
  38.                                 case 2:
  39.                         rgb[i][j]=rg2;
  40.                                 break;
  41.                         }
  42.                 }
  43.         }       
  44. }

  45. void display()     //刷新rebled輸出函數(shù)
  46. {
  47. uchar i,j,k;
  48.         for(i=0;i<60;i++)
  49.         {
  50.                 for(j=0;j<3;j++)
  51.                 {
  52.                         sendrgb=rgb[i][j];
  53.                         for(k=0;k<8;k++)
  54.                         {
  55.                                 if(sendrgb&0x80)
  56.                                         st1();
  57.                                 else
  58.                                         st0();
  59.                                 sendrgb<<=1;
  60.                         }
  61.                 }
  62.         }
  63.         stop();
  64. }

  65. void main()
  66. {
  67. UartInit();//初始化串口
  68. initrgb(0,60,50,0,0);        //測(cè)試綠
  69. display();
  70. delayms(1000);
  71. initrgb(0,60,0,50,0);        //測(cè)試紅
  72. display();
  73. delayms(1000);
  74. initrgb(0,60,0,0,50);        //測(cè)試藍(lán)
  75. display();
  76. delayms(1000);
  77. initrgb(0,60,0,0,0);        //清屏
  78. display();
  79. delayms(1000);       
  80. EA = 1;   //開(kāi)啟中斷,可接收數(shù)據(jù)
  81.        
  82.         while(1)
  83.                 {
  84.                 if(EA==0)//當(dāng)中斷關(guān)閉,表示一幀數(shù)據(jù)接收完畢
  85.                         {
  86.                                 display();//將當(dāng)前數(shù)據(jù)刷新
  87.                                 EA=1;//開(kāi)啟中斷,接收下一幀數(shù)據(jù)
  88.                         }
  89.                 }       
  90. }

  91. void Uart() interrupt 4   //串口中斷
  92. {
  93.         uchar dat=0;
  94.     if (RI)
  95.     {
  96.                 dat=SBUF;
  97.         RI = 0;                 //清除RI位
  98.         if(dat==0x41&&in==0)
  99.                 {
  100.                         in=1;                                        //判斷數(shù)據(jù)0位(A)
  101.                         SBUF=in;
  102.                         return;
  103.                 }
  104.                 if(dat==0x64&&in==1)                //判斷數(shù)據(jù)1位(d)
  105.                 {
  106.                         in=2;
  107.                         SBUF=in;
  108.                         return;
  109.                 }
  110.                 else if(dat==0x61&&in==2)        //判斷數(shù)據(jù)2位(a)
  111.                 {
  112.                         in=3;
  113.                         SBUF=in;
  114.                         return;
  115.                 }
  116.                 else if(in==3)                                //讀取高位LED個(gè)數(shù)
  117.                 {
  118.                         h=dat;
  119.                         in++;
  120.                         return;
  121.                 }
  122.                 else if(in==4)                                //讀取低位LED個(gè)數(shù)
  123.                 {
  124.                         l=dat;
  125.                         in++;
  126.                         return;
  127.                 }
  128.                 else if(in==5)                                //讀取校驗(yàn)值
  129.                 {
  130.                         o=dat;
  131.                         if(o!=(h^l^0x55)) in=0;                //校驗(yàn)
  132.                         else in++;
  133.                         return;
  134.                 }
  135.                 else if(in>=6)                                //進(jìn)入數(shù)據(jù)讀取階段
  136.                 {
  137.                         rgb[(in-6)/3][(in-6)%3]=dat;//將數(shù)據(jù)寫入數(shù)組
  138.                         if((in-6)/3==l)                                //根據(jù)發(fā)來(lái)的led個(gè)數(shù)確定數(shù)據(jù)是否接收完畢
  139.                         {
  140.                                 in=0;
  141.                                 EA=0;
  142.                                 return;
  143.                         }
  144.                         else in++;
  145.                         return;
  146.                 }
  147.                         else                          //如果in小于6,且中途數(shù)據(jù)中斷。則重新開(kāi)始。
  148.                         {
  149.                                 in=0;
  150.                                 return;
  151.                         }
  152.         }
  153. }
復(fù)制代碼

所有資料51hei提供下載:
流光溢彩.rar (35.49 KB, 下載次數(shù): 38)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:687694 發(fā)表于 2020-10-19 20:21 | 只看該作者
如果大家都想做一個(gè)玩玩,我就再出個(gè)詳細(xì)的教程帖子。畫(huà)好電路圖,PCB。
回復(fù)

使用道具 舉報(bào)

板凳
ID:820198 發(fā)表于 2021-4-12 10:52 | 只看該作者
不錯(cuò)啊,坐等詳細(xì)教程
回復(fù)

使用道具 舉報(bào)

地板
ID:706724 發(fā)表于 2021-4-19 11:38 | 只看該作者
新手請(qǐng)教,程序中好像沒(méi)有把中斷的程序?qū)懗鰜?lái)?IN0=0;EA=1;.......直接實(shí)現(xiàn)用EA=1/0來(lái)實(shí)現(xiàn)總中斷?
回復(fù)

使用道具 舉報(bào)

5#
ID:851858 發(fā)表于 2021-10-12 00:48 | 只看該作者
用89C52單片機(jī)燒上代碼,P1.0接燈帶數(shù)據(jù)端,不亮。
是89C52芯片不行,要stc15芯片? 還是要改代碼的哪里?
換過(guò)Keil軟件的器件為89C52,頭文件試過(guò)stc15w.h和reg52.h。
不太懂望指教。
arduino點(diǎn)亮過(guò)
回復(fù)

使用道具 舉報(bào)

6#
ID:851858 發(fā)表于 2021-10-12 01:00 | 只看該作者
本帖最后由 ddwy43 于 2021-10-12 01:03 編輯

arduino的點(diǎn)亮過(guò),燈帶也就正常了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品熟人一区二区三区四区 | 免费亚洲视频 | 欧美激情视频一区二区三区在线播放 | 欧美视频三级 | 国产亚洲一区二区在线观看 | 麻豆久久久久久久久久 | 九九成人 | 嫩草黄色影院 | 成人午夜免费视频 | 亚洲精品3| 奇米影视在线 | 国产高清视频 | 正在播放国产精品 | 免费欧美| 最近中文字幕在线视频1 | 久久久久久精 | 欧美日韩不卡在线 | 男女午夜激情视频 | 天天操天天操 | 欧美一级毛片在线播放 | 亚洲一区二区三区视频免费观看 | 日韩精品一区二区三区视频播放 | 久久伊人免费视频 | 久久久一二三区 | 午夜a√| 免费成年网站 | av免费网站在线观看 | 欧美日韩视频网站 | 国产欧美精品一区二区三区 | 伊人网站在线观看 | 国产精品成av人在线视午夜片 | 国精产品一区二区三区 | 久热久草 | 色在线看 | 日本aa毛片a级毛片免费观看 | 91久久国产综合久久91精品网站 | 精品国产网 | 久久国产高清视频 | 久久久久久成人 | 国产亚洲高清视频 | 91一区二区三区在线观看 |