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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4606|回復: 8
收起左側

單片機光敏電阻自動調光器--不能自動進行調光了(臺燈)

[復制鏈接]
ID:585365 發表于 2019-10-27 12:27 | 顯示全部樓層 |閱讀模式
該產品時在那個寶上買的(是散件)現在實驗板是測試,怎么也測試不過,重新做好電路依然如此。
對硬件已經做了全部的測試,以可以確定電路沒有問題,芯片也沒有壞。現在的狀況如下:
1,按按鍵進入自動調光下不起作用,不論怎么用電筒照射光敏電阻都不能進行調光
2,手動調光一切正常
3,沒有安裝人體感應器測試時,自動調光不起作用,裝上人體感應器時依然自動沒有作用
4,購買的是不帶報警的

以下程序是淘寶賣家發給我的,請各位看看,我覺得程序是有問題,但又不清楚為什么有問題。邏輯看上去是對的

  1. //宏定義
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. //頭函數
  5. #include <reg52.h>               
  6. uchar pdata tt[51];                   //定義空數組用于AD0832取平均值

  7. uchar scale,rsd_sec;                //定義占空比比例,熱釋電計時秒變量
  8. uchar sec;
  9. bit bdata flag_auto,flag_rsd;          //位定義自動切換,熱釋電動作標志

  10. uint lum;                                        //ad0832讀出值
  11. uchar m;

  12. //管腳聲明
  13. sbit LED = P2^5;        //燈光控制輸出
  14. sbit rsd = P1^5;   //熱釋電
  15. sbit qiehuan=P3^7;
  16. sbit add=P3^6;
  17. sbit dec=P3^5;

  18. sbit CS=P1^3;                //CS定義腳,連接ADC0832CS腳
  19. sbit SCL=P1^0;                //SCL定義腳,連接ADC0832SCL腳
  20. sbit DO=P1^1;                //DO定義腳,連接ADC0832DO腳

  21. /*****************延時函數:大約1ms************************/
  22. void delay(uchar i)
  23. {
  24.   uchar j,k;
  25.   for(j=i;j>0;j--)
  26.     for(k=125;k>0;k--);
  27. }
  28. /***********讀數模轉換數據********************************************************/        
  29. //請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,本函數是模擬0832的串行協議進行的

  30. unsigned char ad0832read(bit SGL,bit ODD)
  31. {
  32.         unsigned char i=0,value=0,value1=0;               
  33.                 SCL=0;
  34.                 DO=1;
  35.                 CS=0;                //開始
  36.                 SCL=1;                //第一個上升沿        
  37.                 SCL=0;
  38.                 DO=SGL;
  39.                 SCL=1;          //第二個上升沿
  40.                 SCL=0;
  41.                 DO=ODD;
  42.                 SCL=1;            //第三個上升沿
  43.                 SCL=0;            //第三個下降沿
  44.                 DO=1;
  45.                 for(i=0;i<8;i++)
  46.                 {
  47.                         SCL=1;
  48.                         SCL=0; //開始從第四個下降沿接收數據
  49.                         value<<=1;
  50.                         if(DO)
  51.                                 value++;                                                
  52.                 }
  53.                 for(i=0;i<8;i++)
  54.                 {                        //接收校驗數據
  55.                         value1>>=1;
  56.                         if(DO)
  57.                                 value1+=0x80;
  58.                         SCL=1;
  59.                         SCL=0;
  60.                 }
  61.                 CS=1;
  62.                 SCL=1;        
  63.                 if(value==value1)                                //與校驗數據比較,正確就返回數據,否則返回0        
  64.                         return value;
  65.         return 0;
  66. }

  67. /*****************按鍵函數*****************/
  68. void work()
  69. {
  70.         uint lum_mean,lum_all;
  71.         uchar b,c;

  72.         if(qiehuan==0)                                  //自動切換按鍵按下
  73.         {
  74.                 delay(10);                                  //去抖
  75.                 if(qiehuan==0)                          //再次判斷按鍵按下
  76.                 {
  77.                         flag_auto=!flag_auto; //自動模式標志位取反
  78.                         if(flag_auto==1)          //當切換到手動模式時  首先將LED發光比例設置在50%
  79.                         scale=20;
  80.                 }
  81.                 while(!qiehuan); //按鍵釋放  松開按鍵后關閉蜂鳴器
  82.         }
  83.         if(flag_auto==1)
  84.         {
  85.                 if(add==0)                                 //加鍵按下
  86.                 {
  87.                         delay(10);
  88.                         if(add==0)
  89.                         {
  90.                                 scale++;                  //燈光比例++
  91.                                 if(scale>=41)
  92.                                 scale=41;
  93.                         }
  94.                 }
  95.                 if(dec==0)                                  //減鍵按下時
  96.                 {
  97.                         delay(10);
  98.                         if(dec==0)
  99.                         {
  100.                                 scale--;                   //燈光比例--
  101.                                 if(scale<=1)
  102.                                 scale=1;
  103.                         }
  104.                 }
  105.         }
  106.         else
  107.         {
  108.                 if(flag_rsd==1)                                        //有人在范圍內時
  109.                 {         
  110.                         for(b=0;b<49;b++)                         //將空數組tt【】內數值整體左移一位
  111.                         {
  112.                                 tt[b]=tt[b+1];                        //將后一數值放到前一位置
  113.                         }        
  114.                         tt[49] = ad0832read(1,0);  //將讀出的ad數值放入tt【49】
  115.                         for(c=0;c<50;c++)                        //將tt【】內數值相加
  116.                         {
  117.                                 lum_all=lum_all+tt[c];
  118.                         }
  119.                         lum_mean=lum_all/50;                //將總數/50取出平均值
  120.                         lum_all=0;                                        //將總數清零
  121.                         if(lum_mean<=30) scale=1;                           //判斷取出平均值大小  小于30  發光強度0%
  122.                         else if(lum_mean>=150) scale=41;           //大于150  發光強度100%
  123.                         else scale=((lum_mean-30)/3)+1;                   //其他值時將其計算得到發光強度 (計算目的是為了得到一個1-41之間的數值 控制燈光變化)        
  124.                 }
  125.                 else
  126.                 {
  127.                         scale=1;                                         //沒有人在范圍內時 將燈光亮度調至0%
  128.                 }        
  129.         }
  130. }
  131. /*********定時器初始化函數**********/
  132. void init()
  133. {
  134.         TMOD=0x11;           //工作方式
  135.         TH1=0x3c;
  136.         TL1=0xb0;           //T1賦初值50ms
  137.         TH0=0xff;
  138.         TL0=0xe7;                //T0賦初值25us         
  139.         ET0=1;
  140.         ET1=1;                   //打開中斷允許開關
  141.         EA=1;                   //中斷總開關
  142.         TR0=1;
  143.         TR1=1;                   //定時器定時開關
  144. }

  145. /****************主函數**********************/
  146. void main()
  147. {
  148.         init();                  //調用初始化函數

  149.         while(1)                   //循環
  150.         {
  151.                 work();                 //調用函數
  152.         }
  153. }

  154. /******************定時器T0服務函數:脈沖發生函數*******************/
  155. void time0() interrupt 1
  156. {
  157.         uchar n;
  158.         TH0=0xff;
  159.         TL0=0xe7;                 //重新賦初值
  160.         n++;                         //每25us  n++
  161.         if(n<scale)                 //n<設置比例時,打開燈
  162.         {
  163.                 LED=0;
  164.         }
  165.         else if(n>=scale)//n大于等于設置比例時 關閉燈
  166.         {
  167.                 LED=1;
  168.         }
  169.         if(n>=40)                 //n==40  :25us*40=1ms   1kHZ
  170.         {
  171.                 n=0;                 //n=0
  172.         }
  173. }  
  174. /********************定時器T0服務函數:計時和閃爍控制********************/
  175. void time1() interrupt 3
  176. {
  177.         TH1=0x3c;
  178.         TL1=0xb0;                 //重新賦初值
  179.         m++;                         //50ms  m++
  180.         
  181.         if(m==20)                                                  //到達1s時
  182.         {
  183.                 m=0;                                                  //m=0
  184.                 if(rsd==0)                                          //熱釋電無信號時
  185.                 rsd_sec++;                                          //熱釋電計時秒++
  186.                 if(rsd_sec<=20&&rsd==1)                  //熱釋電計時秒小于等于20 并且 熱釋電有信號時
  187.                 {
  188.                         rsd_sec=0;                                  //將熱釋電秒清零
  189.                         flag_rsd=1;                                  //標志位置1 控制AD0832采集數值 調節燈光亮度
  190.                 }
  191.                 else if(rsd_sec>20&&rsd==0)          //熱釋電計時秒大于20 并且 熱釋電無信號時
  192.                 {
  193.                         flag_rsd=0;                                  //標志位置0 停止ad0832轉換 關閉燈光
  194.                         rsd_sec=0;                                  //熱釋電計時秒清零
  195.                 }
  196.         }
  197. }
