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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機輸出3路PWM,驅動RGB LED源程序

  [復制鏈接]
跳轉到指定樓層
樓主
用單片機中斷處理PWM,控制普通三色LED,輸出七種不同顏色,呼吸變化。不占用程序運行時間。

單片機源程序如下:
  1. #include<reg52.h>

  2. sbit B_LED=P0^0;                //藍燈引腳,高電平時點亮LED
  3. sbit R_LED=P0^1;                //紅燈引腳,高電平時點亮LED
  4. sbit G_LED=P0^2;                //綠燈引腳,高電平時點亮LED

  5. unsigned char R_OUT=0,G_OUT=0,B_OUT=0;                //定義占空比計數變量
  6. unsigned int MAX=80,MIN=1;                                        //定義變色起始級數,范圍最大可以0-255
  7. unsigned char T0RH=0,T0RL=0;                                //定時器中間變量
  8. void configtime0(unsigned int ms);                        //定時器0配置
  9. void configtime1();                                                        //定時器1配置
  10. void ConfigPWM(unsigned char t);                        //PWM占空比處理涵數
  11. main()
  12. {        
  13.     EA=1;
  14.         configtime0(1);
  15.     configtime1();
  16.     while(1);
  17. }

  18. //每調用一次此涵數,PWM占空比加一
  19. void ConfigPWM(unsigned char t)
  20. {
  21.         static unsigned char dir=0;                //定義變亮或變暗方向
  22.         static unsigned char index=0;        //定義變色索引
  23.         static unsigned int time=0;                //中間變量

  24.         switch(index)
  25.         {
  26.                 case 0:            if(dir==0)                //紅色由暗變亮
  27.                                         {
  28.                                                 time+=t;
  29.                                                 R_OUT=time;
  30.                                                 if(time>=MAX)
  31.                                                 {
  32.                                                         dir=1;
  33.                                                 }
  34.                                         }
  35.                                         else                        //紅色由亮變暗
  36.                                         {
  37.                                                 time-=t;
  38.                                                 R_OUT=time;
  39.                                                 if(time<=MIN)
  40.                                                 {
  41.                                                         dir=0;
  42.                                                         time=0;
  43.                                                         index=1;
  44.                                                 }
  45.                                         }
  46.                                         break;
  47.                                        
  48.                 case 1:            if(dir==0)                //黃色由暗變亮
  49.                                         {
  50.                                                 time+=t;
  51.                                                 G_OUT=time/2;
  52.                                                 R_OUT=time;
  53.                                                 if(time>=MAX)
  54.                                                 {
  55.                                                         dir=1;
  56.                                                 }
  57.                                         }
  58.                                         else                        //黃色由亮變暗
  59.                                         {
  60.                                                 time-=t;
  61.                                                 G_OUT=time/2;
  62.                                                 R_OUT=time;
  63.                                                 if(time<=MIN)
  64.                                                 {
  65.                                                         dir=0;
  66.                                                         time=0;
  67.                                                         index=2;
  68.                                                 }
  69.                                         }
  70.                                         break;
  71.                                        
  72.                 case 2:            if(dir==0)                //橙色由暗變亮
  73.                                         {
  74.                                                 time+=t;
  75.                                                 G_OUT=time;
  76.                                                 R_OUT=time;
  77.                                                 if(time>=MAX)
  78.                                                 {
  79.                                                         dir=1;
  80.                                                 }
  81.                                         }
  82.                                         else                        //橙色由亮變暗
  83.                                         {
  84.                                                 time-=t;
  85.                                                 G_OUT=time;
  86.                                                 R_OUT=time;
  87.                                                 if(time<=MIN)
  88.                                                 {
  89.                                                         dir=0;
  90.                                                         time=0;
  91.                                                         index=3;
  92.                                                 }
  93.                                         }
  94.                                         break;
  95.                                        
  96.                 case 3:            if(dir==0)                //綠色由暗變亮
  97.                                         {
  98.                                                 time+=t;
  99.                                                 G_OUT=time;
  100.                                                 if(time>=MAX)
  101.                                                 {
  102.                                                         dir=1;
  103.                                                 }
  104.                                         }
  105.                                         else                        //綠色由亮變暗
  106.                                         {
  107.                                                 time-=t;
  108.                                                 G_OUT=time;
  109.                                                 if(time<=MIN)
  110.                                                 {
  111.                                                         dir=0;
  112.                                                         time=0;
  113.                                                         index=4;
  114.                                                 }
  115.                                         }
  116.                                         break;
  117.                                        
  118.                 case 4:            if(dir==0)                //青色由暗變亮
  119.                                         {
  120.                                                 time+=t;
  121.                                                 G_OUT=time;
  122.                                                 B_OUT=time;
  123.                                                 if(time>=MAX)
  124.                                                 {
  125.                                                         dir=1;
  126.                                                 }
  127.                                         }
  128.                                         else                        //青色由亮變暗
  129.                                         {
  130.                                                 time-=t;
  131.                                                 G_OUT=time;
  132.                                                 B_OUT=time;
  133.                                                 if(time<=MIN)
  134.                                                 {
  135.                                                         dir=0;
  136.                                                         time=0;
  137.                                                         index=5;
  138.                                                 }
  139.                                         }
  140.                                         break;
  141.                                        
  142.                 case 5:            if(dir==0)                //藍色由暗變亮
  143.                                         {
  144.                                                 time+=t;
  145.                                                 B_OUT=time;
  146.                                                 if(time>=MAX)
  147.                                                 {
  148.                                                         dir=1;
  149.                                                 }
  150.                                         }
  151.                                         else                        //藍色由亮變暗
  152.                                         {
  153.                                                 time-=t;
  154.                                                 B_OUT=time;
  155.                                                 if(time<=MIN)
  156.                                                 {
  157.                                                         dir=0;
  158.                                                         time=0;
  159.                                                         index=6;
  160.                                                 }
  161.                                         }
  162.                                         break;
  163.                                        
  164.                 case 6:            if(dir==0)                //紫色由暗變亮
  165.                                         {
  166.                                                 time+=t;
  167.                                                 B_OUT=time;
  168.                                                 R_OUT=time;
  169.                                                 if(time>=MAX)
  170.                                                 {
  171.                                                         dir=1;
  172.                                                 }
  173.                                         }
  174.                                         else                        //紫色由亮變暗
  175.                                         {
  176.                                                 time-=t;
  177.                                                 B_OUT=time;
  178.                                                 R_OUT=time;
  179.                                                 if(time<=MIN)
  180.                                                 {
  181.                                                         dir=0;
  182.                                                         time=0;
  183.                                                         index=7;
  184.                                                 }
  185.                                         }
  186.                                         break;
  187.                                        
  188.                 case 7:            if(dir==0)                //白色由暗變亮
  189.                                         {
  190.                                                 time+=t;
  191.                                                 G_OUT=time;
  192.                                                 B_OUT=time;
  193.                                                 R_OUT=time;
  194.                                                 if(time>=MAX)
  195.                                                 {
  196.                                                         dir=1;
  197.                                                 }
  198.                                         }
  199.                                         else                        //白色由亮變暗
  200.                                         {
  201.                                                 time-=t;
  202.                                                 G_OUT=time;
  203.                                                 B_OUT=time;
  204.                                                 R_OUT=time;
  205.                                                 if(time<=MIN)
  206.                                                 {
  207.                                                         dir=0;
  208.                                                         time=0;
  209.                                                         index=0;
  210.                                                 }
  211.                                         }
  212.                                         break;
  213.         }
  214. }
  215. //定時器1配置
  216. void configtime1()
  217. {
  218.         TH1=0x80;
  219.         TL1=TH1;
  220.         TMOD&=0x0f;
  221.         TMOD|=0x20;
  222.         TR1=1;
  223.         ET1=1;
  224. }
  225. //定時器0配置
  226. void configtime0(unsigned int ms)
  227. {
  228.         unsigned long tmp;
  229.         tmp=11059200/12;
  230.         tmp=tmp*ms/1000;
  231.         tmp=65536-tmp;
  232.         T0RH=(unsigned char)(tmp>>8);
  233.         T0RL=(unsigned char)tmp;
  234.         TH0=T0RH;
  235.         TL0=T0RL;
  236.         TMOD&=0xf0;
  237.         TMOD|=0x01;
  238.         TR0=1;
  239.         ET0=1;
  240. }
  241. //定時器0中斷涵數,每5ms刷新一次占空比
  242. void timer0() interrupt 1
  243. {
  244.         static unsigned int tmr;
  245.         TH0=T0RH;
  246.         TL0=T0RL;
  247.         tmr++;
  248.         if(tmr>=5)
  249.         {
  250.                 tmr=0;
  251.                 ConfigPWM(1);
  252.         }
  253. }
  254. //定時器1中斷涵數,輸出占空比
  255. void timer1() interrupt 3
  256. {
  257.     unsigned char cnt;
  258.         
  259.     for(cnt=0;cnt<MAX;cnt++)
  260.     {
  261.                 if(cnt<R_OUT)
  262.             R_LED=1;        //紅色占空比大于計數值時紅燈亮
  263.         else
  264.                         R_LED=0;        //否則就關閉紅色
  265.                
  266.         if(cnt<G_OUT)               
  267.                         G_LED=1;                //綠色占空比大于計數值時綠燈亮
  268.         else
  269.                         G_LED=0;                //否則就關閉綠色
  270.                
  271.         if(cnt<B_OUT)
  272.                         B_LED=1;                //藍色占空比大于計數值時藍燈亮
  273.         else
  274.                         B_LED=0;                //否則就關閉藍色
  275.     }
  276. }
