|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2010-11-27 20:38:36
|
显示全部楼层
发个按键读数的源码,大家自己改撒
/***********************************************************
**
** 北京宇音天下公司 SYN6288 中文语音合成芯片测试程序演示版
**
** 本程序用于89C51/89C52/89S51/89S52及与其兼容的其他单片机
**
** 作 者:CIKY & SPP From Dreamon-II Labs.
**
** 版权所有:追梦计算机及电子技术实验室
**
** 最后修改:2010-05-06 凌晨 03:22
**
***********************************************************/
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define KEY P0 //P1用于键扫描
#define BUFLEN 32 //文字缓冲区的长度
#define HEADLEN 5 //数据包头的长度
#define LEN_OFFSET 2 //长度字节的偏移量(本例中长度不超过255字节,因此只使用1字节长度)
//数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
uchar head[HEADLEN] = {0xfd,0x00,0x00,0x01,0x00};
//文字(中间有需要变化的内容可在发送前修改)
uchar text[BUFLEN] = {"溶液温度 度"};
//延时1ms
void Delay1ms(uchar n)
{
uchar i=112;
while(n--)
{
while(i--);
}
}
//串口初始化
void UART_InitBaud(void)
{
SCON=0xD8 ; //晶振为11.059MHZ时,设定串口波特率为9600bit/s,方式3
TMOD=0x20 ;
PCON=0x00 ;
TH1=0xFD ;
TR1=1;
}
//串口发送数据
void UART_Trans(uchar n)
{
SBUF = n;
while(TI==0); //发送数据
TI=0;
}
//发声程序
void Speech(uchar *buf, uchar len)
{
uchar i = 0; //循环计数变量
uchar xor = 0x00; //校验码初始化
head[LEN_OFFSET] = len + 3; //计算正文长度(1命令字 + 1命令参数 + 文字长度 + 1校验位)
//发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
for(i = 0; i < HEADLEN; i++)
{
xor ^= head;
UART_Trans(head);
Delay1ms(2);
}
//发送文字内容
for(i = 0; i < len; i++)
{
xor ^= buf;
UART_Trans(buf);
Delay1ms(2);
}
UART_Trans(xor); //发送校验位
}
//主函数
void main()
{
uchar xor = 0; //校验码(正文内容的异或)
uchar i = 0; //循环计数变量
float num = 123.45; //测试值,可以由用户程序自动生成
uchar numbuf[10];
memset(numbuf,0,sizeof numbuf);
UART_InitBaud(); //初始化串口为 9600bps
while(1)
{
if(KEY != 0xff)
{
Delay1ms(10);
if(KEY != 0xff)
{
sprintf(text + 10,"%6.2f",num); //将浮点数 num 转为字符串,
//并追加到数组text[]的第6字节后
//(前6字节为字符串“当前值”)
//参见库函数sprintf()的用法
num -= 0.43;
Speech(text,20); //调用发声函数,读出指定长度数据
}
}
Delay1ms(100); //延时
}
} |
|