完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
测试程序如下: 可是仍然没有声音。
/****************************************************************************** - 实现功能:实现芯片上电分别指定播放第一曲和第二曲,基本的程序供用户测试 - 运行环境:STC 晶振:11.0592M 波特率:9600 - 备注 :在普中科技的 51 开发板上调试 OK --- STC89C516RD+ 1、该测试程序必须是模块或者芯片方案中有设备在线, 譬如 U 盘、 TF 卡 ******************************************************************************/ #include "REG52.h" #define COMM_BAUD_RATE 9600 //串口波特率 #define OSC_FREQ 11059200 //运行晶振: 11.05926MHZ #define INT8U unsigned char #define INT16U int #define INT32U long int
unsigned char Send_buf[10] = {0};
void Delay_Ms(INT32U z) { INT32U x=0 , y=0; for(x=110 ; x>0 ;x--) for(y=z; y>0;y-- ); }
/****************************************************************************** - 功能描述: 串口 1 初始化 - 注: 设置为 9600 波特率 ******************************************************************************/
void Serial_init(void) { TMOD = 0x20; // 设置 T1 为波特率发生器 SCON = 0x50; // 0101,0000 8 位数据位, 无奇偶校验 PCON = 0x00; //PCON=0; TH1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);//设置为 9600 波特率 TL1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);
TR1 = 1; //定时器 1 打开 REN = 1; //串口 1 接收使能 ES = 1; //串口 1 中断使能 }
void Uart_PutByte(INT8U ch) { SBUF = ch; while(!ti){;} TI = 0; }
/****************************************************************************** - 功能描述: 串口向外发送命令[包括控制和查询] - 参数说明: CMD:表示控制指令, 请查阅指令表, 还包括查询的相关指令 feedback:是否需要应答[0:不需要应答,1:需要应答] data:传送的参数 ******************************************************************************/
void SendCmd(INT8U len) { INT8U i = 0 ; Uart_PutByte(0x7E); //起始 for(i=0; i { Uart_PutByte(Send_buf) ; } Uart_PutByte(0xEF) ;//结束 }
/****************************************************************************** - 功能描述:求和校验 - 和校验的思路如下: 发送的指令, 去掉起始和结束。 将中间的 6 个字节进行累加, 最后取反码。 接收端就将接收到的一帧数据,去掉起始和结束。 将中间的数据累加, 再加上接收到的校验字节。 刚好为 0.这样就代表接收到的数据完全正确。 ******************************************************************************/
void DoSum( INT8U *Str, INT8U len) { INT16U xorsum = 0; INT8U i; for(i=0; i { xorsum = xorsum + Str; } xorsum = 0 -xorsum; *(Str+i) = (INT8U)(xorsum >>8); *(Str+i+1) = (INT8U)(xorsum & 0x00ff); }
void Uart_SendCMD(INT8U CMD ,INT8U feedback , INT16U dat) { Send_buf[0] = 0xff; //保留字节 Send_buf[1] = 0x06; //长度 Send_buf[2] = CMD; //控制指令 Send_buf[3] = feedback;//是否需要反馈 Send_buf[4] = (INT8U)(dat >> 8);//datah Send_buf[5] = (INT8U)(dat); //datal DoSum(&Send_buf[0],6);//校验 SendCmd(8); //发送此帧数据 }
void main() { Serial_init();//串口寄存器的初始化设置 //Uart_SendCMD(0x03 , 0 , 0x01) ;//播放第一首 //Delay_Ms(1000);//延时大概 6S //Uart_SendCMD(0x03 , 0 , 0x02) ;//播放第二首 //Delay_Ms(1000);//延时大概 6S Uart_SendCMD(0x03 , 0 , 0x04) ;//播放第四首 while(1) ; } |
|
相关推荐
1个回答
|
|
大哥, 你的DoSum函数内的 for循环的是不完整的, 请补全
|
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1099浏览 3评论
568浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2300浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1855浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 17:20 , Processed in 1.232289 second(s), Total 84, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号