找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 617|回复: 2
打印 上一主题 下一主题
收起左侧

stc8a单片机怎么在流水灯基础上实现光控,做成光控流水灯

[复制链接]
跳转到指定楼层
楼主
ID:997537 发表于 2021-12-30 11:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题 现在已经有了两者结合代码,运用光敏电阻把光照强度串口显示出来了,但是这两者结合却一直没办法实现光控流水灯
代码如下,求大佬指点是哪里错了,应该怎么改正呢
非常感谢!

本次代码中stc8a.h被标注了,但是里面一些必要的定义我直接从中复制到reg52.h里了

单片机源程序如下:
  1. //#include "stc8a.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. #include "reg52.h"

  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. sbit D0 = P2^0;   
  8. sbit D1 = P2^1;
  9. sbit D2 = P2^2;
  10. sbit D3 = P2^3;
  11. sbit D4 = P2^4;
  12. sbit D5 = P2^5;
  13. sbit D6 = P2^6;
  14. sbit D7 = P2^7;

  15. uchar PWM0 = 15; //15 17 19 21 23 25 27 29
  16. uchar PWM1 = 17;     
  17. uchar PWM2 = 19;
  18. uchar PWM3 = 21;
  19. uchar PWM4 = 23;     
  20. uchar PWM5 = 25;
  21. uchar PWM6 = 27;     
  22. uchar PWM7 = 29;
  23. uchar count=0;  
  24. uchar num=0;  
  25. float ftemp;


  26. void Timer0(void) interrupt 1 //ET0
  27. {                           
  28.         TH0=(65536-500)/256;   
  29.         TL0=(65536-500)%256;
  30.         count++;
  31.         num++;
  32.         if(count >= 15) count = 0;   
  33.         if(count >= PWM7) D0 = 0; else D0 = 1;
  34.         if(count >= PWM6) D1 = 0; else D1 = 1;
  35.         if(count >= PWM5) D2 = 0; else D2 = 1;
  36.         if(count >= PWM4) D3 = 0; else D3 = 1;
  37.         if(count >= PWM3) D4 = 0; else D4 = 1;
  38.         if(count >= PWM2) D5 = 0; else D5 = 1;
  39.         if(count >= PWM1) D6 = 0; else D6 = 1;
  40.         if(count >= PWM0) D7 = 0; else D7 = 1;  
  41. }


  42. void UartInit(void)                //9600bps@11.0592MHz
  43. {
  44.         SCON = 0x50;                //8位数据,可变波特率
  45.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  46.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  47.         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  48.         TL1 = 0xE0;                //设定定时初值
  49.         TH1 = 0xFE;                //设定定时初值
  50.         ET1 = 0;                //禁止定时器1中断
  51.         TR1 = 1;                //启动定时器1
  52. }

  53. void Delay100ms()                //@11.0592MHz
  54. {
  55.         unsigned char i, j, k;

  56.         _nop_();
  57.         i = 6;
  58.         j = 157;
  59.         k = 59;
  60.         do
  61.         {
  62.                 do
  63.                 {
  64.                         while (--k);
  65.                 } while (--j);
  66.         } while (--i);
  67. }



  68. void main()
  69. {
  70.         unsigned int dat;
  71.         
  72. //        char str[10];
  73. //        char i;
  74.         UartInit();

  75.     P1M0 = 0x00;                                //设置P1.0为ADC口
  76.     P1M1 = 0x01;

  77.     ADCCFG = 0x2f;                              //设置ADC时钟为系统时钟/2/16/16
  78.     ADC_CONTR = 0x80;                           //使能ADC模块

  79.         TMOD=0x01; //定时器
  80.         TH0=(65536-500)/256;    //256个机器周期  
  81.         TL0=(65536-500)%256;
  82.         EA=1;
  83.         ET0=1;
  84.         TR0=1;

  85.         
  86.     while (1)
  87.     {
  88.                         
  89.         ADC_CONTR |= 0x40;                      //启动AD转换 P1.0
  90.         _nop_();
  91.         _nop_();
  92.         while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
  93.         ADC_CONTR &= ~0x20;                     //清完成标志
  94.         //ADC_RES(高4位) ADC_RESL(低8位);                           //读取ADC结果
  95.                 dat=ADC_RES*256+ADC_RESL;
  96.                 ftemp=dat;
  97.                 ftemp=ftemp*3.3/4096;

  98. //                sprintf(str,"%.2f\r\n\0",ftemp);
  99. //                i=0;
  100. //                while(str[i]!=0)
  101. //                {
  102. //                        SBUF=str[i];
  103. //                        while(!TI);
  104. //                        TI=0;
  105. //                        i++;
  106. //                }
  107.                         
  108.                         
  109.                         if(num==50)
  110.                 {
  111.                         num=0;
  112.                         if(ftemp <= 1) {//光照越大,ftemp越小
  113.                         PWM7++;PWM6++;PWM5++;PWM4++;PWM3++;PWM2++;PWM1++;PWM0++;
  114.                         if(PWM7==15) PWM7=0;
  115.                         if(PWM6==15) PWM6=0;
  116.                         if(PWM5==15) PWM5=0;
  117.                         if(PWM4==15) PWM4=0;
  118.                         if(PWM3==15) PWM3=0;
  119.                         if(PWM2==15) PWM2=0;
  120.                         if(PWM1==15) PWM1=0;
  121.                         if(PWM0==15) PWM0=0;
  122.                         }
  123.                         else if(ftemp > 1 && ftemp <= 2)
  124.                         {
  125.                                 PWM7++;PWM6++;PWM5++;PWM4++;PWM3++;PWM2++;PWM1++;PWM0++;
  126.                         if(PWM7==30) PWM7=0;
  127.                         if(PWM6==30) PWM6=0;
  128.                         if(PWM5==30) PWM5=0;
  129.                         if(PWM4==30) PWM4=0;
  130.                         if(PWM3==30) PWM3=0;
  131.                         if(PWM2==30) PWM2=0;
  132.                         if(PWM1==30) PWM1=0;
  133.                         if(PWM0==30) PWM0=0;
  134.                         }
  135.                         else if(ftemp > 2) //光照越小 ftemp越大
  136.                         {
  137.                                 PWM7++;PWM6++;PWM5++;PWM4++;PWM3++;PWM2++;PWM1++;PWM0++;
  138.                         if(PWM7==50) PWM7=0;
  139.                         if(PWM6==50) PWM6=0;
  140.                         if(PWM5==50) PWM5=0;
  141.                         if(PWM4==50) PWM4=0;
  142.                         if(PWM3==50) PWM3=0;
  143.                         if(PWM2==50) PWM2=0;
  144.                         if(PWM1==50) PWM1=0;
  145.                         if(PWM0==50) PWM0=0;
  146.                         }
  147.                         
  148.                 }

  149. //           Delay100ms();

  150.     }
  151. }
复制代码
流水灯老是断断续续
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:808821 发表于 2021-12-30 17:39 | 只看该作者
试试 在进入定时器中断后 关闭总中断,  结束后再开启总中断
回复

使用道具 举报

板凳
ID:161164 发表于 2021-12-30 17:53 | 只看该作者
ADC改用中断查询法
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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