51单片机制作的激光竖琴程序是什么

51单片机制作的激光竖琴程序是什么,第1张

本系统通过光敏电阻将光信号转化为电信号,再经由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语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10097401.html

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

发表评论

登录后才能评论

评论列表(0条)

保存