求一个基于51单片机的光敏电阻控制led灯亮灭的程序,实现有光的时候灯灭,没光的时候灯亮,急……

求一个基于51单片机的光敏电阻控制led灯亮灭的程序,实现有光的时候灯灭,没光的时候灯亮,急……,第1张

超简单:

#include <reg51.h>

sbit in=P0^0

sbit led=P1^0

void main()

{

while(1)

{

if(in==1)led=0

else led=1

}

}

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

本系统通过光敏电阻将光信号转化为电信号,再经由STC89C51单片机进行引脚的数据采集,获得信号后通过LM386放大音频信号,通过控制电路,控制扬声器发出相应频率声音,并将音符信息显示在1602液晶上。

硬件部分主要包含激光发射电路,激光接收电路,音频输出电路,以及液晶显示电路等,软件部分主要包括激光信号采集,液晶显示器的 *** 作,以及发声频率的控制。

51单片机制作的激光竖琴程序主要是:

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

//数码管 共阳

uchar code DSY_Table[]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,

0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}

//音符对应的延时

uint code Tone_Delay_Table[]={

64021,64103,64260,64400,64524,64580,64684,64777,

64820,64898,64968,65030,65058,65110,65157,65178}

sbit BEEP=P3^2

uchar KeyNo

//生日快乐歌的音符频率表,不同的频率用延时值来表示

uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,212,159,169,190,119,119,126,159,142,159,0}

uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,9,3,12,12,12,24,0}

///////delay------

void DelayMS(uint x)

{

uchar i

while(x--)for(i=0i<120i++)

}

void PlayMusic()

{

uint i=0,j,k

while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)

{

for(j=0j<SONG_LONG[i]*20j++)

{

BEEP=~BEEP

for(k=0k<SONG_TONE[i]/3k++)

}

DelayMS(80)//每个音符之间的时间间隔

i++

}

}

void Keys_SCAN()

{

uchar k,t,key_state

P1=0xff

//while(1)

//{

t=P1

if(t!=0xff)

{

DelayMS(10)

if(t!=P1)

{

switch(t){

case 0x87: BEEP=159 break//1mie do

case 0x47: BEEP=142 break//2mie re

case 0x27: BEEP=126 break//3mie mi

case 0x17: BEEP=119 break//4mie fa

case 0x0f: BEEP=212 break//5mie sol

default: BEEP=169

}// silu

}

//continue

// key_state=~t

// k=0

//while(key_state!=0)

// {

//k++

//key_state>>=1

// }

// KeyNo=k

//}

//return//return 语句的加法很重要

}

//return

//KeyNo=k

}

void play_Tone() interrupt 1

{

TH0=Tone_Delay_Table[KeyNo]/256

TL0=Tone_Delay_Table[KeyNo]%256

BEEP=~BEEP

}

//////MAIN/////////////////

void main()

{

//BEEP=0

//while(1)

//P0=0xF0

P0=0xbf

PlayMusic()

DelayMS(1000)

DelayMS(1000)

TMOD=0x01

IE=0x82

while(1)

{

P1=0xff

if(P1 != 0xff)

{

Keys_SCAN()

P0=DSY_Table[KeyNo]

TR0=1

}

else

{

TR0=0

}

DelayMS(2)

}

}


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

原文地址: https://outofmemory.cn/yw/7744966.html

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

发表评论

登录后才能评论

评论列表(0条)

保存