復制代碼




回復

使用道具 舉報

ID:190577 發表于 2019-10-27 17:06 | 顯示全部樓層
電路圖有嗎?提供下
回復

使用道具 舉報

ID:213173 發表于 2019-10-27 19:52 | 顯示全部樓層
不知道硬件電路。單從程序看,T0中斷中的uchar n;明顯不妥,應該是static uchar n;或聲明全局變量。但不像是導致不能自動進行調光的主因,需要配合熱釋電部分判斷AD轉換是否正常。
回復

使用道具 舉報

ID:585365 發表于 2019-10-28 20:36 | 顯示全部樓層
圖紙如下:
1122.jpg
回復

使用道具 舉報

ID:585365 發表于 2019-10-28 20:37 | 顯示全部樓層
就是不知道為什么不能進入到自動調光的模式
回復

使用道具 舉報

ID:213173 發表于 2019-11-1 11:33 | 顯示全部樓層
247015164 發表于 2019-10-28 20:37
就是不知道為什么不能進入到自動調光的模式

仿真查看確實不能自動調光,臨時屏蔽濾波部分可以自動調光,說明AD轉換沒有問題。更改緩沖數組uchar pdata tt[51]; 為  uchardata tt[51];,一切正常。
無標題.jpg

回復

使用道具 舉報

