欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機八音盒程序和與仿真原理圖
[打印本頁]
作者:
wh552106814
時間:
2018-11-29 00:48
標題:
單片機八音盒程序和與仿真原理圖
八音盒程序和與原理圖見附件
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(13.73 KB, 下載次數: 70)
下載附件
2018-11-29 02:15 上傳
單片機源程序如下:
#include <reg52.h>
#include<intrins.h>
#define uhar unsigned char
#define uint unsigned int
sbit key1=P3^2;//定義按key1可切換花樣
sbit key2=P3^3;//定義按key2可切換歌曲
sbit fm=P3^5;//蜂鳴器連續的IO口,接蜂鳴器的管腳
sbit rs=P2^0;
sbit rw=P2^1;
sbit ep=P2^2;
uchar i;
uchar Tong_index=0;//音樂片段索引音符索引
uchar song_index=0;
uchar *discode;//暫存LCD需要顯示的歌名
uchar *song_Tone,*song_Time;
uchar code dis1[]={"song1"};//第一首歌名,dis1~dis4位LCD第一行要顯示的歌名;
uchar code dis2[]={"song2"};
uchar code dis3[]={"song3"};
uchar code dis4[]={"song4"};
uchar code dis[]={"K1:Down K2:Up"}; //第二行顯示的內容
uint code Tong_tab[]={62018,62401,62491,62895,63184,63441,63506,63773,
63965,64137,64215,64360,64488,64603,64654,64751,64836,64876,64948,65012,65067,65535};
//---------------------------簡譜---------------------------------------
//編程規則:字節高位是簡譜,低位是持續時間,代表多少個十六分音符。
//1-7代表中央C調,8-E代表高八度,0代表停頓
//最后的0是結束標志
//uchar code song1_Tone[]={ // 歌曲1的演奏音符
//11,9,11,14,12,14,12,11,11,7,8,9,8,7,8,
//11,9,11,14,13,12,14,11,11,7,8,9,6,7,
//12,14,14,13,12,13,14,12,13,14,12,12,11,10,7,8,
//11,9,11,14,13,12,14,11,11,8,9,10,6,7,0xff};//結束標志
//uchar code song1_Time[]={ // 歌曲1的節拍頻率
//4,2,2,8,4,2,2,8,4,2,2,4,2,2,12,
//4,2,2,4,2,4,4,8,4,2,2,4,2,12,
//4,4,8,4,2,2,8,2,2,2,2,2,2,2,2,16,
//4,2,2,4,2,4,4,8,4,2,2,4,2,12,0xff};
//uchar code song2_Tone[]={ // 歌曲2的演奏音符
//7,8,9,7,7,8,9,7,9,10,11,9,10,11,
//11,12,11,10,9,7,11,12,11,10,9,7,7,4,7,7,4,7,0xff};//結束標志
//uchar code song2_Time[]={ // 歌曲2的節拍頻率
//4,4,4,4,4,4,4,4,4,4,8,4,4,8,
//2,2,2,2,4,4,2,2,2,2,4,4,4,4,8,4,4,8,0xff};
//uchar code song3_Tone[]={ // 歌曲3的演奏音符
//7,7,7,8,9,9,9,9,10,11,12,12,11,10,9,11,11,8,9,7,
//7,7,7,8,11,9,9,9,10,11,12,12,11,10,9,11,11,8,9,7,0xff};//結束標志
//uchar code song3_Time[]={ // 歌曲3的節拍頻率
//2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,
//2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,2,2,2,2,5,0xff};
//uchar code song4_Tone[]={ // 歌曲4的演奏音符
//5,9,9,9,9,8,7,8,7,6,5,12,12,12,12,12,11,
//2,11,11,10,9,9,12,12,11,9,8,7,8,7,6,5,9,
//2,7,7,6,5,9,8,7,6,4,12,0xff};//結束標志
//uchar code song4_Time[]={ // 歌曲4的節拍頻率
//2,2,2,2,2,2,2,2,2,2,8,2,2,2,2,4,2,
//2,2,2,2,8,2,2,2,2,4,2,2,2,2,2,4,2,
//2,2,2,2,4,2,2,2,2,2,8,0xff};
void delayms(uint ms)
{
uchar a;
while(ms--)
{
for(a=230;a>0;a--);
}
}
uchar Busy_Check(void)//測試LED忙碌狀態
{
uchar LCD_Status;
rs=0;
rw=1;
ep=1
_nop_();
_nop_();
_nop_();
_nop_();
LCD_Status=P0&0x80;
ep=0;
return LCD_Status;
}
void led_wemd(uchar cmd)//寫入指令數據到LCD
{
while(Busy_Check());
rs=0;
rw=0;
ep=0;
_nop_()
_nop_()
P0=cmd;
_nop_()
_nop_()
_nop_()
_nop_()
ep=1;
_nop_()
_nop_()
_nop_()
_nop_()
ep=0;
}
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80);
}
void lcd_wdat(uchar dat)
{
while(Busy_Check());
rs=0;
rw=0;
ep=0;
_nop_()
_nop_()
P0=cmd;
_nop_()
_nop_()
_nop_()
_nop_()
ep=1;
_nop_()
_nop_()
_nop_()
_nop_()
ep=0;
}
void lcd_init(void) //lcd初始化設定
{
lcd_wcmd(0x38); //設置顯示格式為16*2行顯示,5*8點陣,8位
delay(1);
lcd_wcmd(0x0C); //0x0c-顯示開關設置
delay(1);
lcd_wcmd(0x06); //0x06讀寫后指針+1
delay(1);
lcd_wcmd(0x01);//清除lcd顯示內容
}
//----------------------------簡譜音調對應的定時器初值---------------------------
//適合11.0592M的晶振,對定時器置入的初值
uchar code cuzhi[]={
0xff,0xff,//占位用的,沒有實際的意義
0xFC,0x8E,//中央C調1-7
0xFC,0xED,
0xFD,0x43,
0xFD,0x6A,
0xFD,0xB3,
0xFD,0xF3,
0xFE,0x2D,
0xFE,0x47, //高八度1-7
0xFE,0x76,
0xFE,0xA1,
0xFE,0xC7,
0xFE,0xD9,
0xFE,0xF9,
0xFF,0x16
};
uchar yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};
//將音調轉化為對應的LED樣式
void delay1(uint z); //延時1MS
void delay(uint z); //延時165MS,即十六分音符
void song();
void beep();//蜂鳴器叫一聲
void int0() interrupt 0
{
delayms(100);
if(INT0==0)
{
TR0=0;
if(song_index>5)
{
song_index=5;
}
else{song_index++;}
if(song_index==1)
{temp=songl[i];discode=dis2;}
if(song_index==2)
{temp=song2[i];discode=dis3;}
if(song_index==3)
{temp=song3[i];discode=dis4;}
if(song_index==4)
{temp=song4[i];discode=dis1;song_index=0;}
TR0=1;
i=0;
}
}
void int1() interrupt 2 //外部中斷1
{
delayms(100);
if(INT1==0)
{
TR1=0;
if(song_index<1)
{
song_index=0;
}
else{song_index--;}
if(song_index==1)
{temp=song[i];discode=dis2;}
if(song_index==2)
{temp=song2[i];discode=dis3;}
if(song_index==3)
{temp=song3[i];discode=dis4;}
if(song_index==4)
{temp=song4[i];discode=dis1;song_index=0;}
TR0=1;
i=0;
}
}
//---------------.按照51單片機的中斷向量順序編的號,也是缺省狀態下的優先級------------
//外部中斷0 interrupt 0
//定時器0 interrupt 1
//外部中斷1 interrupt 2
//定時器1 interrupt 3
//串口中斷 interrupt 4
//定時器2 interrupt 5
void timer0() interrupt 1 //用于產生各種音調 定時器0
{
TH0=Tone_tab[Tone_index]/256;//重置T0定時初值
TL0=Tone_tab[Tone_index]%256;
fm=~fm;
}
void LCD_disp(void)
{
uchar i;
lcd_pos(0);
i=0;
while(discode!='\0')
{
lcd_wdat(discode[i]);
i++;
}
lcd_pos(0x40);
i=0;
while(dis[i]!='\0')
{
lcd_wdat(dis[i]);
i++;
}
}
void int_init(void)
{
TMOD=0x01;
ET0=1;//允許Timer0中斷
EX0=1;//允許INT0中斷
IT0=1; //INT0為邊沿觸發
EX1=1;
IT1=1;
EA=1;
TR0=0; //Timer0停止
}
void main(void)
{
int_init();
song_Tone=song1_Tone;
song_Time=song1_Time;
discode=dis1;
lcd_init();
while(1)
{
LCD_disp();
Tone_index=song_Tone[i];
if(Tone_index==0xFF)
{
i=0;
TR0=0;
}
TR0=1;
delayms(song_Time[Tone_index]*60);
TR0=0
i++
}
}
復制代碼
所有資料51hei提供下載:
《流水燈音樂盒》.rar
(806.82 KB, 下載次數: 84)
2018-11-29 00:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
zh18016498169
時間:
2018-11-29 20:04
感謝分享
作者:
丁訂定
時間:
2020-12-16 14:53
這個程序有錯誤呀
作者:
不知所以
時間:
2020-12-22 16:35
故意改錯。。。
作者:
A_z
時間:
2020-12-23 18:03
這個是電子琴嗎
作者:
2216
時間:
2021-7-3 15:16
程序全是錯誤 改完都夠我再編兩個的了
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1