《單片機(jī)系統(tǒng)設(shè)計(jì)仿真與應(yīng)用》課件第8章_第1頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)仿真與應(yīng)用》課件第8章_第2頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)仿真與應(yīng)用》課件第8章_第3頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)仿真與應(yīng)用》課件第8章_第4頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)仿真與應(yīng)用》課件第8章_第5頁(yè)
已閱讀5頁(yè),還剩98頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

8.1原理圖說(shuō)明

8.2交通信號(hào)燈模擬控制系統(tǒng)設(shè)計(jì)8.3直流電機(jī)和步進(jìn)電機(jī)應(yīng)用設(shè)計(jì)8.4具有校時(shí)、鬧鐘功能的數(shù)字鐘設(shè)計(jì)8.5電子密碼鎖設(shè)計(jì)

8.6樂(lè)曲播放器設(shè)計(jì)

8.7小結(jié)

習(xí)題

本章使用的原理圖在前幾章原理圖的基礎(chǔ)上增加了一些功能器件,如圖8-1、圖8-2和圖8-3所示。8.1原?理?圖?說(shuō)?明圖8-1頂層原理圖圖8-2SUB1子電路圖圖8-3SUB2子電路圖

1.設(shè)計(jì)要求

2.設(shè)計(jì)說(shuō)明

實(shí)現(xiàn)設(shè)計(jì)要求(1),可采用定時(shí)器計(jì)時(shí),每50?ms定時(shí)器產(chǎn)生一次中斷,然后對(duì)中斷計(jì)數(shù)來(lái)實(shí)現(xiàn)更長(zhǎng)時(shí)間的定時(shí)。1?min的定時(shí),中斷次數(shù)為1200次;30秒的定時(shí),中斷次數(shù)為600次;5秒的定時(shí),中斷次數(shù)為100次。

主程序和中斷服務(wù)程序的流程圖如圖8-4所示。8.2交通信號(hào)燈模擬控制系統(tǒng)設(shè)計(jì)圖8-4交通信號(hào)燈模擬控制系統(tǒng)程序流程圖

3.設(shè)計(jì)源碼

根據(jù)流程圖,寫(xiě)出模擬交通燈控制系統(tǒng)源程序,如例8-1所示。

【例8-1】

模擬交通燈控制系統(tǒng)源程序。

#include<reg51.h>

#defineucharunsignedchar

#defineuintunsignedint

staticuintcount=0;//定時(shí)器初始化函數(shù)

voidTimer0_init()

{

TMOD=0x01;//T0方式1:16位定時(shí)器

IE=0x82; //開(kāi)T0中斷

TH0=-50000/256;TL0=-50000%256;

//定時(shí)50?ms

TR0=1; //啟動(dòng)定時(shí)器

}//定時(shí)器中斷函數(shù)

voidTimer0_Int(void)interrupt1using1

{

TH0=-50000/256;TL0=-50000%256;

//定時(shí)50?ms

if(++count==1800)count=0;

//1分30秒的計(jì)數(shù)為1800次

}//交通燈控制函數(shù)

//A道綠燈放行1?min(其中10?s用于黃燈)

//B道綠燈放行30?s(其中10?s用于黃燈)

voidtraffic_control()

{

if(count<=1000)P0=0x14; //延時(shí)50?s

elseif(count<=1200)P0=0x12; //延時(shí)10?s

elseif(count<=1600)P0=0x41; //延時(shí)20?s

elseP0=0x21; //延時(shí)10?s

}//主函數(shù)

voidmain()

{

Timer0_init();

while(1)

{

traffic_control();

}

}

4.仿真結(jié)果

模擬交通燈的仿真結(jié)果如圖8-5所示。圖8-5交通控制器仿真結(jié)果

1.設(shè)計(jì)要求

2.設(shè)計(jì)說(shuō)明

1)直流電機(jī)控制原理

從圖8-3可以看出,直流電機(jī)的正轉(zhuǎn)和反轉(zhuǎn)通過(guò)單片機(jī)的P1.6和P1.7管腳控制。

2)步進(jìn)電機(jī)控制原理

步進(jìn)電機(jī)是將電脈沖信號(hào)轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開(kāi)環(huán)控制元件。8.3直流電機(jī)和步進(jìn)電機(jī)應(yīng)用設(shè)計(jì)

3.設(shè)計(jì)源碼

