欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 運(yùn)用光敏電阻實(shí)現(xiàn)自動(dòng)調(diào)光的單片機(jī)程序?yàn)樯恫荒苓M(jìn)入自動(dòng)調(diào)光了?求大佬解答 [打印本頁(yè)]

作者: 2602346838    時(shí)間: 2021-5-3 15:36
標(biāo)題: 運(yùn)用光敏電阻實(shí)現(xiàn)自動(dòng)調(diào)光的單片機(jī)程序?yàn)樯恫荒苓M(jìn)入自動(dòng)調(diào)光了?求大佬解答
調(diào)試電路如下:

利用進(jìn)行手動(dòng)調(diào)光,但是一旦按下P3.7切換開(kāi)關(guān)后,波形圖直接變成直線了,無(wú)法進(jìn)行自動(dòng)調(diào)光,希望大佬幫我看看。

單片機(jī)程序如下:

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

  7. uchar scale,rsd_sec;                //定義占空比比例,熱釋電計(jì)時(shí)秒變量
  8. uchar sec;
  9. bit bdata flag_auto,flag_rsd;          //位定義自動(dòng)切換,熱釋電動(dòng)作標(biāo)志

  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. /*****************延時(shí)函數(shù):大約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. /***********讀數(shù)模轉(zhuǎn)換數(shù)據(jù)********************************************************/        
  29. //請(qǐng)先了解ADC0832模數(shù)轉(zhuǎn)換的串行協(xié)議,再來(lái)讀本函數(shù),主要是對(duì)應(yīng)時(shí)序圖來(lái)理解,本函數(shù)是模擬0832的串行協(xié)議進(jìn)行的

  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;                //開(kāi)始
  36.                 SCL=1;                //第一個(gè)上升沿        
  37.                 SCL=0;
  38.                 DO=SGL;
  39.                 SCL=1;          //第二個(gè)上升沿
  40.                 SCL=0;
  41.                 DO=ODD;
  42.                 SCL=1;            //第三個(gè)上升沿
  43.                 SCL=0;            //第三個(gè)下降沿
  44.                 DO=1;
  45.                 for(i=0;i<8;i++)
  46.                 {
  47.                         SCL=1;
  48.                         SCL=0; //開(kāi)始從第四個(gè)下降沿接收數(shù)據(jù)
  49.                         value<<=1;
  50.                         if(DO)
  51.                                 value++;                                                
  52.                 }
  53.                 for(i=0;i<8;i++)
  54.                 {                        //接收校驗(yàn)數(shù)據(jù)
  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)                                //與校驗(yàn)數(shù)據(jù)比較,正確就返回?cái)?shù)據(jù),否則返回0        
  64.                         return value;
  65.         return 0;
  66. }

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

  72.         if(qiehuan==0)                                  //自動(dòng)切換按鍵按下
  73.         {
  74.                 delay(10);                                  //去抖
  75.                 if(qiehuan==0)                          //再次判斷按鍵按下
  76.                 {
  77.                         flag_auto=!flag_auto; //自動(dòng)模式標(biāo)志位取反
  78.                         if(flag_auto==1)          //當(dāng)切換到手動(dòng)模式時(shí)  首先將LED發(fā)光比例設(shè)置在50%
  79.                         scale=20;
  80.                 }
  81.                 while(!qiehuan); //按鍵釋放  松開(kāi)按鍵后關(guān)閉蜂鳴器
  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)                                  //減鍵按下時(shí)
  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)                                        //有人在范圍內(nèi)時(shí)
  109.                 {         
  110.                         for(b=0;b<49;b++)                         //將空數(shù)組tt【】?jī)?nèi)數(shù)值整體左移一位
  111.                         {
  112.                                 tt[b]=tt[b+1];                        //將后一數(shù)值放到前一位置
  113.                         }        
  114.                         tt[49] = ad0832read(1,0);  //將讀出的ad數(shù)值放入tt【49】
  115.                         for(c=0;c<50;c++)                        //將tt【】?jī)?nèi)數(shù)值相加
  116.                         {
  117.                                 lum_all=lum_all+tt[c];
  118.                         }
  119.                         lum_mean=lum_all/50;                //將總數(shù)/50取出平均值
  120.                         lum_all=0;                                        //將總數(shù)清零
  121.                         if(lum_mean<=30) scale=1;                           //判斷取出平均值大小  小于30  發(fā)光強(qiáng)度0%
  122.                         else if(lum_mean>=150) scale=41;           //大于150  發(fā)光強(qiáng)度100%
  123.                         else scale=((lum_mean-30)/3)+1;                   //其他值時(shí)將其計(jì)算得到發(fā)光強(qiáng)度 (計(jì)算目的是為了得到一個(gè)1-41之間的數(shù)值 控制燈光變化)        
  124.                 }
  125.                 else
  126.                 {
  127.                         scale=1;                                         //沒(méi)有人在范圍內(nèi)時(shí) 將燈光亮度調(diào)至0%
  128.                 }        
  129.         }
  130. }
  131. /*********定時(shí)器初始化函數(shù)**********/
  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;                   //打開(kāi)中斷允許開(kāi)關(guān)
  141.         EA=1;                   //中斷總開(kāi)關(guān)
  142.         TR0=1;
  143.         TR1=1;                   //定時(shí)器定時(shí)開(kāi)關(guān)
  144. }

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

  149.         while(1)                   //循環(huán)
  150.         {
  151.                 work();                 //調(diào)用函數(shù)
  152.         }
  153. }

  154. /******************定時(shí)器T0服務(wù)函數(shù):脈沖發(fā)生函數(shù)*******************/
  155. void time0() interrupt 1
  156. {
  157.         uchar n;
  158.         TH0=0xff;
  159.         TL0=0xe7;                 //重新賦初值
  160.         n++;                         //每25us  n++
  161.         if(n<scale)                 //n<設(shè)置比例時(shí),打開(kāi)燈
  162.         {
  163.                 LED=0;
  164.         }
  165.         else if(n>=scale)//n大于等于設(shè)置比例時(shí) 關(guā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. /********************定時(shí)器T0服務(wù)函數(shù):計(jì)時(shí)和閃爍控制********************/
  175. void time1() interrupt 3
  176. {
  177.         TH1=0x3c;
  178.         TL1=0xb0;                 //重新賦初值
  179.         m++;                         //50ms  m++
  180.         
  181.         if(m==20)                                                  //到達(dá)1s時(shí)
  182.         {
  183.                 m=0;                                                  //m=0
  184.                 if(rsd==0)                                          //熱釋電無(wú)信號(hào)時(shí)
  185.                 rsd_sec++;                                          //熱釋電計(jì)時(shí)秒++
  186.                 if(rsd_sec<=20&&rsd==1)                  //熱釋電計(jì)時(shí)秒小于等于20 并且 熱釋電有信號(hào)時(shí)
  187.                 {
  188.                         rsd_sec=0;                                  //將熱釋電秒清零
  189.                         flag_rsd=1;                                  //標(biāo)志位置1 控制AD0832采集數(shù)值 調(diào)節(jié)燈光亮度
  190.                 }
  191.                 else if(rsd_sec>20&&rsd==0)          //熱釋電計(jì)時(shí)秒大于20 并且 熱釋電無(wú)信號(hào)時(shí)
  192.                 {
  193.                         flag_rsd=0;                                  //標(biāo)志位置0 停止ad0832轉(zhuǎn)換 關(guān)閉燈光
  194.                         rsd_sec=0;                                  //熱釋電計(jì)時(shí)秒清零
  195.                 }
  196.         }
  197. }
復(fù)制代碼


作者: 1051798957    時(shí)間: 2021-5-3 20:01
自己好好在看清楚一下程序把!不提倡這種寫(xiě)法!這樣寫(xiě)主程序沒(méi)有靈魂!何必要這么麻煩,ADC的精度也太差了!才8位的芯片自帶的都可以了!U2電路不對(duì)哦!這樣取永遠(yuǎn)是一個(gè)固定值!不會(huì)變的!這樣程序在牛逼也是沒(méi)用的!我不太明白你的電路具體情況!電路設(shè)計(jì)不對(duì)!
作者: 18701931930    時(shí)間: 2021-5-4 08:35
C:\Users\Administrator\Desktop

用ADC0831吧,單通道的

#include "ADC1031.H"



void delay1(u16 x)
{
        while(x--);
}


u8 read_0831() //讀取TLC0831的數(shù)字量
{
        u8 d,i;
       
        ck_0831=0;
        cs_0831=0;
        delay1(50);
        ck_0831=1;
        ck_0831=0; //此時(shí)0831輸出一個(gè)虛假的0
        for(i=0;i<8;i++)
        {
                 ck_0831=1;
                ck_0831=0;
                d<<=1;   //dddd dddd==>> dddd ddd0
                if(do_0831==1)
                {
                         d++;
                }
        }

        ck_0831=0;
        cs_0831=1;
               
        return d;        
}




#ifndef _ADC1031_
#define _ADC1031_

#include"reg51.h"

#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
       
sbit cs_0831=P1^5;
sbit do_0831=P1^7;
sbit ck_0831=P1^6;

extern u8 read_0831(void); //讀取TLC0831的數(shù)字量;

#endif




作者: 2602346838    時(shí)間: 2021-5-13 17:37
18701931930 發(fā)表于 2021-5-4 08:35
用ADC0831吧,單通道的

#include "ADC1031.H"

把模數(shù)轉(zhuǎn)換程序換成這個(gè)就行了嗎,

作者: 2602346838    時(shí)間: 2021-5-13 17:39
1051798957 發(fā)表于 2021-5-3 20:01
自己好好在看清楚一下程序把!不提倡這種寫(xiě)法!這樣寫(xiě)主程序沒(méi)有靈魂!何必要這么麻煩,ADC的精度也太差了 ...

這個(gè)是某一個(gè)寶買(mǎi)的,我不會(huì)改程序,怕越改越差,這里就是ADC連線錯(cuò)誤了嗎,那應(yīng)該怎么連呀





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1