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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1196|回復: 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. }
復制代碼
流水燈老是斷斷續續
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产中文字幕亚洲 | 一区二区三区四区免费视频 | 久久久精品视频一区二区三区 | 午夜精品久久久久久久久久久久久 | 精品在线一区 | 成人在线网 | 久草.com | 欧美黑人体内she精在线观看 | 精品国产一区二区久久 | 国产一区 | 在线不卡视频 | 国产精品一区二区三区在线 | 性生活毛片 | 日韩精品久久一区 | 欧美精品一区二区三区四区 在线 | 一级毛片色一级 | 91看片| 成年人在线视频 | 国产分类视频 | 国产真实精品久久二三区 | 亚洲在线一区二区 | 欧美a在线 | 国产欧美日韩一区 | 亚洲成人免费视频 | 欧美日韩国产在线观看 | 国产一区不卡 | 欧美日韩中文在线 | 国产一区二区三区免费 | 中文字幕一区二区三区在线视频 | 久久精品屋 | 男人的天堂中文字幕 | 国产亚洲精品成人av久久ww | 成人不卡 | 亚洲天堂精品一区 | а天堂中文最新一区二区三区 | 亚洲精品一区二区网址 | 中文字幕亚洲区一区二 | 国产一二区视频 | 欧美涩涩网 | 日韩精品不卡 | 国产一区二区三区精品久久久 |