#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)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)