找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机可控硅调光程序

[复制链接]
ID:242487 发表于 2017-10-24 16:47 | 显示全部楼层 |阅读模式
  1. #include <reg52.H>         
  2. #include "intrins.h"

  3. #define        _50msL_        50000*0.9216
  4. #define        _50msH_        50000*0.9216
  5. #define        _1ms_        922
  6. #define        _10ms_        9216
  7. #define        _50us        46   

  8. #define uchar unsigned char  
  9. #define uint unsigned int
  10. void delaySTD_ms(uchar ms);
  11. unsigned char scankey();


  12. sbit PWM_PIN= P1^0;
  13. sbit PWM_TESTLED= P1^2;

  14. sbit    key1pressed= P1^5;
  15. sbit    key2pressed= P1^6;
  16. sbit    key3pressed= P1^7;


  17. #define LEVEL0 0
  18. #define LEVEL1 1
  19. #define LEVEL2 2
  20. #define LEVEL3 3
  21. #define LEVEL4 4

  22. #define GRADE 10  
  23. #define CELL  (9216/GRADE)     
  24. //#define CELL  10000  //10000us,实际是9216
  25. #define KEYPRESSTIME  7  //10ms,key bound delay time

  26. int iShiftPoint;
  27. int b; //b一定要有符号整型!
  28. uint timemultiplex;
  29. uint timemultiplex_maxvalue;
  30. //------------------------------------------
  31. void main()
  32. {
  33.         PWM_PIN = 0;
  34. timemultiplex_maxvalue=3;
  35. timemultiplex=1;        
  36.         //外部过零中断
  37.         IT0 = 1; //1为边沿触发
  38.         EX0 = 1;
  39.         //开启定时中断
  40.         TMOD = 0x01;                 //T0定时方式1
  41.     b =8;//初亮度调整
  42.         iShiftPoint=b;
  43.         TH0 = (65536-CELL*iShiftPoint) / 256;   //历史:50ms@12MHz,这里定时没意义,通过外中断过零定时
  44.         TL0 = (65536-CELL*iShiftPoint) % 256;
  45.         ET0 = 1;
  46.         TR0 = 1;//TR0 = 1;定时只是为了计算延时时长!10ms即10000us,分成10种时长,由t1产生这10种时长
  47. //定时器1初始化:
  48.         TMOD |= 0x10;                 //T1定时方式1
  49.         TH1 = (65536-_50us) / 256;   
  50.         TL1 = (65536-_50us) % 256;
  51.         ET1 = 1;
  52.         TR1 = 1;//TR0 = 1;定时只是为了计算延时时长!10ms即10000us,分成10种时长,由t1产生这10种时长

  53.         EA = 1;


  54. //调光级别从0到4共5级别 能调光级别811~910
  55. #define MAXAA 998
  56. #define MINAA 11
  57.          while(1)
  58.                 {
  59.                         unsigned char buf;

  60. //以下为自动化按键测试
  61.                         b =MINAA;
  62.                         if (b>MAXAA)
  63.                         {
  64.                 //        delaySTD_ms(500);
  65.                 //        delaySTD_ms(500);                        
  66.                 //        delaySTD_ms(500);
  67.                 //        delaySTD_ms(500);
  68.                 //                b=MINAA;
  69.                         PWM_PIN=0;
  70.                         EA=0;
  71.                         }
  72.                         if (b<MINAA)
  73.                                  b=MINAA;
  74.                         b+=30;
  75.                         delaySTD_ms(500);
  76.                         continue;
  77. //以上为自动化按键测试                        

  78.        //  while(1)
  79.         //        {
  80.         //                unsigned char buf;
  81.                         buf=scankey();
  82.                          if(buf==1)  //调灭
  83.                                 {
  84.                                         b++;
  85.                                 }
  86.                          if(buf==2)
  87.                                 {//二键调亮。b--是亮,765,从灭到月牙到亮
  88.                                         b--;
  89.                                 }
  90.                          if(buf==3)
  91.                                 {//3键盘关闭继电器,同时也得关PWM灯才得灭;再按一次3键,则全亮
  92.                                         PWM_PIN=!PWM_PIN;
  93.                                 }
  94.                         if (b>(GRADE-1)) b=LEVEL4;//仍然最亮   //历史:在这里调整周期.不能无限增加
  95.                         if (b<0)           b=LEVEL0;//必须设置为>20,<1,不能设置为>19,<0,否则最后亮了就熄灭一下
  96.                         iShiftPoint=b;
  97.                         //other while
  98. /*
  99.                         delaySTD_ms(500);
  100.                         delaySTD_ms(500);                        
  101.                         delaySTD_ms(500);
  102.                         delaySTD_ms(500);
  103.                         timemultiplex_maxvalue++;
  104.                         if (timemultiplex_maxvalue>40) timemultiplex_maxvalue=40;
  105. */
  106.                 }
  107. }

  108. //------------------------------------------

  109. void X0_INT(void) interrupt 0
  110. {
  111. //过零检测,来个中断就表过零了,过零时才能重新基准一次10ms。

  112.      //   EA = 0;
  113.         TR0=0;
  114.         //        PWM_PIN = 0;        
  115.                 TH0 = (65536-CELL*iShiftPoint) / 256;   //1000ms@12MHz,这里定时没意义,只是个时间流逝。通过外中断过零定时
  116.                 TL0 = (65536-CELL*iShiftPoint) % 256;   
  117.         TR0=1;
  118.           //        EA = 1;
  119. }

  120. void time0(void) interrupt 1
  121. {

  122. /*
  123.         TR0 = 0;
  124.         TH0 = (65536-CELL*iShiftPoint) / 256;   //历史:50ms@12MHz,这里定时没意义,通过外中断过零定时
  125.         TL0 = (65536-CELL*iShiftPoint) % 256;
  126.         TR0 = 1;
  127. */
  128.         int i;
  129.         // 1次外部中断产生,其灭会等待CELL*iShiftPoint us之后就开pwm,直至下次过零点关掉 ;CELL*iShiftPoint us由定时器来计算
  130.         PWM_PIN = 1;      

  131. /*
  132. //随便两语句延时
  133. for (i=0;i<100;i++)
  134. {
  135.                            _nop_();
  136.                         _nop_();
  137.                         _nop_();
  138. }
  139. */

  140.         TR1 = 0;
  141.         TH1 = (65536-_50us) / 256;   //历史:50ms@12MHz,这里定时没意义,通过外中断过零定时
  142.         TL1 = (65536-_50us) % 256;
  143.         TR1 = 1;
  144.                 //关要!
  145. //                PWM_PIN = 0;//亮个4us关,效果比一直亮好

  146. }
  147. //------------------------------------------

  148. void time1(void) interrupt 3
  149. {
  150.     timemultiplex++;
  151.         if (timemultiplex==timemultiplex_maxvalue)
  152.         {
  153.                 timemultiplex=0;
  154.                 //关要!
  155.                 PWM_PIN = 0;
  156.         }
  157. }


  158. /*********************************************************/
  159. // 延时子程序
  160. /*********************************************************/
  161. void delaySTD_ms(uchar ms)  // 标准延时毫秒@12M,ms最大值255   
  162. {   
  163.     uchar i;   
  164.     while(ms--)   
  165.         for(i = 0; i < 124; i++);   
  166. }

  167. //那个键按下返回几
  168. unsigned char scankey()
  169. {
  170.         if (key1pressed==0)
  171.         {
  172.                 delaySTD_ms(KEYPRESSTIME);
  173.                 if (key1pressed==0)
  174.                 {
  175.                         while(!key1pressed);
  176.                         delaySTD_ms(KEYPRESSTIME);
  177.                         return 1;
  178.                 }
  179.         }
  180.         if (key2pressed==0)
  181.         {
  182.                 delaySTD_ms(KEYPRESSTIME);
  183.                 if (key2pressed==0)
  184.                 {
  185.                         while(!key2pressed);
  186.                         delaySTD_ms(KEYPRESSTIME);
  187.                         return 2;
  188.                 }
  189.         }
  190.         if (key3pressed==0)
  191.         {
  192.                 delaySTD_ms(KEYPRESSTIME);
  193.                 if (key3pressed==0)
  194.                 {
  195.                         while(!key3pressed);
  196.                         delaySTD_ms(KEYPRESSTIME);
  197.                         return 3;
  198.                 }
  199.         }

  200.         return 0;
  201. }


复制代码
回复

使用道具 举报

ID:112693 发表于 2017-10-24 22:52 | 显示全部楼层
学习一下,谢谢楼主!!!!!!!!!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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