Ⅰ 急求單片機為stc15w408as的光敏電阻數據採集的C程序
你好
STC單片機不能模擬,只能是實物
1、先調試好AD的基本採集
2、接上光敏電阻,適當的加上上拉電阻
3、祝你成功
Ⅱ 利用單片機和光敏電阻控制燈亮和滅的匯編程序
用光敏電阻串一個可調電阻進行分壓接到單片機IO,只要檢測IO的高低電平去控制燈亮和滅
如:檢測到高電平----燈亮,,,檢測到低電平----燈滅
Ⅲ 求一單片機程序(用光敏電阻,PWM輸出控制LED亮度)
ORG 0000H
L0000: LJMP MIN00 ; 主程序
; / *** *** *** *** / 初始化 PWM
PCA00: MOV CMOD, #82H ; (fSYS/2)
MOV CCON, #00H
MOV CL, #00H
MOV CH, #00H
MOV CCAPM0, #00H ; PWM0 輸出
MOV PCA_PWM0, #00H
SETB CR ; 開 PWM
RET
; / *** *** *** *** / 主程序
P1M0 EQU 91H
P1M1 EQU 92H
P3M0 EQU 0B1H
P3M1 EQU 0B2H
ADC_CONTR EQU 0C5H ; A/D 轉換寄存器
ADC_DATA EQU 0C6H ; A/D 結果寄存器
MIN00: MOV P1M0, #08H ; 設置 P1.3 為高阻狀態
MOV P1M1, #08H
MOV ADC_CONTR, #0E3H ; 開A/D 轉換電源 P1.3
LCALL PCA00 ; 初始化 PWM
MIN10: NOP ; 主程序 入口
LCALL ADC00 ; 測光敏電阻電壓
MOV CCAP0H, A ; 寫入PWM 控制 發光亮度
LJMP MIN10
RET
; / *** *** *** *** / A/D 轉換通道 測電壓
ADC00: MOV ADC_DATA, #00H
ORL ADC_CONTR, #08H ; 啟動 AD 轉換
MOV A, #10H ; 判斷 AD 轉換是否完成
ANL A, ADC_CONTR
JZ ADC32 ; AD 轉換尚未完成, 繼續等待
ANL ADC_CONTR, #0E7H ; 清0 ADC_FLAG, ADC_START 位, 停止A/D 轉換
MOV A, ADC_DATA ; A = AD 轉換結果
RET
END
Ⅳ 跪求用光敏電阻和單片機根據亮度控制燈的開關程序
哦?偶試試
感測器使用一個LM358運放和光敏電阻組成。運放接兩個電位器。可以調節感應程度的。兩個運放的輸出端接到單片機除P0口的任意口線。在程序中檢測運放的輸出狀態。有光的時候,兩個運放都是輸出為高電平。這時候,單片機繼續等待。光線強度下降的時候,其中一個運放就會輸出低電平了。這時,單片機檢測到後就會打開其中一個燈。當光線強度繼續下降,這時,兩個運放就會都輸出低電平。這時,單片機檢測到都為低電平的時候,打開兩個燈就可以啦。到了快天亮的時候,光線強度上升。這時候,其中一個運放又會輸出高電平,單片機就會關閉其中一個燈了。天完全亮後,關閉所有的燈。
硬體連接:P1.0口接第一個運放的輸出端。P1.1口接第二個運放的輸出端。P2.0口接第一個控制繼電器的三極體,P2.1口接第二個控制繼電器的三極體。輸出為低電平有效。
實現功能:白天的時候,繼電器都釋放。光線下降後,其中一個繼電器吸合。光線很弱的時候,兩個繼電器都吸合。循環。
偶使用了最笨的法子,蹲點守候!嘿嘿嘿 程序中引入延時判斷,防止誤觸發。
org 0
ajmp start
org 30h
start:mov a,p1
cjne a,#0feh,next
lcall dely
mov a,p1
cjne a,#0feh,next
clr p2.0
ajmp start
next: cjne a,#0fch,next1
lcall dely
mov a,p1
cjne a,#0fch,next1
clr p2.0
clr p2.1
ajmp start
next1:cjne a,#0ffh,start
lcall dely
mov a,p1
cjne a,#0ffh,start
setb p2.0
setb p2.1
ajmp start
dely: mov r7,#100
dl1: mov r6,#100
dl2: mov r5,#50
djnz r5,$
djnz r6,dl2
djnz r7,dl1
ret
end
程序不好用就找偶!
Ⅳ 基於51單片機,ADC0804,光敏電阻,濕度感測器,求程序!!!!
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;//ds18b20與單片機連介面
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
unsigned char code str1[]={"temperature: "};
unsigned char code str2[]={" "};
uchar data disdata[5];
uint tvalue;//溫度值
uchar tflag;//溫度正負標志
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延時1毫秒(不夠精確的)
{unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
void wr_com(unsigned char com)//寫指令//
{ delay1ms(1);
RS=0;
RW=0;
EN=0;
P2=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(unsigned char dat)//寫數據//
{ delay1ms(1);;
RS=1;
RW=0;
EN=0;
P2=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void lcd_init()//初始化設置//
{delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
void display(unsigned char *p)//顯示//
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
init_play()//初始化顯示
{ lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延時1微秒
{
while(i--);
}
void ds1820rst()/*ds1820復位*/
{ unsigned char x=0;
DQ = 1; //DQ復位
delay_18B20(4); //延時
DQ = 0; //DQ拉低
delay_18B20(100); //精確延時大於480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*讀數據*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; //給脈沖信號
dat>>=1;
DQ = 1; //給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*寫數據*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
read_temp()/*讀取溫度值並轉換*/
{uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳過讀序列號*/
ds1820wr(0x44);//*啟動溫度轉換*/
ds1820rst();
ds1820wr(0xcc);//*跳過讀序列號*/
ds1820wr(0xbe);//*讀取溫度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//溫度值顯示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位數
disdata[1]=tvalue%1000/100+0x30;//十位數
disdata[2]=tvalue%100/10+0x30;//個位數
disdata[3]=tvalue%10+0x30;//小數位
if(tflag==0)
flagdat=0x20;//正溫度不顯示符號
else
flagdat=0x2d;//負溫度顯示負號:-
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位為0,不顯示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位為0,十位為0也不顯示
}
}
wr_com(0xc0);
wr_dat(flagdat);//顯示符號位
wr_com(0xc1);
wr_dat(disdata[0]);//顯示百位
wr_com(0xc2);
wr_dat(disdata[1]);//顯示十位
wr_com(0xc3);
wr_dat(disdata[2]);//顯示個位
wr_com(0xc4);
wr_dat(0x2e);//顯示小數點
wr_com(0xc5);
wr_dat(disdata[3]);//顯示小數位
}
/********************主程序***********************************/
void main()
{ init_play();//初始化顯示
while(1)
{read_temp();//讀取溫度
ds1820disp();//顯示
}
}
這個是測溫度的(18b20),你可以參考一下啊!!!!
Ⅵ 求,光敏電阻和adc0832用單片機控制的c語言程序
//******************adc0832****************************// sbit CS=P1^0; //使能。 sbit CLK=P1^1;//時鍾 sbit Do=P1^2; // 數據輸出 sbit Di=P1^2;//數據輸入 unsigned char CH=0x02;
//通道的選擇:0x02就是單通道0;0x03就是單通道1; //0x00就是雙通道ch0=「+」; ch0=「-」 //0x01就是雙通道ch0=「-」; ch0=「+」
//*****************************************************// unsigned char ADconv(void) {unsigned char i;
unsigned int data_f=0,data_c=0; Di=1; CS=1; _nop_(); CS=0;
Di=1; //晶元使能之前的初始化。第一個下降沿 CLK=1; _nop_(); _nop_();
/****************************************/ CLK=0; // 確定通道模式、第2個下降沿 _nop_(); _nop_(); CLK=1;
Di=(bit)(0x02&CH); //設定通道初始化 _nop_(); CLK=0; _nop_(); _nop_(); CLK=1;
Di=(bit)(0x01&CH); //設定通道初始化 .第3個下降沿 _nop_();
_nop_();
CLK=0; //AD轉化的初始化完成。 Di=1; CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); CLK=1;
for(i=8;i>0;i--)//得到一個正常排序的8位數據 {
data_f|=Do; data_f<<=1; CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); }
for(i=8;i>0;i--)//得到一個反序排列的8位數據 {
data_c<<=1; data_c|=Do; _nop_(); CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); } CLK=0; _nop_();
_nop_(); CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); _nop_(); CLK=1; _nop_(); CS=1; _nop_(); _nop_(); return data_f; }
Ⅶ 單片機AD實驗,求光敏電阻簡單電路(實時測光)
找一個阻值不變的已知電阻和光敏電阻串聯接到額定5V電源上,用已知電阻測未知電阻,這個初中課本上就有了。然後用AD讀取光敏電阻的電壓值,經過計算就可以了。