復制代碼

全部資料51hei下載地址:
PWM_LED.zip (2.9 KB, 下載次數: 129)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:734224 發表于 2020-4-21 11:32 | 只看該作者
如果想用傳感器控制PWM的變化,請問怎么做
回復

使用道具 舉報

板凳
ID:620287 發表于 2020-4-24 00:25 來自手機 | 只看該作者
是共陽的LED嗎
回復

使用道具 舉報

地板
ID:765564 發表于 2020-6-20 10:25 | 只看該作者
大佬 有原理圖嗎
回復

使用道具 舉報

5#
ID:718821 發表于 2020-6-20 11:59 | 只看該作者
不錯,謝謝分享!
回復

使用道具 舉報

6#
ID:230742 發表于 2020-8-12 19:34 | 只看該作者
我感覺怎么是1路PWM呢。好像應該把標題改一下。PWM控制RGB燈。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99热这里有精品 | 中文字幕一区二区在线观看 | 亚洲手机视频在线 | 国产精品视频500部 a久久 | 激情综合五月天 | 国产精品久久久久久吹潮 | 精品久久久久久亚洲精品 | 欧美精品欧美精品系列 | 一区二区三区在线观看免费视频 | 99re视频精品 | 91av在线视频观看 | 一区二区三区高清不卡 | 国产精品久久久久aaaa九色 | 国产一区二区中文字幕 | 成人久久久 | 一区影院 | 欧美日韩国产在线观看 | 久草电影网| 亚洲精品国产成人 | 亚洲一区在线日韩在线深爱 | 久久久久国产一区二区三区 | 91精品国产欧美一区二区成人 | 亚洲免费人成在线视频观看 | 欧美一区二区三区在线看 | 久久久久久久久久久久一区二区 | 超碰在线人人 | 最新av在线网址 | 国产99久久久久 | 国产精品一区二区三区四区 | 欧美中文字幕一区二区三区亚洲 | 成人精品一区二区三区中文字幕 | 国产黄色在线观看 | 亚洲vs天堂 | 成人国产在线观看 | 欧美日韩精品中文字幕 | 欧洲视频一区二区 | 黄色一级毛片免费看 | 日韩91 | 国产精品无码久久久久 | 91pron在线| 亚洲一区 |