根據(jù)設(shè)計(jì)說(shuō)明,寫(xiě)出直流電機(jī)和步進(jìn)電機(jī)控制源程序,如例8-2所示。

【例8-2】

直流電機(jī)和步進(jìn)電機(jī)控制源碼。

#include<reg51.h>

#defineucharunsignedchar

#defineuintunsignedintsbitK1=P1^4;

sbitK2=P1^5;

sbitDCmotor_A=P1^6;

sbitDCmotor_B=P1^7;

/*************延時(shí)x毫秒*****************/

voiddelay(ucharx)

//設(shè)晶體振蕩器的頻率為12?MHz

{

uchark;

while(x--) //延時(shí)大約x毫秒

for(k=0;k<125;k++){}

}//*********可控正轉(zhuǎn)、反轉(zhuǎn)的步進(jìn)電機(jī)***********/

//本例工作于八拍

//用兩個(gè)按鍵控制步進(jìn)電機(jī)的正轉(zhuǎn)、反轉(zhuǎn),鍵1按下時(shí)正轉(zhuǎn),鍵2按下時(shí)反轉(zhuǎn)

voidmotor_step(void)

{

#defineN8 //N=4時(shí)為四拍,N=8時(shí)為八拍

ucharcodestep_value[N]={0x1,0x3,0x2,0x6,0x4,0xC,0x8,0x9};

//八拍,對(duì)應(yīng)N為8

// ucharcodestep_value[N]={0x3,0x6,0xc,0x9};

//雙四拍,對(duì)應(yīng)N為4

// ucharcodestep_value[N]={0x1,0x2,0x4,0x8};

//單四拍,對(duì)應(yīng)N為4 uchari=0;

while(1)

{

if((K1==0)&&(K2!=0))

{

for(i=0;i<N;i++)

{

P1=step_value[i]; //步進(jìn)電機(jī)正轉(zhuǎn)

delay(250);delay(250);delay(250); }

}

elseif((K2==0)&&(K1!=0))

for(i=N;i>0;i--)

{

P1=step_value[i-1]; //步進(jìn)電機(jī)反轉(zhuǎn)

delay(250);delay(250);delay(250);

}

elseP1=0x00; }

}

//*********可控正轉(zhuǎn)、反轉(zhuǎn)的直流電機(jī)***********/

//用兩個(gè)按鍵控制步進(jìn)電機(jī)的正轉(zhuǎn)、反轉(zhuǎn),鍵1按下時(shí)正轉(zhuǎn),鍵2按下時(shí)反轉(zhuǎn)

voidmotor_dc(void)

{

while(1)

{ if((K1==0)&&(K2!=0))

{

DCmotor_A=0;DCmotor_B=1;

}

elseif((K2==0)&&(K1!=0))

{

DCmotor_A=1;DCmotor_B=0;

}

else

{

DCmotor_A=0;DCmotor_B=0;

} }

}

voidmain(void)

{

// motor_dc();

motor_step();

}

4.仿真結(jié)果

直流電機(jī)和步進(jìn)電機(jī)的仿真結(jié)果分別見(jiàn)圖8-6和圖8-7。

圖8-6為直流電機(jī)的仿真結(jié)果。仿真結(jié)果表明,可通過(guò)圖8-3中的按鍵K1和K2來(lái)控制直流電機(jī)的正轉(zhuǎn)、反轉(zhuǎn)和停止,實(shí)現(xiàn)了設(shè)計(jì)要求(1)。圖8-6直流電機(jī)反轉(zhuǎn)仿真結(jié)果圖8-7步進(jìn)電機(jī)反轉(zhuǎn)仿真結(jié)果(八拍、步進(jìn)角為30°)

1.設(shè)計(jì)要求

2.設(shè)計(jì)說(shuō)明

數(shù)字鐘校時(shí)和鬧鐘程序框圖及中斷函數(shù)流程框圖,分別如圖8-8和圖8-9所示。8.4具有校時(shí)、鬧鐘功能的數(shù)字鐘設(shè)計(jì)圖8-8數(shù)字鐘校時(shí)和鬧鐘程序框圖圖8-9定時(shí)器T0中斷服務(wù)程序流程圖

3.設(shè)計(jì)源碼

【例8-3】

數(shù)字鐘處理源程序。

#include<reg51.h>

#include<absacc.h>

#defineucharunsignedchar

#defineuintunsignedint

#definePA8255XBYTE[0x81fc]//8255端口A的地址

