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

QQ登錄

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

搜索
查看: 1221|回復(fù): 2
收起左側(cè)

stc8a單片機(jī)怎么在流水燈基礎(chǔ)上實(shí)現(xiàn)光控,做成光控流水燈

[復(fù)制鏈接]
ID:997537 發(fā)表于 2021-12-30 11:46 | 顯示全部樓層 |閱讀模式
如題 現(xiàn)在已經(jīng)有了兩者結(jié)合代碼,運(yùn)用光敏電阻把光照強(qiáng)度串口顯示出來(lái)了,但是這兩者結(jié)合卻一直沒(méi)辦法實(shí)現(xiàn)光控流水燈
代碼如下,求大佬指點(diǎn)是哪里錯(cuò)了,應(yīng)該怎么改正呢
非常感謝!

本次代碼中stc8a.h被標(biāo)注了,但是里面一些必要的定義我直接從中復(fù)制到reg52.h里了

單片機(jī)源程序如下:
  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位數(shù)據(jù),可變波特率
  45.         AUXR |= 0x40;                //定時(shí)器1時(shí)鐘為Fosc,即1T
  46.         AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
  47.         TMOD &= 0x0F;                //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
  48.         TL1 = 0xE0;                //設(shè)定定時(shí)初值
  49.         TH1 = 0xFE;                //設(shè)定定時(shí)初值
  50.         ET1 = 0;                //禁止定時(shí)器1中斷
  51.         TR1 = 1;                //啟動(dòng)定時(shí)器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;                                //設(shè)置P1.0為ADC口
  76.     P1M1 = 0x01;

  77.     ADCCFG = 0x2f;                              //設(shè)置ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16/16
  78.     ADC_CONTR = 0x80;                           //使能ADC模塊

  79.         TMOD=0x01; //定時(shí)器
  80.         TH0=(65536-500)/256;    //256個(gè)機(jī)器周期  
  81.         TL0=(65536-500)%256;
  82.         EA=1;
  83.         ET0=1;
  84.         TR0=1;

  85.         
  86.     while (1)
  87.     {
  88.                         
  89.         ADC_CONTR |= 0x40;                      //啟動(dòng)AD轉(zhuǎn)換 P1.0
  90.         _nop_();
  91.         _nop_();
  92.         while (!(ADC_CONTR & 0x20));            //查詢ADC完成標(biāo)志
  93.         ADC_CONTR &= ~0x20;                     //清完成標(biāo)志
  94.         //ADC_RES(高4位) ADC_RESL(低8位);                           //讀取ADC結(jié)果
  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. }
復(fù)制代碼
流水燈老是斷斷續(xù)續(xù)
回復(fù)

使用道具 舉報(bào)

ID:808821 發(fā)表于 2021-12-30 17:39 | 顯示全部樓層
試試 在進(jìn)入定時(shí)器中斷后 關(guān)閉總中斷,  結(jié)束后再開(kāi)啟總中斷
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2021-12-30 17:53 | 顯示全部樓層
ADC改用中斷查詢法
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表