购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

程序设计

根据系统要求,程序主要实现接收上位机发送的指令,并按照要求进行录/放音。因此,程序主要包括ISD4004控制子程序、串口通信子程序和主程序等。主程序的操作流程如图6-2所示。

图6-2 主程序的操作流程

注意

单片机与上位机间的通信由串口完成,本实例根据需要定义数据通信协议,读者可将其作为参考,也可自行定义指令代码及数据通信协议。

主程序首先初始化系统,然后调用串口通信子程序获得上位机指令,根据指令调用ISD4004控制子程序实现录音和放音。主程序的代码如下。

mrecordvoice()为录音程序。在上位机通过串口发来的数据中,第2个字节是录音时间,可以是3s、5s、8s、10s及20s;第3个字节是录音指令;第4个字节是序号。录音程序根据录音时间及序号计算本次录音的存储位置,根据录音时间设置定时时间,向ISD4004发送录音指令启动录音,定时时间到,停止录音。mrecordvoice()的代码如下。

mplayvoice()为放音程序。与mrecordvoice()一样,在上位机通过串口发来的数据中,第2个字节是放音时间,第3个字节是放音指令,第4个字节是序号。mplayvoice()根据放音时间及序号计算放音数据在存储器中的位置,向ISD4004发送放音指令启动放音,放音结束后,发送停止指令。mplayvoice()的代码如下。

在通信过程中,为了保证数据传输的准确性,通常需要遵循一定的协议。函数Service_Rec()的功能是对串口接收到的数据进行校验并处理,代码如下。

上位机每发送一个指令需要通过串口发送多个数据,这些数据不一定是连续发送的,因此下位机的串口程序需要具有超时控制功能。当下位机接收到第一个数据时,启动定时。若定时时间到,下位机未收到指定个数的数据,则这次传输超时。此时下位机应该重新等待接收第一个数据。函数Service_Timer0()的功能是对串口数据传输进行超时控制,代码如下。

函数Service_Serial()的功能是对串口收发中断进行处理。在本实例中,发送数据和接收数据都采用中断方式。由于AT89S52发送数据和接收数据共用一个中断,因此中断服务程序要对其加以区分。Service_Serial()的代码如下。

本实例使用了很多延时函数,以下为不同时长的延时函数,便于在程序中调用,代码如下。

程序设计的关键是对ISD4004的操作。ISD4004有许多指令,这些指令通过SPI传给ISD4004。AT89S52没有SPI,因此需要用程序模拟SPI。函数ISD_WriteSpi()的功能是模拟SPI向ISD4004发送1字节数据,代码如下。

函数ISD_OneCode()的功能是向ISD4004发送单字节指令,代码如下。

函数ISD_MultiCode()的功能是向ISD4004发送多字节指令,代码如下。

函数Ini_ISD()的功能是初始化ISD4004,代码如下。

函数Play_Voice()的功能是对ISD4004进行放音控制,播放Addrp指定地址的语音。Play_Voice()调用ISD_MultiCode()向ISD4004发送设置放音地址指令,再发送放音指令,代码如下。

函数Record_Voice()的功能是对ISD4004进行录音控制,向Addrr指定的地址存储语音,代码如下。 azNOmDDNQ9r25UVgJz8HSEKtPdqITzComdaSDUxFb2FeIwwoD4Q2I1cC9wj2xAyL

点击中间区域
呼出菜单
上一章
目录
下一章
×