找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2547|回复: 1
收起左侧

51单片机定时器输出三路PWM,实现三基色合成演示装置的源码

[复制链接]
ID:249785 发表于 2017-11-15 19:00 | 显示全部楼层 |阅读模式
51单片机用自带定时器输出三路PWM的资料分享,很实用的资料,用来实现三基色合成演示装置

下面是单片机源程序:

  1. /**************************************************************
  2. **********************三基色合成演示装置***********************
  3. *************************淮阴师范学院**************************
  4. 功能说明:通过按键调节三个灯的亮度,并在串口屏上面精确的调节亮度
  5. 并把当前的亮度反馈在串口屏上面显示
  6. ***************************************************************
  7. **************************************************************/
  8. #include <reg52.h>
  9. #define uchar  unsigned char
  10. #define uint   unsigned int
  11.         
  12. sbit PWMred   = P1^5;
  13. sbit PWMblu   = P1^6;
  14. sbit PWMgre   = P1^7;
  15. sbit KeyRup   = P2^2;
  16. sbit KeyRdown = P2^1;
  17. sbit KeyBup   = P2^5;
  18. sbit KeyBdown = P2^7;
  19. sbit KeyGup   = P2^3;
  20. sbit KeyGdown = P2^6;
  21. sbit KeyAll   = P2^0;
  22. sbit KeyNull  = P2^4;

  23. sbit LED1 = P0^0;//
  24. sbit LED2 = P0^1;//
  25. sbit LED3 = P0^7;
  26. sbit LED4 = P0^5;
  27. sbit LED5 = P0^3;
  28. sbit LED6 = P0^4;
  29. sbit LED7 = P0^6;
  30. sbit LED8 = P0^2;
  31. sbit LED9 = P1^0;
  32. unsigned char timerR=0,   timerG=0,   timerB=0;   
  33. unsigned char timerNumG=0,timerNumB=0,timerNumR=0,timerNumA=0,timerNumN=0;

  34. uchar rec_data[5];
  35. uchar rec_num=0;  
  36. uchar recdata,j=0;
  37. uchar dat[13]={' ',' ','.','v','a','l','=',' ',' ',' ',0XFF,0XFF,0XFF};

  38. void system_Ini()
  39. {
  40.         IP=0x10;
  41.   TMOD|= 0x01;
  42.         TH0 = 0xFF; //11.0592
  43.         TL0 = 0xCE;
  44.         TR0  = 1;
  45.         ET0=1;
  46. //IE =0x8A;        
  47. }
  48. void delay(unsigned char ms)
  49. {
  50.         unsigned char i;
  51.         while(ms--)
  52.         {
  53.         for(i = 0; i < 120; i++);
  54.         }
  55. }

  56. void senddata(uchar dat)
  57. {   
  58.            ES = 0;    //允许串口中断
  59.      SBUF =dat;
  60.      while(!TI);
  61.      TI = 0;
  62.            ES = 1;    //允许串口中断
  63. }   


  64. main()
  65. {
  66.     system_Ini();

  67.     //串口初始化        
  68.           SCON=0x50;           //设定串口工作方式
  69.     PCON=0x00;           //波特率不倍增
  70.                         
  71.     TMOD=0x21;           //定时器1工作于8位自动重载模式, 用于产生波特率
  72.     EA=1;
  73.     ES = 1;              //允许串口中断
  74.     TL1=0xfd;
  75.     TH1=0xfd;             //波特率9600
  76.     TR1=1;
  77.   while(1)                 
  78.   {
  79.                
  80. //*******************红灯变亮*******************
  81.                 if(KeyRup==0)
  82.                 {               
  83.                         delay(8);
  84.                         if(KeyRup==0)
  85.                         {
  86.                                 while(!KeyRup==1)
  87.                                 {
  88.                                         timerNumR++;
  89.                                         dat[0]='h';
  90.                                         dat[1]=48;
  91.                       dat[7]=timerNumR/100+48;
  92.                       dat[8]=timerNumR%100/10+48;
  93.                       dat[9]=timerNumR%100%10+48;               
  94.                                         for(j=0;j<13;j++)
  95.                             {
  96.                                   senddata(dat[j]);
  97.                             }               
  98.                                        
  99.                                         dat[0]='n';
  100.                                         dat[7]=(timerNumR*100/255)/100+48;
  101.                                         dat[8]=(timerNumR*100/255)%100/10+48;
  102.                                         dat[9]=(timerNumR*100/255)%100%10+48;
  103.                                         for(j=0;j<13;j++)
  104.                             {
  105.                                   senddata(dat[j]);
  106.                             }               
  107.                                        
  108.                                         if(timerNumR>=255)
  109.                                         {
  110.                                                 timerNumR=254;
  111.                                         }        
  112.                                         delay(5);        
  113.                                 }        
  114.                         
  115.                         }        
  116.         
  117.                 }
  118. //*******************红灯变暗*******************        
  119.                 if(KeyRdown==0)
  120.                 {               
  121.                         delay(8);
  122.                         if(KeyRdown==0)
  123.                         {
  124.                                 
  125.                                 while(!KeyRdown==1)
  126.                                 {
  127.                                         timerNumR--;
  128.                                         dat[0]='h';
  129.                                         dat[1]=48;
  130.                       dat[7]=timerNumR/100+48;
  131.                       dat[8]=timerNumR%100/10+48;
  132.                       dat[9]=timerNumR%100%10+48;               
  133.                                         for(j=0;j<13;j++)
  134.                             {
  135.                                   senddata(dat[j]);
  136.                             }               
  137.                                        
  138.                                         dat[0]='n';
  139.                                         dat[7]=(timerNumR*100/255)/100+48;
  140.                                         dat[8]=(timerNumR*100/255)%100/10+48;
  141.                                         dat[9]=(timerNumR*100/255)%100%10+48;
  142.                                         for(j=0;j<13;j++)
  143.                             {
  144.                                   senddata(dat[j]);
  145.                             }                                       
  146.                         
  147.                                 if(timerNumR<=0)
  148.                                 {
  149.                                         timerNumR=1;
  150.                                 }
  151.                                         delay(5);               
  152.                           }                                
  153.                  }

  154.         }                        
  155. //*******************绿灯变亮*******************
  156.                 if(KeyGup==0)
  157.                 {               
  158.                         delay(8);
  159.                         if(KeyGup==0)
  160.                         {
  161.                                 while(!KeyGup==1)
  162.                                 {
  163.                                         timerNumG++;        
  164.                                         dat[0]='h';
  165.                                         dat[1]=49;
  166.                       dat[7]=timerNumG/100+48;
  167.                       dat[8]=timerNumG%100/10+48;
  168.                       dat[9]=timerNumG%100%10+48;               
  169.                                         for(j=0;j<13;j++)
  170.                             {
  171.                                   senddata(dat[j]);
  172.                             }               
  173.                                        
  174.                                         dat[0]='n';
  175.                                         dat[7]=(timerNumG*100/255)/100+48;
  176.                                         dat[8]=(timerNumG*100/255)%100/10+48;
  177.                                         dat[9]=(timerNumG*100/255)%100%10+48;
  178.                                         for(j=0;j<13;j++)
  179.                             {
  180.                                   senddata(dat[j]);
  181.                             }               
  182.                                                                                 
  183.                       if(timerNumG>=255)
  184.                                         {
  185.                                                 timerNumG=254;
  186.                                         }
  187.                                         delay(5);        
  188.                                 }                        
  189.                         }                                
  190.                 }                 
  191. //*******************绿灯变暗********************        
  192.                 if(KeyGdown==0)
  193.                 {               
  194.                         delay(8);
  195.                         if(KeyGdown==0)
  196.                         {
  197.                                 while(!KeyGdown==1)
  198.                                 {
  199.                                         timerNumG--;
  200.                                         dat[0]='h';
  201.                                         dat[1]=49;
  202.                       dat[7]=timerNumG/100+48;
  203.                       dat[8]=timerNumG%100/10+48;
  204.                       dat[9]=timerNumG%100%10+48;               
  205.                                         for(j=0;j<13;j++)
  206.                             {
  207.                                   senddata(dat[j]);
  208.                             }               
  209.                                        
  210.                                         dat[0]='n';
  211.                                         dat[7]=(timerNumG*100/255)/100+48;
  212.                                         dat[8]=(timerNumG*100/255)%100/10+48;
  213.                                         dat[9]=(timerNumG*100/255)%100%10+48;
  214.                                         for(j=0;j<13;j++)
  215.                             {
  216.                                   senddata(dat[j]);
  217.                             }               
  218.                                                                                                                         
  219.                                         if(timerNumG<=0)
  220.                                         {
  221.                                                 timerNumG=1;
  222.                                         }                                       
  223.                                         delay(5);        
  224.                                 }                        
  225.                         }                                
  226.                 }
  227. //*******************蓝灯变亮*******************
  228.                 if(KeyBup==0)
  229.                 {               
  230.                         delay(8);
  231.                         if(KeyBup==0)
  232.                         {
  233.                                 while(!KeyBup==1)
  234.                                 {
  235.                                         timerNumB++;
  236.                                         dat[0]='h';
  237.                                         dat[1]=50;
  238.                       dat[7]=timerNumB/100+48;
  239.                       dat[8]=timerNumB%100/10+48;
  240.                       dat[9]=timerNumB%100%10+48;               
  241.                                         for(j=0;j<13;j++)
  242.                             {
  243.                                   senddata(dat[j]);
  244.                             }               
  245.                                        
  246.                                         dat[0]='n';
  247.                                         dat[7]=(timerNumB*100/255)/100+48;
  248.                                         dat[8]=(timerNumB*100/255)%100/10+48;
  249.                                         dat[9]=(timerNumB*100/255)%100%10+48;
  250.                                         for(j=0;j<13;j++)
  251.                             {
  252.                                   senddata(dat[j]);
  253.                             }               
  254.                                                                                 
  255.                                         if(timerNumB>=255)
  256.                                         {
  257.                                                 timerNumB=254;
  258.                                         }                                       
  259.                                         delay(5);        
  260.                                 }                        
  261.                         }                                
  262.                 }         
  263. //*******************蓝灯变暗*******************        
  264.                 if(KeyBdown==0)
  265.                 {               
  266.                         delay(8);
  267.                         if(KeyBdown==0)
  268.                         {
  269.                                 while(!KeyBdown==1)
  270.                                 {
  271.                                         timerNumB--;
  272.                                         dat[0]='h';
  273.                                         dat[1]=50;
  274.                       dat[7]=timerNumB/100+48;
  275.                       dat[8]=timerNumB%100/10+48;
  276.                       dat[9]=timerNumB%100%10+48;               
  277.                                         for(j=0;j<13;j++)
  278.                             {
  279.                                   senddata(dat[j]);
  280.                             }               
  281.                                        
  282.                                         dat[0]='n';
  283.                                         dat[7]=(timerNumB*100/255)/100+48;
  284.                                         dat[8]=(timerNumB*100/255)%100/10+48;
  285.                                         dat[9]=(timerNumB*100/255)%100%10+48;
  286.                                         for(j=0;j<13;j++)
  287.                             {
  288.                                   senddata(dat[j]);
  289.                             }                                                                                

  290.                                         if(timerNumB<=0)
  291.                                         {
  292.                                                 timerNumB=1;
  293.                                         }                                       
  294.                                         delay(5);        
  295.                                 }                        
  296.                         }                                
  297.                 }
  298. //***********************全亮*********************        
  299.                 if(KeyAll==0)
  300.                 {               
  301.                         delay(8);
  302.                         if(KeyAll==0)
  303.                         {
  304.                                         timerNumR=timerNumB=timerNumG=255;
  305.                                         dat[0]='h';
  306.                                         dat[1]=48;
  307.                       dat[7]=2+48;
  308.                       dat[8]=5+48;
  309.                       dat[9]=5+48;               
  310.                                         for(j=0;j<13;j++)
  311.                             {
  312.                                   senddata(dat[j]);
  313.                             }                                                
  314.                                         dat[0]='n';
  315.                                         dat[7]=1+48;
  316.                                         dat[8]=0+48;
  317.                                         dat[9]=0+48;
  318.                                         for(j=0;j<13;j++)
  319.                             {
  320.                                   senddata(dat[j]);
  321.                             }               
  322.                                        
  323.                                         dat[0]='h';
  324.                                         dat[1]=49;
  325.                       dat[7]=2+48;
  326.                       dat[8]=5+48;
  327.                       dat[9]=5+48;               
  328.                                         for(j=0;j<13;j++)
  329.                             {
  330.                                   senddata(dat[j]);
  331.                             }                                                
  332.                                         dat[0]='n';
  333.                                         dat[7]=1+48;
  334.                                         dat[8]=0+48;
  335.                                         dat[9]=0+48;
  336.                                         for(j=0;j<13;j++)
  337.                             {
  338.                                   senddata(dat[j]);
  339.                             }               
  340.                                        
  341.                                         dat[0]='h';
  342.                                         dat[1]=50;
  343.                       dat[7]=2+48;
  344.                       dat[8]=5+48;
  345.                       dat[9]=5+48;               
  346.                                         for(j=0;j<13;j++)
  347.                             {
  348.                                   senddata(dat[j]);
  349.                             }                                                
  350.                                         dat[0]='n';
  351.                                         dat[7]=1+48;
  352.                                         dat[8]=0+48;
  353.                                         dat[9]=0+48;
  354.                                         for(j=0;j<13;j++)
  355.                             {
  356.                                   senddata(dat[j]);
  357.                             }               
  358.                                                                                                                
  359.                         }                                
  360.                 }
  361. //***********************不亮********************        
  362.                 if(KeyNull==0)
  363.                 {               
  364.                         delay(8);
  365.                         if(KeyNull==0)
  366.                         {
  367.                                         timerNumR=timerNumG=timerNumB=0;
  368.                                         dat[0]='h';
  369.                                         dat[1]=48;
  370.                       dat[7]=0+48;
  371.                       dat[8]=0+48;
  372.                       dat[9]=0+48;               
  373.                                         for(j=0;j<13;j++)
  374.                             {
  375.                                   senddata(dat[j]);
  376.                             }                                                
  377.                                         dat[0]='n';
  378.                                         dat[7]=0+48;
  379.                                         dat[8]=0+48;
  380.                                         dat[9]=0+48;
  381.                                         for(j=0;j<13;j++)
  382.                             {
  383.                                   senddata(dat[j]);
  384.                             }               
  385.                                        
  386.                                         dat[0]='h';
  387.                                         dat[1]=49;
  388.                       dat[7]=0+48;
  389.                       dat[8]=0+48;
  390.                       dat[9]=0+48;               
  391.                                         for(j=0;j<13;j++)
  392.                             {
  393.                                   senddata(dat[j]);
  394.                             }                                                
  395.                                         dat[0]='n';
  396.                                         dat[7]=0+48;
  397.                                         dat[8]=0+48;
  398.                                         dat[9]=0+48;
  399.                                         for(j=0;j<13;j++)
  400.                             {
  401.                                   senddata(dat[j]);
  402.                             }               
  403.                                        
  404.                                         dat[0]='h';
  405.                                         dat[1]=50;
  406.                       dat[7]=0+48;
  407.                       dat[8]=0+48;
  408.                       dat[9]=0+48;               
  409.                                         for(j=0;j<13;j++)
  410.                             {
  411.                                   senddata(dat[j]);
  412.                             }                                                
  413.                                         dat[0]='n';
  414.                                         dat[7]=0+48;
  415.                                         dat[8]=0+48;
  416.                                         dat[9]=0+48;
  417.                                         for(j=0;j<13;j++)
  418.                             {
  419.                                   senddata(dat[j]);
  420.                             }               
  421.                         }                                
  422.                 }                        
  423.    }
  424. }

  425. //定时器0中断处理函数,用于产生PWM

  426. void T1zd(void) interrupt 1  //using 1
  427. {                             
  428.         TH0 = 0xFF;
  429.         TL0 = 0xCE;
  430.         
  431.         timerR++;
  432.         timerG++;
  433.         timerB++;

  434.   if(timerR>=255) timerR=0;
  435.         if(timerR<timerNumR)  PWMred=1;
  436.   else PWMred=0;
  437.         
  438.   if(timerG>=255) timerG=0;
  439.         if(timerG<timerNumG)  PWMgre=1;
  440.   else PWMgre=0;

  441.         if(timerB>=255) timerB=0;
  442.         if(timerB<timerNumB)  PWMblu=1;
  443.   else PWMblu=0;
  444. }

  445. //串口接收数据处理
  446. void deal()
  447. {
  448.           rec_num=0;
  449.            if(rec_data[4]==0x01)
  450.                 {
  451.                          timerNumR=rec_data[0];
  452.                          LED9=0;
  453.                          delay(5);
  454.                 }
  455.                 if(rec_data[4]==0x02)
  456.                 {
  457.                                 timerNumG=rec_data[0];
  458.                 }           
  459.                 if(rec_data[4]==0x03)
  460.                 {
  461.                                 timerNumB=rec_data[0];
  462.                 }
  463.                
  464. }

  465. //串口接收中断,数据包头为0x10,第二个字节为有用的数值,第六个字节为数据标志,最后两个字节为数据结束校验

  466. void  serial() interrupt 4  //using 3
  467. {
  468.   ES = 0;   
  469.   if(RI==1)
  470.   {         
  471.     RI=0;
  472.                 recdata=SBUF;
  473.          if(rec_num==0)
  474.          {   
  475. ……………………

  476. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
三基色合成演示装置程序.zip (45.88 KB, 下载次数: 22)



回复

使用道具 举报

ID:74784 发表于 2017-11-15 22:05 | 显示全部楼层
这个还不错~~~~~~~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表