本系统通过光敏电阻将光信号转化为电信号,再经由STC89C51单片机进行引脚的数据采集,获得信号后通过LM386放大音频信号,通过控制电路,控制扬声器发出相应频率声音,并将音符信息显示在1602液晶上。
硬件部分主要包含激光发射电路,激光接收电路,音频输出电路,以及液晶显示电路等,软件部分主要包括激光信号采集,液晶显示器的 *** 作,以及发声频率的控制。
51单片机制作的激光竖琴程序主要是:
#include <reg51h>
#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=0;i<120;i++);
}
void PlayMusic()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{
for(j=0;j<SONG_LONG[i]20;j++)
{
BEEP=~BEEP;
for(k=0;k<SONG_TONE[i]/3;k++);
}
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);
}
}
PCF8581是存储器,怎么转换
可以采用ADC0832作为AD转换芯片,
将光敏电阻接到ADC0832的输入端,
并配以上拉电阻,均匀电压分布,
随着光线强弱的变化,光敏电阻阻值随着变动,
此时单片机对ADC0832实时读取数据,
达到设定的预定值后,报警
//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; }
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 ; 设置 P13 为高阻状态
MOV P1M1, #08H
MOV ADC_CONTR, #0E3H ; 开A/D 转换电源 P13
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
298只能驱动一个二相四线的步进电机或者二个直流电机:你用的是四相步进电机要用ULN2003这类驱动芯片,四相电机是单极电机,二相四线电机是双极电机,驱动原理有不一样的地方因此用的驱动芯片也有区别
亮灯的速度无非是控制灯亮的间隔时间~这个编写一个小的延时程序就行~跑马灯你回吧~就是这个程序就行,然后把时间改为由光敏电阻来控制·
控制方法如楼上~:
光敏电阻的原理是 电阻值随入射光的强弱而改变的电阻器;入射光强,电阻减小,入射光弱,电阻增大。
因此可讲电阻值转换成电压值,用AD转换测得电压的值,用电压变化作为灯的速度控制。
将光敏电阻的变化模拟信号A/D转换成数字信号,用这个数字信号来控制跑马灯闪烁的时间,任务完成~
具体程序就没写出来了,你可以参考跑马灯和A/D转换的程序,融合在一起基本OK~
以上就是关于51单片机制作的激光竖琴程序是什么全部的内容,包括:51单片机制作的激光竖琴程序是什么、基于51单片机的光控报警系统实现的功能:通过光敏电阻检测光线强度,当超出或低于某一值引起蜂鸣器报警,并、求,光敏电阻和adc0832用单片机控制的c语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)