用到串口2,因为串口1的话会影响下载,需每次拔插线。
#include <STC12C5A60S2.H>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define S2RI 0x01 //串口2接收中断请求标志位
#define S2TI 0x02 //串口2发送中断请求标志位
#define uchar unsigned char
#define uint unsigned int
uint SpeakerInt(int ida);
//*****************************************************
uchar nBkm = 0x00;
//*****************************************************
#define HEADLEN 5 //数据包头的长度
#define BKM_OFFSET 4 //背景音乐命令偏移
#define LEN_OFFSET 2 //长度字节的偏移量(一般不会超过255字节,因此只使用1字节长度)
#define BKM_MAX 15 //背景音乐数量
//*****************************************************
//数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
uchar head[HEADLEN] = {0xfd,0x00,0x00,0x01,0x00};
//****************************************************
//延时
void Delay(uint z)
{
uint x,y;
for(x=z; x>0; x--)
for(y=920; y>0; y--);
}
void UART_Init(void)
{
TMOD = 0x20; //定时器1工作在方式2 8位自动重装
SCON = 0x50; //串口1工作在方式1 10位异步收发 REN=1允许接收
TH1 = 0xFA; //定时器1初值
TL1 = TH1;
TR1 = 1; //定时器1开始计数
EA =1; //开总中断
ES =1; //开串口1中断
AUXR &= 0xF7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x10; //启动独立波特率发生器
}
//串口1发送数据
void SendCharone(uchar n)
{
SBUF = n;
while (TI==0);//发送数据
TI=0;
}
//串口2发送数据
void SendChar(uchar n)
{
S2BUF = n;
while(!(S2CON&S2TI)); //若S2TI=0,在此等待
S2CON&=~S2TI; //S2TI=0
}
//背景音乐(参数为0表示关闭背景音乐)
void BkMusic(uchar num)
{
num %= BKM_MAX + 1;
nBkm = num;
}
//发声程序
void Speech(uchar *buf)
{
uchar i = 0; //循环计数变量
uchar xor = 0x00; //校验码初始化
uchar ch = 0x00;
uchar len = 0x00;
while(buf[len++]);
//发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
for(i = 0; i < HEADLEN; i++)
{
if(i == BKM_OFFSET)
ch = nBkm << 3; //写入背景音乐
else if(i == LEN_OFFSET)
ch = len + 3;
else
ch = head[i];
xor ^= ch;
SendChar(ch);
Delay(1);
}
//发送文字内容
for(i = 0; i < len; i++)
{
xor ^= buf[i];
SendChar(buf[i]);
Delay(1);
}
SendChar(xor); //发送校验位
Delay(50);
Delay(50);
}
//主函数
void main()
{
uchar nBkm = 0x01; //演示背景音乐编号
UART_Init(); //初始化串口为 9600bps
BkMusic(0); //关闭背景音乐
Delay(50);
Speech("呵呵");
Delay(2000);
SpeakerInt(123);
while(1);
}
//语音读整数
uint SpeakerInt(int ida)
{
uint i;
uint negative=0;
uint intLen=5;
char cdat[6]={0};
if (ida < 0){
ida = abs(ida);
negative = 1;
}
cdat [0] = (char)(ida / 10000 ) ;
cdat [1] = (char)((ida % 10000) /1000);
cdat [2] = (char)((ida % 1000) /100);
cdat [3] = (char)((ida % 100) /10);
cdat [4] = (char)((ida % 10) /1);
for (i=0;i<5;i++){
cdat[i] = cdat[i] + 48;
}
if (cdat[0] == '0'){
intLen = 4;
if (cdat[1] == '0'){
intLen = 3;
if (cdat[2] == '0'){
intLen = 2;
if (cdat[3] == '0')
intLen = 1;
}
}
}
if (negative == 1){
Speech("零下");
Delay(1000);
}
Speech(& cdat[5-intLen]);
return 0;
}