ID:213173 發表于 2019-11-1 14:51 | 顯示全部樓層
本帖最后由 wulin 于 2019-11-1 20:56 編輯
247015164 發表于 2019-10-28 20:37
就是不知道為什么不能進入到自動調光的模式
原來的程序有缺陷,這是優化過的程序。如果再把按鍵程優化為短按加/減,長按連加/減更好。
  1. //頭函數
  2. #include <reg52.h>               
  3. //宏定義
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. //uchar pdata tt[51];          //定義空數組用于AD0832取平均值
  7. uchar data  tt[51];
  8. uchar scale,rsd_sec;         //定義占空比比例,熱釋電計時秒變量
  9. uchar sec;
  10. bit flag_auto=0,flag_rsd=0;//位定義自動切換,熱釋電動作標志

  11. //uint lum;                    //ad0832讀出值
  12. uchar m;
  13. uchar n;
  14. //管腳聲明
  15. sbit LED = P2^5;                        //燈光控制輸出
  16. sbit rsd = P1^5;                                  //熱釋電
  17. sbit qiehuan=P3^7;                                //手動/自動切換
  18. sbit add=P3^6;                                                //增加
  19. sbit dec=P3^5;                                                //減小

  20. sbit CS=P1^3;                //CS定義腳,連接ADC0832CS腳
  21. sbit SCL=P1^0;               //SCL定義腳,連接ADC0832SCL腳
  22. sbit DO=P1^1;                //DO定義腳,連接ADC0832DO腳

  23. /*****************延時函數:大約1ms************************/
  24. /*
  25. void delay(uchar i)
  26. {
  27.   uchar j,k;
  28.   for(j=i;j>0;j--)
  29.     for(k=125;k>0;k--);
  30. }*/
  31. /***********讀數模轉換數據********************************************************/        
  32. //請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,
  33. //本函數是模擬0832的串行協議進行的
  34. uchar ad0832read(bit SGL,bit ODD)
  35. {
  36.         uchar i=0,value=0,value1=0;               
  37.         SCL=0;
  38.         DO=1;
  39.         CS=0;                //開始
  40.         SCL=1;                //第一個上升沿        
  41.         SCL=0;
  42.         DO=SGL;
  43.         SCL=1;          //第二個上升沿
  44.         SCL=0;
  45.         DO=ODD;
  46.         SCL=1;            //第三個上升沿
  47.         SCL=0;            //第三個下降沿
  48.         DO=1;
  49.         for(i=0;i<8;i++)
  50.         {
  51.                 SCL=1;
  52.                 SCL=0; //開始從第四個下降沿接收數據
  53.                 value<<=1;
  54.                 if(DO)
  55.                         value++;
  56.         }
  57.         for(i=0;i<8;i++)
  58.         {                        //接收校驗數據
  59.                 value1>>=1;
  60.                 if(DO)
  61.                         value1+=0x80;
  62.                 SCL=1;
  63.                 SCL=0;
  64.         }
  65.         CS=1;
  66.         SCL=1;        
  67.         if(value==value1) //與校驗數據比較,正確就返回數據,否則返回0        
  68.                 return value;
  69.         return 0;
  70. }
  71. /*****************按鍵函數*****************/
  72. void work()
  73. {
  74.         static bit key_sign1=0,key_sign2=0,key_sign3=0;        //按鍵自鎖標志
  75.         static uchar count1=0,count2=0,count3=0;                //計數變量       
  76.         uint lum_mean,lum_all;
  77.         uchar b,c;       
  78.         if(qiehuan==0)              //自動切換按鍵按下
  79.         {
  80.                 if(++count1==100&&key_sign1==0)           //再次判斷按鍵按下
  81.                 {
  82.                         key_sign1=1;
  83.                         flag_auto=~flag_auto; //自動模式標志位取反
  84.                         if(flag_auto==1)      //當切換到手動模式時  首先將LED發光比例設置在50%
  85.                                 scale=20;
  86.                 }
  87.         }
  88.         else          //按鍵釋放
  89.         {
  90.                 key_sign1=0;
  91.                 count1=0;
  92.         }
  93.         if(flag_auto==1)
  94.         {
  95.                 if(add==0)               //加鍵按下
  96.                 {
  97.                         if(++count2==100&&key_sign2==0)
  98.                         {
  99.                                 key_sign2=1;
  100.                                 if(scale<41)//燈光比例++
  101.                                         scale++;
  102.                         }
  103.                 }
  104.                 else          //按鍵釋放
  105.                 {
  106.                         key_sign2=0;
  107.                         count2=0;
  108.                 }
  109.                 if(dec==0)               //減鍵按下時
  110.                 {
  111.                         if(++count3==100&&key_sign3==0)
  112.                         {
  113.                                 key_sign3=1;        
  114.                                 if(scale>1)//燈光比例--
  115.                                         scale--;
  116.                         }
  117.                 }
  118.                 else          //按鍵釋放
  119.                 {
  120.                         key_sign3=0;
  121.                         count3=0;
  122.                 }
  123.         }
  124.         else
  125.         {
  126.                 if(flag_rsd==1)          //有人在范圍內時
  127.                 {         
  128.                         for(b=0;b<49;b++)     //將空數組tt[]內數值整體左移一位
  129.                         {
  130.                                 tt[b]=tt[b+1];     //將后一數值放到前一位置
  131.                         }        
  132.                         tt[49] = ad0832read(1,0);//將讀出的ad數值放入tt[49]
  133.                         for(c=0;c<50;c++)     //將tt[]內數值相加
  134.                         {
  135.                                 lum_all=lum_all+tt[c];
  136.                         }
  137.                         lum_mean=lum_all/50;  //將總數/50取出平均值
  138.                         lum_all=0;            //將總數清零
  139.                         if(lum_mean<=30) scale=1;//判斷取出平均值大小  小于30  發光強度0%
  140.                         else if(lum_mean>=150) scale=41;//大于150  發光強度100%
  141.                         else scale=((lum_mean-30)/3)+1;//其他值時將其計算得到發光強度 (計算目的是為了得到一個1-41之間的數值 控制燈光變化)        
  142.                 }
  143.                 else
  144.                 {
  145.                         scale=1;               //沒有人在范圍內時 將燈光亮度調至0%
  146.                 }        
  147.         }
  148. }
  149. /*********定時器初始化函數**********/
  150. void init()
  151. {
  152.         TMOD=0x12;                   //T1方式1,T0方式2
  153.         TH1=0x3c;
  154.         TL1=0xb0;                    //T1賦初值50ms
  155.         TH0=0xce;                                                  //8位自動重載
  156.         TL0=0xce;                    //T0賦初值50us         
  157.         ET0=1;
  158.         ET1=1;                       //打開中斷允許開關
  159.         EA=1;                        //中斷總開關
  160.         TR0=1;
  161.         TR1=1;                       //定時器定時開關
  162. }

  163. /****************主函數**********************/
  164. void main()
  165. {
  166.         init();                     //調用初始化函數       
  167.         while(1)                    //循環
  168.         {
  169.                 work();                 //調用函數
  170.         }
  171. }

  172. /******************定時器T0服務函數:脈沖發生函數*******************/
  173. void time0() interrupt 1
  174. {
  175. //        TH0=0xff;
  176. //        TL0=0xe7;                 //重新賦初值
  177.         n++;                      //每50us  n++
  178.         if(n<scale)               //n<設置比例時,打開燈
  179.         {
  180.                 LED=0;
  181.         }
  182.         else if(n>=scale)//n大于等于設置比例時 關閉燈
  183.         {
  184.                 LED=1;
  185.         }
  186.         if(n>=40)                 //n==40  :50us*40=2ms   500HZ
  187.         {
  188.                 n=0;                 //n=0
  189.         }
  190. }  
  191. /********************定時器T0服務函數:計時和閃爍控制********************/
  192. void time1() interrupt 3
  193. {
  194.         TH1=0x3c;
  195.         TL1=0xb0;                 //重新賦初值
  196.         if(rsd==1)
  197.         {
  198.                 flag_rsd=1;
  199.                 rsd_sec=0;
  200.                 m=0;
  201.         }
  202.         else
  203.         {
  204.                 m++;                      //50ms  m++
  205.                 if(m==20)                 //到達1s時
  206.                 {
  207.                         m=0;                  //m=0
  208.                         rsd_sec++;            //熱釋電計時秒++
  209.                         if(rsd_sec>=20)       //熱釋電計時秒小于等于20 并且 熱釋電有信號時
  210.                         {
  211.                                 flag_rsd=0;       //標志位置0 停止ad0832轉換 關閉燈光
  212.                                 rsd_sec=0;        //熱釋電計時秒清零
  213.                         }
  214.                 }
  215.         }
  216. }
