#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),你可以参考一下啊!!!!
哦?偶试试传感器使用一个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
程序不好用就找偶!
ORG0000HL0000: 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)