求一单片机程序(用光敏电阻,PWM输出控制LED亮度)

求一单片机程序(用光敏电阻,PWM输出控制LED亮度),第1张

ORG0000H

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

SETBCR开 PWM

RET

/ *** *** *** *** / 主程序

P1M0EQU 91H

P1M1EQU 92H

P3M0EQU 0B1H

P3M1EQU 0B2H

ADC_CONTR EQU 0C5H A/D 转缺岁缓换寄存器

ADC_DATAEQU 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 控制 发光亮度

LJMPMIN10

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

程序不好用就找偶!

#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=0i<msi++)

for(j=0j<100j++)

}

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=8i>0i--)

{ 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=8i>0i--)

{ 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),你可以参考一下啊!!!!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12283443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存