PM66串列例程

PM66串列例程

sbit sbit sbit

pm66例程介紹

本例程採用51單片機12M晶振,各連線埠可自行定義,循環播放0x00-0x3B地址下的語音。
PM66晶片的K1端為數據接收端,K2為時鐘端,O1、O2為忙信號端。
放音期間忙信號O1端為高電平,忙信號O2端為低電平。

PM66例程時序

PM66 C例程

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P2^7;//定義數據端
sbit K2 = P2^6;//定義時鐘端
sbit O1 = P2^5;//定義忙信號端
//sbit O2 = P2^3;
//***************延時子程式(單位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;
}
}
//***************延時子程式(8μs)***************//
void delay_1 (uint c)
{
while (--c);
}
//***************發碼子程式***************//
void sp (uchar k1_data)
{
uchar i;
K2 = 1;
K1 = 0;
delay(6);
K1 = 1;
delay(6);//數據端初始化,拉低拉高6MS等待接收數據,延時時間可修改(6MS-100MS)
for(i=0; i<8; i++)//傳送8位數據
{
K2 = 0;
if((k1_data&0x01)==1)
{
K1 = 1;
}
else
{
K1 = 0;
}
k1_data = k1_data>>1;
delay_1(76);
K2 = 1;
delay_1(76);//發碼頻率(500HZ)
}
K1 = 1;
}
//***************主程式***************//
void main (void)
{
uint h;
TMOD = 0x10; //TMOD:計數器1,工作方式1,16位定時/計數,最大65536
EA = 0;
while(1)
{
for(h=0x00; h<0x3d; h++)
{
sp(h);
while(O1 == 1);
//while(O2 == 0);
delay_1(10);//PM66晶片判斷完忙信號後需要加個延時
}
}
}

PM66 彙編例程

K1 EQU P2.7 ;數據端
K2 EQU P2.6 ;時鐘端
O1 EQU P2.5 ;忙信號
;************************
;* *
;* 主程式 *
;* *
;************************
ORG 0000H
AJMP MAIN
MAIN: MOV P0, #0FFH
MOV P1, #0FFH
MOV P3, #0FFH ;初始化
MOV R1, #00H ;R1為需要防音的段數
PLAY: SETB K2
CLR K1
ACALL DELAY
SETB K1
ACALL DELAY ;調用延時等待接收數據PM66晶片拉低拉高等待接收數據需要保持一致
MOV A, R1
ADD A, #00H ;00H為放音的首地址
MOV R2, #08H ;傳送送8為數據
;傳送數據
PLAY1: CLR K2
RRC A ;帶進位右移
MOV K1, C ;將ACC的數據送到K1端
ACALL DELAY1
SETB K2
ACALL DELAY1 ;傳送頻率500HZ
djnz R2, PLAY1 ;循環傳送數據
SETB K1
JB O1, $ ;等待O1拉低,放音結束
ACALL DELAY1 ;PM66晶片判斷完忙信號需要有一定的延時在繼續發碼
INC R1
CJNE R1, #3BH, PLAY ;判讀所有段是否放完
AJMP MAIN ;循環放音
;6ms延時
DELAY: MOV TMOD, #01H
MOV TH0, #0E8H
MOV TL0, #90H
SETB TR0
JNB TF0, $
CLR TF0
CLR TR0
RET
;1ms延時
DELAY1:MOV TMOD, #01H
MOV TH0, #0FCH
MOV TL0, #18H
SETB TR0
JNB TF0, $
CLR TF0
CLR TR0
RET

相關詞條

熱門詞條

聯絡我們