#definePB8255XBYTE[0x81fd]//8255端口B的地址

#definePC8255XBYTE[0x81fe]//8255端口C的地址

#defineCOM8255XBYTE[0x81ff]//8255命令字的地址//以下為函數(shù)聲明

ucharkeyscan(void);

voidLcd_display(ucharaddr,uchar*str);

voiddigital_clock_display(uchar);

//數(shù)字鐘的計(jì)時(shí)緩沖與顯示緩沖

ucharTime_buffer[]={0,0,0,0}; //時(shí),分,秒,0.01?s

ucharTime_alarm_buffer[]={0,0,0,0}; //時(shí),分,秒,0.01?s

ucharLcd_disply_buffer[]={"00:00:00:00"}; //hh:mm:ss:01s//定時(shí)器0中斷服務(wù)例程

voidTimer0_Int(void)interrupt1using1

{

TL0=-10000%256; //初值重載

TH0=-10000/256;

//下面為數(shù)字鐘時(shí)間處理部分

Time_buffer[3]++;

if(Time_buffer[3]==100) //1?s

{ Time_buffer[3]=0;Time_buffer[2]++;

}

if(Time_buffer[2]==60) //1?min

{

Time_buffer[2]=0;Time_buffer[1]++;

}

if(Time_buffer[1]==60) //1?hour

{ Time_buffer[1]=0;Time_buffer[0]++;

}

if(Time_buffer[0]==24) //1day

{

Time_buffer[0]=0;

}

}

//*************定時(shí)器T0初始化*****************//voidTimer_init(void)

{

TMOD=0x01;//定時(shí)器0方式1:16位定時(shí)器

TL0=-10000%256;

//定時(shí)器模式與初值設(shè)定:定時(shí)10?ms

TH0=-10000/256;

IE=0x82; //開(kāi)中斷,T0中斷

TR0=1; //啟動(dòng)定時(shí)器0

}//*************數(shù)字鐘顯示計(jì)時(shí)*****************//

//顯示在液晶上,格式為hh:mm:ss:百分秒

//sel為1時(shí)顯示當(dāng)前時(shí)間;sel為0時(shí)顯示鬧鐘設(shè)定時(shí)間

//當(dāng)鬧鐘設(shè)定時(shí)間和當(dāng)前時(shí)間一致時(shí),則鬧鈴

voiddigital_clock_display(ucharsel)

{

uchari=0;

//顯示 if(sel==0)

for(i=0;i<4;i++)

{

Lcd_disply_buffer[3*i]=Time_alarm_buffer[i]/10+'0';

Lcd_disply_buffer[3*i+1]=Time_alarm_buffer[i]%10+'0';

}

else

for(i=0;i<4;i++)

{ Lcd_disply_buffer[3*i]=Time_buffer[i]/10+'0';

Lcd_disply_buffer[3*i+1]=Time_buffer[i]%10+'0';

}

Lcd_display(0x40,Lcd_disply_buffer);

//鬧鈴,響1?s某種特定頻率的音樂(lè),如叮咚聲

if((Time_alarm_buffer[0]==Time_buffer[0])&&(Time_alarm_buffer[1]==Time_buffer[1])

&&(Time_alarm_buffer[2]==Time_buffer[2])) {

PB8255=0x10;

}

else

{

PB8255=0x00;

}

}//*************數(shù)字鐘校時(shí)和鬧鐘程序*****************//

//第一行從左至右第一個(gè)鍵(0x18)用于校時(shí),第二個(gè)鍵(0x14)用于鬧鐘時(shí)間設(shè)定

//第二行從左至右的四個(gè)鍵(0x28/0x24/0x22/0x21)分別用來(lái)調(diào)時(shí)十位/時(shí)個(gè)位/分十位/分個(gè)位

voidadjust_digital_clock(void)

