我用的是STC 80C52,調試了好久,沒能實現,不知啥情況。這是我的代碼。
- #include "reg51.h" //此文件中定義了單片機的一些特殊功能寄存器
- #include "intrins.h"
- typedef unsigned int u16; //對數據類型進行聲明定義
- typedef unsigned char u8;
- u8 w;
- u16 j,n,m;
- sbit SRCLK=P3^6;
- sbit RCLK=P3^5;
- sbit SER=P3^4;
- sbit speaker=P1^5;
- u8 code led[9][10]={
- {0x28,0xBF,0x24,0x01,0xF7,0x98,0xF7,0x01}, //祝
- {0x44,0x48,0x5F,0x69,0x49,0x49,0x4F,0x40}, //石
- {0x25,0x6D,0xB5,0x25,0x00,0x41,0x7F,0x41}, //紅
- {0x24,0x28,0xFF,0x28,0x00,0x5F,0xDF,0x5F}, //梅
- {0x15,0x25,0x65,0x25,0xFF,0x25,0x25,0x25}, //生
- {0x00,0x7F,0x49,0x49,0x49,0x49,0x7F,0x00}, //日
- {0x38,0xFF,0x38,0x01,0x2A,0xFC,0x2A,0x39}, //快
- {0x18,0x29,0x4A,0x88,0xBF,0x88,0x0A,0x09}, //樂
- };
- unsigned char timer0h,timer0l,time;
- //生日歌
- code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
- 5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
- 5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
- 4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};
- // 音階頻率表 高八位
- code unsigned char FREQH[]={
- 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
- 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
- 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
- 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
- } ;
- // 音階頻率表 低八位
- code unsigned char FREQL[]={
- 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
- 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
- 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
- 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
- };
- void delay(unsigned char t)
- {
- unsigned char t1;
- unsigned long t2;
- for(t1=0;t1<t;t1++)
- {
- for(t2=0;t2<8000;t2++)
- {
- ;
- }
- }
- TR1=0;
- }
- void t0int() interrupt 1
- {
- TR0=0;
- speaker=!speaker;
- TH0=timer0h;
- TL0=timer0l;
- TR0=1;
- }
- void song()
- {
- TH0=timer0h;
- TL0=timer0l;
- TR0=1;
- delay(time);
- }
- void play()
- {
-
- unsigned char k,i;
- TMOD=1; //置CT0定時工作方式1
- EA=1;
- ET0=1;//IE=0x82 //CPU開中斷,CT0開中斷
- while(1)
- {
- int a=0;
- i=0;
- while(i<75){ //音樂數組長度 ,唱完從頭再來
- k=sszymmh[i]+7*sszymmh[i+1]-1;
- timer0h=FREQH[k];
- timer0l=FREQL[k];
- time=sszymmh[i+2];
- i=i+3;
- song();}}}
- /*******************************************************************************
- * 函 數 名 : delay
- * 函數功能 : 延時函數,i=1時,大約延時10us
- *******************************************************************************/
- void delay1(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函數名 : Hc595SendByte(u8 dat)
- * 函數功能 : 向74HC595發送一個字節的數據
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void Hc595SendByte(u8 dat)
- {
- u8 a;
- SRCLK=0;
- RCLK=0;
- for(a=0;a<8;a++)
- {
- SER=dat>>7;
- dat<<=1;
- SRCLK=1;
- _nop_();
- _nop_();
- SRCLK=0;
- }
- RCLK=1;
- _nop_();
- _nop_();
- RCLK=0;
- }
- void deng()
- {
- while(1)
- {
- for(n=0;n<8;n++) //第一維下標取值范圍為祝、石、紅、梅、生、日、快、樂,7個字符
- {for(m=0;m<200;m++) //每個字符掃描顯示200次,控制每個字符顯示漢字
- { w=0x01; //行初值
- for(j=0;j<9;j++) //第二維下標取值范圍為0~7,控制8行
- {Hc595SendByte(w); //行控制
- P0=~led[n][j]; //列控制,將指定數組元素取反后賦值給P0口,顯示碼
- delay1(60);
- w<<=1; //行變量左移指向下一行
- P0=0xff;
- }
- }
- }}}
-
- void init()
- {
- TMOD=0x01;
- TL0=0;
- TH0=0;
- ET0=1;
- EA=1;
- TR0=1;
- }
- /*******************************************************************************
- * 函 數 名 : main
- * 函數功能 : 主函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- init();
- while(1)
- {
-
- deng();
- }
- }
- void time0() interrupt 3
- {
- play();
- }
復制代碼 |