復制代碼




回復

使用道具 舉報

ID:713781 發表于 2020-3-31 13:14 | 顯示全部樓層
這個仿真要怎么看啊,怎么看出亮度變化呢
回復

使用道具 舉報

ID:713781 發表于 2020-4-6 16:55 | 顯示全部樓層
wulin 發表于 2019-11-1 14:51
原來的程序有缺陷,這是優化過的程序。如果再把按鍵程優化為短按加/減,長按連加/減更好。

我試了一下,按鍵沒反應啊,你工程文件還在嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠干美女 | 在线午夜 | 99久久精品一区二区成人 | 狠狠操电影 | 亚洲视频三区 | 中文一区二区视频 | 一级毛片中国 | 国产玖玖 | 在线免费毛片 | 91精品国产综合久久久动漫日韩 | 91干b| 91免费入口| 天堂免费 | 国产精品国产成人国产三级 | 精品福利一区 | 365夜爽爽欧美性午夜免费视频 | 欧美一卡二卡在线观看 | 欧美五月婷婷 | 日韩国产在线 | 国产在线视频一区二区 | 99久久婷婷 | 国产福利视频 | 懂色av色香蕉一区二区蜜桃 | 91精品久久久久久久久中文字幕 | 成年免费大片黄在线观看一级 | 91久久电影 | 亚洲二区视频 | 亚洲成人精品 | 久久狠狠 | 免费黄色在线 | 一区二区三区精品视频 | 精品一区二区三区中文字幕 | 情侣黄网站免费看 | 操操日| 夜夜操天天操 | 亚洲导航深夜福利涩涩屋 | 欧美日韩一区二区三区在线观看 | 91视频久久| 久久精品一区二区视频 | 成人免费高清 | 色视频在线免费观看 |