{

uchartmp1,tmp2;

if((tmp1=keyscan())==1)

while((tmp2=keyscan())!=1){ if(tmp2==4) //小時(shí)十位加1

{ Time_alarm_buffer[0]=Time_alarm_buffer[0]+10;

if(Time_alarm_buffer[0]/10==3)

Time_alarm_buffer[0]=Time_alarm_buffer[0]%10;

}

elseif(tmp2==5) //小時(shí)個(gè)位加1

{ Time_alarm_buffer[0]++;

if(Time_alarm_buffer[0]%10==0)Time_alarm_buffer[0]=Time_alarm_buffer[0]-10;

}

elseif(tmp2==6) //分十位加1

{ Time_alarm_buffer[1]=Time_alarm_buffer[1]+10;

if(Time_alarm_buffer[1]/10==6)

Time_alarm_buffer[1]=Time_alarm_buffer[1]%10; }

elseif(tmp2==7) //分個(gè)位加1

{ Time_alarm_buffer[1]++;

if(Time_alarm_buffer[1]%10==0)

Time_alarm_buffer[1]=Time_alarm_buffer[1]-10;

}

digital_clock_display(0);

}

elseif(tmp1==0) {

TR0=0;

while((tmp2=keyscan())!=0){

if(tmp2==4) //小時(shí)十位加1

{ Time_buffer[0]=Time_buffer[0]+10;

if(Time_buffer[0]/10==3)Time_buffer[0]=Time_buffer[0]%10;

}

elseif(tmp2==5)//小時(shí)個(gè)位加1 { Time_buffer[0]++;

if(Time_buffer[0]%10==0)Time_buffer[0]=Time_buffer[0]-10;

}

elseif(tmp2==6) //分十位加1

{ Time_buffer[1]=Time_buffer[1]+10;

if(Time_buffer[1]/10==6)Time_buffer[1]=Time_buffer[1]%10;

}

elseif(tmp2==7) //分個(gè)位加1

{ Time_buffer[1]++; if(Time_buffer[1]%10==0)Time_buffer[1]=Time_buffer[1]-10;

}

digital_clock_display(1);

}

TR0=1;

}

else

digital_clock_display(1);

}【例8-4】

主程序。

#defineucharunsignedchar

#defineuintunsignedint

//以下為函數(shù)聲明

voidinit_8255(void);

voidTimer_init(void);

voidLcd_initialize(void);

voidLcd_display(ucharaddr,uchar*str);

voidadjust_digital_clock(void);voidmain(void)

{

init_8255();

Lcd_initialize();

Lcd_display(0x00,"digitalclock:");

Timer_init();

while(1)

{

adjust_digital_clock();//顯示時(shí)鐘,校時(shí),鬧鈴

}

}

4.仿真結(jié)果

仿真結(jié)果如圖8-10所示。仿真結(jié)果表明,本設(shè)計(jì)實(shí)現(xiàn)了設(shè)計(jì)要求。圖8-10數(shù)字鐘顯示界面(液晶屏上顯示當(dāng)前時(shí)間)

1.設(shè)計(jì)要求

2.設(shè)計(jì)說(shuō)明

密碼鎖處理子程序、重置密碼子程序和開(kāi)鎖子程序的流程圖分別如圖8-11、圖8-12、圖8-13所示。8.5電子密碼鎖設(shè)計(jì)圖8-11密碼鎖處理程序框圖圖8-12重置密碼子程序流程圖圖8-13開(kāi)鎖子程序流程圖

3.設(shè)計(jì)源碼

密碼鎖處理源程序見(jiàn)例8-5,主程序見(jiàn)例8-6。

【例8-5】

密碼鎖處理源程序。

#include<reg51.h>

#include<string.h>

#defineucharunsignedchar

#defineuintunsignedintucharunlock_flag=0; //unlock_flag用于已開(kāi)鎖標(biāo)志,為1表示已開(kāi)鎖

uchartmp1,tmp2,cnt,flag; //flag=1表示設(shè)置密碼成功

ucharpassword_user[7]={0},password_store[7]={0},password_load[7]={0};

//下面地址定義中包含使能138芯片的信息

#definePA8255XBYTE[0x80fc]//8255端口A的地址

#definePB8255XBYTE[0x80fd]//8255端口B的地址

#definePC8255XBYTE[0x80fe]//8255端口C的地址

#defineCOM8255XBYTE[0x80ff]//8255命令字的地址voidWrite_nbyte(ucharadd,uchar*str,ucharnum);

voidRead_nbyte(ucharadd,uchar*str,ucharnum);

ucharkeyscan(void);

voidLcd_initialize(void);

voidLcd_display(ucharaddr,uchar*str);

voiddelay(ucharx);

voidpassword_reset(); //重置密碼子程序

voidunlock(); //開(kāi)鎖子程序 //密碼鎖初始化:將初始密碼666666存放于24C02中

voidpassword_lock_init(void)

{

Write_nbyte(0,“666666”,6);

//將初始密碼存放在24C02中

unlock_flag=0;

}

