下载地址:《PM60串行放音程序示例》 //单片机用at89s51,晶振为12MHZ,上电自动从80h到8bh顺序放音,如此循环 #include "reg51.h" #define uchar unsigned char //I/O脚的定义 sbit tx_pin= P0^1; //数据脚 k1 sbit clk_pin= P0^2; //时钟脚 k2 sbit busy_pin=P0^3; //BUSY脚 o1 sbit rst_pin= P0^4; //复位脚 reset void delay(uchar time); //函数声明 void send_play(uchar sound_no); //函数声明 //************主程序**************// void main(void) { uchar sound_number; //定义变量并赋初值 P0= P1=P2=P3=0xff; rst_pin=0; //PM60复位脚拉低 TMOD=0x10; //TMOD:计数器1,工作方式1,16位定时/计数,最大65536 EA=0; delay(500); //延时给PM60的复位延迟500MS rst_pin=1; //复位管脚拉高 delay(100); //复位后延时100ms while(1) { for(sound_number=0;sound_number<12;sound_number++) //循环放音 { send_play(sound_number); //放音子程序 } } } //*************延时子程序(单位ms)************// void delay(uchar time) { uchar t; for(t=time;t>0;t--) { TH1=0xfc; TL1=0x18; TR1=1; //计数器1启动 while(TF1!=1) //计数溢出处理 { } TF1=0; TR1=0; } } //***********放音子程序***************// void send_play(uchar sound_no) //sound_no为要放音的段数 { uchar sd = sound_no + 0x80; //第一段为80H uchar loop; clk_pin = 1; //时钟置1 tx_pin = 0; //数据端置0 delay(10); //启动延时20MS tx_pin = 1; //数据端置1 delay(10); //启动延时20ms for(loop = 0;loop < 8; loop++) //发送数据 8个 { clk_pin = 0; //时钟置 0 tx_pin = (sd & 0x01); //先发低位 sd = sd >> 1; //右移一位 delay(10); //发送频率50HZ( 1s/20ms ) clk_pin = 1; //时钟置 1 delay(10); } tx_pin = 1; //数据发送完,数据引脚置1 delay(10); while(busy_pin); //检测忙信号 } |