//密碼鎖功能設(shè)置:13號(hào)鍵用于上鎖、14號(hào)鍵用于重置密碼(開(kāi)鎖狀態(tài)下)、15號(hào)鍵用于開(kāi)鎖

voidpassword_lock(void)

{ if((tmp1=keyscan())==13) //上鎖

{

// PA8255=0x00;

Lcd_display(0x00,"passwordlock:");

//第1行

Lcd_display(0x40,"locked");

unlock_flag=0; //為0表示上鎖,為1表示已開(kāi)鎖

}

elseif(tmp1==14) //重置密碼

{ password_reset();

}

elseif(tmp1==15) //開(kāi)鎖

{

unlock();

}

}//重置密碼函數(shù)

voidpassword_reset(void)

{

if(unlock_flag==1) //已開(kāi)鎖?

{

do{

cnt=0;flag=1; //重置密碼成功標(biāo)志 Lcd_display(0x00,"Newpassword:");

Lcd_display(0x40,"");

while(cnt<6)

{

if(((tmp2=keyscan())>=0)&&(tmp2<=9))

{

Lcd_display(0x00,"6bitpassword:"); password_user[cnt]=tmp2+'0';

Lcd_display(0x40+cnt,"*");

cnt=cnt+1;

}

elseif(tmp2!=0xff)

{

Lcd_display(0x00,"Error:input1-9:");

} }

cnt=0;

Lcd_display(0x00,"passwordagain:");

Lcd_display(0x40,"");

while(cnt<6)

{

if(((tmp2=keyscan())>=0)&&(tmp2<=9))

{ Lcd_display(0x00,"6bitpassword:");

password_store[cnt]=tmp2+'0';

Lcd_display(0x40+cnt,"*");

cnt=cnt+1;

}

elseif(tmp2!=0xff)

{

Lcd_display(0x00,"Error:input1-9:");

}

} if(strcmp(password_store,password_user)!=0)

{

flag=0;

Lcd_display(0x40,"retryresetpw:"); //重新重置密碼約1?s

delay(250);delay(250);delay(250);delay(250);

} }while(!flag);

Write_nbyte(0,password_store,6); //將重置密碼存放在24C02中

Lcd_display(0x00,"resetpwsuccess"); //重置密碼成功

}

else //未開(kāi)鎖

{ Lcd_display(0x00,"Newpassword:");

Lcd_display(0x40,"UnlockFirst!");

}

}

//開(kāi)鎖函數(shù)

voidunlock(void)

{

do{ cnt=0;unlock_flag=1; //flag為開(kāi)鎖成功標(biāo)志

Lcd_display(0x00,"unlock,password:");

Lcd_display(0x40,"");

while(cnt<6)

{

if(((tmp2=keyscan())>=0)&&(tmp2<=9))

{ Lcd_display(0x00,"unlock,password:");//顯示提示信息:輸入開(kāi)鎖密碼

password_user[cnt]=tmp2+'0';

Lcd_display(0x40+cnt,"*");

cnt=cnt+1;

}

elseif(tmp2!=0xff)

{

Lcd_display(0x00,"Error:input1-9:");

}

} Read_nbyte(0,password_load,6); /將取出存放在24C02中的密碼

if(strcmp(password_load,password_user)!=0)

{

unlock_flag=0;

Lcd_display(0x40,“unlock,FAILED!”);

//顯示開(kāi)鎖失敗約1?s delay(250);delay(250);delay(250);delay(250);

}

}while(!unlock_flag);

Lcd_display(0x40,"unlock,OK!"); //顯示開(kāi)鎖成功

}【例8-6】

主程序。

#defineucharunsignedchar

#defineuintunsignedint

//以下為函數(shù)聲明

voidinit_8255(void);

voidLcd_initialize(void);

voidLcd_display(ucharaddr,uchar*str);

voidpassword_lock_init(void);

voidpassword_lock(void);voidmain(void)

{

init_8255();

Lcd_initialize();

Lcd_display(0x00,"passwordlock:");

password_lock_init();

while(1)

{

password_lock();

}

}

4.仿真結(jié)果

圖8-14為開(kāi)鎖過(guò)程及開(kāi)鎖成功界面,圖8-15為密碼設(shè)置過(guò)程、第二次輸入新密碼提示界面及密碼設(shè)置成功界面。仿真結(jié)果表明,本設(shè)計(jì)實(shí)現(xiàn)了設(shè)計(jì)要求。圖8-14開(kāi)鎖過(guò)程及開(kāi)鎖成功界面圖8-15密碼設(shè)置過(guò)程、第二次輸入新密碼提示界面及密碼設(shè)置成功界面

1.設(shè)計(jì)要求

2.設(shè)計(jì)說(shuō)明

1)音調(diào)的控制

簡(jiǎn)譜中的音名與音頻的對(duì)應(yīng)關(guān)系如圖8-16所示。8.6樂(lè)曲播放器設(shè)計(jì)圖8-16簡(jiǎn)譜中音名與音頻的對(duì)應(yīng)關(guān)系

2)音長(zhǎng)的控制

音樂(lè)中的音除了有高低之分外,還有長(zhǎng)短之分。如何記錄音的長(zhǎng)短呢?簡(jiǎn)譜中用一條橫線“—”在音符的右面或下面來(lái)標(biāo)注音的長(zhǎng)短。表8-1列出了常用音符和它們的長(zhǎng)度標(biāo)記。表8-1常用音符及其長(zhǎng)度標(biāo)記根據(jù)設(shè)計(jì)要求,可畫(huà)出程序流程圖,如圖8-17所示。圖8-17播放音樂(lè)程序流程圖

3.設(shè)計(jì)源碼

音樂(lè)播放器源程序見(jiàn)例8-7,主程序見(jiàn)例8-8。

【例8-7】

音樂(lè)播放器源程序。

#include<reg51.h>

#include<absacc.h>

#defineucharunsignedchar

#defineuintunsignedint//下面地址定義中包含使能138芯片的信息

#definePA8255XBYTE[0x80fc]//8255端口A的地址

#definePB8255XBYTE[0x80fd] //8255端口B的地址

#definePC8255XBYTE[0x80fe] //8255端口C的地址

#defineCOM8255XBYTE[0x80ff]//8255命令字的地址

#defineDAC0832XBYTE[0x90ff]//DAC0832的地址

//以下為函數(shù)聲明

voidled_7s(ucharkeycode);

ucharkeyscan(void);

voidTime_init(void);

voiddelay(ucharx);uintcodetone_delay[]=

{1761,1569,1398,1319,1176,1047,933, //低音1234567

881,785,699,660,588,524,467, //中音1234567

440,392,349,330,294,262,233 //高音1234567

};

//下面為三首歌的樂(lè)譜

uintcodemusic_data[3][130]={//第一首:低中高21個(gè)音

{1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7, 8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,

14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,

18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,0xff},

//第二首:警鈴聲

{12,12,12,12,12,12,12,12,2,2,2,2,2,2,0xff},

//第三首:兩只老

//兩只老虎,兩只老虎,跑得快,跑得快 {8,8,8,8,9,9,9,9,10,10,10,10,8,8,8,8,

8,8,8,8,9,9,9,9,10,10,10,10,8,8,8,8,

10,10,10,10,11,11,11,11,12,12,12,12,12,12,12,12,

10,10,10,10,11,11,11,11,12,12,12,12,12,12,12,12,

//一只沒(méi)有眼睛,一只沒(méi)有耳朵,真奇怪,真奇怪

12,12,12,13,12,12,12,11,10,10,10,10,8,8,8,8,

12,12,12,13,12,12,12,11,10,10,10,10, 8,8,8,8,12,12,12,12,8,8,8,8,8,8,8,8,

8,8,8,8,12,12,12,12,8,8,8,8,8,8,8,8,0xff

}

};

ucharmusic_sel=0,music_tone=0;

//***********定時(shí)器T1初始化函數(shù)****************//

voidTimer_init(void)

{ TMOD=0x10; //定時(shí)器1方式1:16位定時(shí)器

IE=0x88; //開(kāi)中斷,T1中斷

}

//*************定時(shí)器1中斷函數(shù)*****************//

voidTimer1_Int(void)interrupt3using1

{ TH1=-tone_delay[music_data[music_sel][music_tone]-1]/256;

TL1=-tone_delay[music_data[music_sel][music_tone]-1]%256;

PB8255=PB8255^0x10;

//控制輸出特定頻率,使喇叭發(fā)出特定聲音

}

//*****************播放音樂(lè)函數(shù)****************//

//使用12號(hào)按鍵控制播放的音樂(lè):按1次播放第一首,

//按2次播放第二首,按3次播放第三首,再按1次轉(zhuǎn)回播第一首

voidmusi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論