
语音对讲
-
2023年3月20日发(作者:蜀鸡)兰州理工大学
本科毕业设计
(2011届)
题目基于单片机的无线语音对讲系统设计
学院电信学院
专业电子信息科学与技术
班级电子二班
学号
学生姓名
指导教师缑新科
完成日期
诚信承诺
我谨在此承诺:本人所写的毕业论文《基于CC2500的语音对讲系
统设计》均系本人独立完成,没有抄袭行为,凡涉及其他作者的观点
和材料,均作了注释,若有不实,后果由本人承担。
承诺人(签名):
年月日
杭州电子科技大学本科毕业设计
摘要
本毕业设计主要设计自主研发的基于CC2500的语音对讲系统,实现短距离的
语音对讲。在现代通信中,对讲机是一种近距离的、简单的无线传输通信工具,
由于它不需要中转站和地面交换机站支持,就可以进行有效的移动通信,因此深
受人们欢迎。目前,它广泛应用于生产、保安、野外工程等领域的小范围移动通
信工程中。
考虑到研究的针对性,基于CC2500的无线对讲系统的原理是通过STC89C52
单片机控制,读取存于FLASH里的PCM编码信号,进行处理后通过CC2500模块发
送,接收机通过CC2500模块接收到信号后通过STC89C52模拟PWM波输出。其音
频放大电路是通过LM358跟4871放大送到3欧喇叭。本文将具体介绍对讲系统的
硬件设计及软件编程设计过程。
关键词:CC2500模块;单片机;语音对讲
大学本科毕业设计
ABSTRACT
Thegraduationdesign,themaindesignbasedontheindependentresearchand
developmentCC2500speechtalkbacksystem,
moderncommunication,intercomisaclose,simplewirelesstransmission
communicationtools,becauseitdoesnotrequirestationandgroundswitchstation,can
effectivelysupportthemobilecommunications,ent,itis
widelyusedinproduction,security,fieldengineeringandotherareasofsmallrangeof
mobilecommunicationengineering.
Consideringthepertinence,basedonresearchCC2500wirelesstalkbacksystem
principleisthroughSTC89C52MCUcontrol,readstoredinFLASHpulsecode
modulation(PCM).thesignalprocessingCC2500moduleaftersendingbyCC2500
module,receiverreceivedbySTC89C52simulationPWMsignalafterthroughwavelet
ioamplificationcircuitisamplifiedbyLM358and4871to3Ωspeakers.
Keywords
:
CC2500module
;
MCU
;
VoiceIntercom
杭州电子科技大学本科毕业设计
目录
1引言.............................................................................................................................1
2概述.............................................................................................................................2
2.1无线对讲系统概况..............................................................................................2
2.2射频芯片CC2500简介......................................................................................3
2.3单片机概述..........................................................................................................5
2.4研究的意义..........................................................................................................6
2.5本设计方案思路..................................................................................................6
3语音对讲系统硬件电路设计.......................................................................................7
3.1语音对讲系统总体设计框架..............................................................................7
3.2主控制器部分设计..............................................................................................7
3.3FLASH选择......................................................................................................11
3.4显示部分设计...................................................................................................12
3.5信号发射/接收模块设计...................................................................................12
3.6音频输出模块设计............................................................................................14
3.7按键电路设计....................................................................................................16
3.8电源部分设计...................................................................................................16
3.9本章小结............................................................................................................17
4语音对讲系统软件设计..............................................................................................18
4.1软件开发调试环境............................................................................................18
4.2软件总体设计框图............................................................................................18
4.3各模块程序设计...............................................................................................19
4.4本章小结............................................................................................................26
5制作与调试...............................................................................................................27
5.1原理图绘制及PCB制板..................................................................................27
5.2硬件电路的布线与焊接.................................................................................27
5.3调试.................................................................................................................28
6总结...........................................................................................................................30
致谢.................................................................................................................................31
参考文献.........................................................................................................................32
附录...................................................................................................................................0
大学本科毕业设计
1
1引言
专业对讲机通信作为专网移动通信的重要组成部分,其不受网络限制,在网
络未覆盖到的地方,可以让使用者轻松沟通,简单灵活的组网方式,更少的投入、
更优的性价比在许多特殊的行业与应用领域发挥着其它通信系统无法替代的作
用。传统的模拟对讲机设备在追求生产效率以及经济效益的今天,对讲机提供一
对一,一对多的通话方式,一按就说,操作简单,令沟通更自由,尤其是紧急调
度和集体协作工作的情况下,如在公共安全、应急调度、物资流通、货运、交通、
建筑施工、物业管理、餐饮服务等各个领域都扮演着重要的角色。但是传统的模
拟对讲机设备频谱利用率低,易受干扰,保密性差,业务单一等一些不可避免的
缺陷已经逐渐地体现出来。因此,推动传统的模拟通信设备向数字化发展将是解
决这些缺陷的非常有效的办法。目前,对讲机的数字化已受到全球高度重视。数
字对讲机设备的技术研究和标准化工作在欧美等发达国家已开始推进。
最近几年随着我国国民经济的快速发展,政府部门、警察、公共安全、公用
设施、医疗、消防及一些特殊部门等对专网移动通信有了新的要求,促使我国许
多企业投入大量人力物力研发自己的移动通信标准。这其中最具代表性的就是华
为的GT800系统和中兴的GoTa系统,不过十分遗憾的是这两个系统并未在国内
得到很好的推广。与之形成鲜明对比的是国外的TETRA、iDEN系统却在国内得
到了广泛的应用。另外国家虽然早在1995年就发布了无中心多信道选址移动通信
系统的国家标准,却并没又得到很好的发展。
我国信息产业部无线电管理局在2007年9月13同发布了《数字对讲机系统
设备无线射频技术指标要求》(试行)和2009年12月12日发布的《150MHz、400MHz
频段数字对讲机设备无线技术指标》的通知,为我国数字对讲机的发展提供了频
率保证和射频技术基本指标要求,也使得国内通信制造商的研发有章可循,从而
促进了国内数字对讲机设备的研发。
随着科技的发展人们对对讲机不断的提高要求,本文所研究的通过CC2500
模块构建语音对讲系统低功耗低成本有一定的实际意义。
大学本科毕业设计
2
2概述
2.1无线对讲系统概况
公众无线移动通信和专网移动无线通信同属于移动通信的范畴,是移动通信
的两大应用领域。公众移动通信发展迅速,已进入市场炒得火热的3G,其特点是
横向、跨行业、面向全社会。专网移动通信则以某些特定领域的应用或垂直的行
业应用为主,其所具有的强大的调度指挥功能、灵活多变的组网功能、独有的用
户优先级、一键呼叫业务、高保密性、高可靠性、为各行业量身定做的行业应用
功能、以及只需一次投入不用定期交纳服务费等都是公众移动通信系统所无法替
代的。专网无线通信系统主要包括三大类系统:集群通信系统、无中心通信系统
和对讲机。通过下面的介绍我们会发现对无线对讲系统的研究和发展是有一定的
现实意义的。
2.1.1集群移动通信系统
集群移动通信系统又叫专用业务调度系统,是专用无线电调度系统的一种高
级发展阶段。目前,集群移动通信基本已经从模拟时过度到了数字时代。可以说
是专网移动通信三大系统中最早实现数字化的系统。数字集群通信系统相对于模
拟集群通信系统,主要有高频谱利用率、高保密性、更好的话音质量、支持多种
业务、网络管理和控制更加有效和灵活等特点。我国数字集群移动通信系统体制
包括来自国外的TETRA、iDEN系统及国内的GoTa、GT800系统,由于TETRA
系统的开放性较好,技术也较为成熟,参与厂商也比较多,所以在国内发展较好,
而其它3种系统并未得到较好的应用。集群系统虽然功能强大,但总的来说建网
费用还是较高,这也是对讲机和无中心移动通信系统得以发展的原因之一。
2.1.2对讲机
专业对讲机通信作为专网移动通信的重要组成部分,以其更简单灵活的组网
方式、更少的投入、更优的性价比在许多特殊的行业与应用领域发挥着其它通信
系统无法替代的作用。传统的模拟对讲机设备在追求生产效率以及经济效益的今
天,在公共安全、应急调度、物资流通、货运、交通、建筑施工、物业管理、餐
饮服务等各个领域都扮演着重要的角色。但是传统的模拟对讲机设备频谱利用率
低,易受干扰,保密性差,业务单一等一些不可避免的缺陷已经逐渐地体现出来。
因此,推动传统的模拟通信设备向数字化发展将是解决这些缺陷的非常有效的办
法。目前,对讲机的数字化已受到全球高度重视。数字对讲机设备的技术研究和
标准化工作在欧美等发达国家已开始推进。
大学本科毕业设计
3
我国信息产业部无线电管理局在2007年9月13同发布了《数字对讲机系统
设备无线射频技术指标要求》(试行)和2009年12月12日发布的《150MHz、400MHz
频段数字对讲机设备无线技术指标》的通知,为我国数字对讲机的发展提供了频
率保证和射频技术基本指标要求,也使得国内通信制造商的研发有章可循,从而
促进了国内数字对讲机设备的研发。
2.1.3无中心移动通信系统
无中心移动通信系统是指没有作转发用基站的移动通信系统,900MHz无中心
选址系统在我国经历了10多年的使用,于1995年发布了两个国家标准:《无中心
多信道选址移动通信系统体制》和《无中心多信道移动通信设备总规范》。
无中心移动通信系统有其自身的优点,比如费用低廉,多信道公用,无需申请指
配频点等。目前,无中心移动通信系统和对讲机一样是只能进行通话的模拟系统,
也正在经历模拟转数字的过程,就目前而言,国内还没有成熟的数字无中心通信
系统投入市场。中国是移动通信最大的市场,这是由我国是世界第一人口大国和
我国经济的迅速发展决定的。但是相对于发展同趋成熟的公网移动通信,专网移
动通信可以说是刚刚起步。由上面的介绍我们可以看出,专网移动通信的三大类
系统在我国的发展都不是很理想。可是随着我国经济的发展,公共安全对专网移
动通信的需求却日渐增长。近些年南方雪灾、汶川地震、玉树地震的发生让我们
深刻体会到了对讲机在应对突发事件的巨大作用。可以预见,在我国经济迅猛发
展的今天,数字对讲机必将在囤计民生和公共安全领域发挥越来越重要的作用,
有着巨大的发展前景。现在中国的专网移动通信正在经历模转数的过程,对讲机、
无中心系统的数字化是移动通信领域罩最后一块由模拟转数字的市场。新型的专
网数字移动通信系统也随着对讲机的数字化应运而生,未来将成为专网系统的主
力军。为避免再出现公网数字化和集群数字化过程中核心技术受制于国外的情形,
迫切需要我国的研发人员能真正掌握该领域的核心技术,所以对数字对讲机的研
究意义重大。
2.2射频芯片CC2500简介
射频模块采用Chipcon公司生产的CC2500芯片,它是一款超低功耗、低成本
的无线收发模块,其载频范围在2。400GHz~2。483GHz的ISM频段由一个完全
集成的频率调制器一个解调器的接收器一个功率放大器一个晶体振荡器和一个调
节其组成。工作特点是自动产生前导码和CRC可以很容易通过SPI接口进行编程
配置,电流消耗低。空闲信道评估CCA(ClearChannelAssessment)功能是指当
CC2500处于RX状态时,可以检测自身所处信道的电磁场的强弱以判断该信道是
否空闲。本设计中利用该功能来避免多个标签同时响应阅读器查询时发生的碰撞。
当一个标签收到阅读器的查询时,让它先进行CCA检测,若检测到该信道忙,表
大学本科毕业设计
4
明已经有其他标签响应了,自身不再响应,等待下一次查询命令到来,否则正常
响应。
图2-1CC2500简化框图
CC2500简化框图如图2-1所示,RF收发器集成了一个数据传输率可达500kbps
的高度可配置的调制解调器。通过开启集成在调制解调器上的前向误差校正选项,
能使性能得到提升。CC2500为数据包处理、数据缓冲、突发数据传输、清晰信
道评估、连接质量指示和电磁波激发提供广泛的硬件支持。CC2500的主要操作
参数和64位传输/接收FIFO(先进先出堆栈)可通过SPI接口控制。在一个
典型系统里,CC2550和一个微控制器及若干被动元件一起使用。CC2500基于
0.18微米CMOS晶体的Chipcon的SmartRF04系列。
CC2500主要特性:体积小(QLP4×4mm封装,20脚);真正的单片2.4GHz
RF(射频)收发器高灵敏度(10kbps下-98dBm,1%数据包误差率);可编程控制
的数据传输率,可达500kbps;较低的电流消耗(RX中15.6mA);可编程控制
的输出功率,可达+1dBm;优秀的接收器选择性和模块化性能;极少的外部元件:
芯片内频率合成器,不需要外部滤波器或RF转换;可编程控制的基带调制解调
器;理想的多路操作特性;可控的数据包处理硬件;快速频率变动合成器带来的
合适的频率跳跃系统;可选的带交错的前向误差校正;单独的64字节RX和TX
数据FIFO;高效的SPI接口:所有的寄存器能用一个“突发”转换器控制数字
RSSI输出;与遵照EN300328,EN300440class2(欧洲),CFR47Part15(美国),
和ARIBSTD-T66(日本)标准的系统相配;自动低功率RX拉电路的电磁波激活功
大学本科毕业设计
5
能;许多强大的数字特征,使得使用廉价的微控制器就能得到高性能的RF系统;
集成模拟温度传感器;自由引导的“绿色”数据包;对数据包导向系统的灵活支
持:对同步词汇插入的芯片侦测,地址检查,灵活的数据包长度及自动CRC处
理;可编程信道滤波带宽;OOK和灵活的ASK整型支持;2-FSK和MSK支持;
自动频率补偿可用来调整频率合成器到接收中间频率;对数据的可选自动白化处
理;对现存通信协议的向后兼容的异步透明接收/传输模式的支持;可编程的载波
感应指示器;可编程前导质量指示器及在随机噪声下改进的针对同步词汇侦测的
保护;支持传输前自动清理信道访问(CCA),即载波侦听系统;支持每个数据包
连接质量指示。
2.3单片机概述2
单片机也被称为微控制器(Microcontroller),是因为它最早被用在工业控制领
域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将
大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂
的而对体积要求严格的控制设备当中。
STC单片机:STC公司的单片机主要是基于8051内核,是新一代增强型单片
机,指令代码完全兼容传统8051,速度快8~12倍,带ADC,4路PWM,双串口,
有全球唯一ID号,加密性好,抗干扰强。
PIC单片机:是MICROCHIP公司的产品,其突出的特点是体积小,功耗低,
精简指令集,抗干扰性好,可靠性高,有较强的模拟接口,代码保密性好,大部
分芯片有其兼容的FLASH程序存储器的芯片。
EMC单片机:是台湾义隆公司的产品,有很大一部分与PIC8位单片机兼容,
且相兼容产品的资源相对比PIC的多,价格便宜,有很多系列可选,但抗干扰较
差。
ATMEL单片机(51单片机):ATMEL公司的8位单片机有AT89、AT90两个
系列,AT89系列是8位Flash单片机,与8051系列单片机相兼容,静态时钟模式;
AT90系列单片机是增强RISC结构、全静态工作方式、内载在线可编程Flash的单
片机,也叫AVR单片机。
PHLIPIS51PLC系列单片机(51单片机):PHILIPS公司的单片机是基于80C51
内核的单片机,嵌入了掉电检测、模拟以及片内RC振荡器等功能,这使51LPC
在高集成度、低成本、低功耗的应用设计中可以满足多方面的性能要求。
HOLTEK单片机:台湾盛扬半导体的单片机,价格便宜,种类较多,但抗干
扰较差,适用于消费类产品。
TI公司单片机(51单片机):德州仪器提供了TMS370和MSP430两大系列通
用单片机。TMS370系列单片机是8位CMOS单片机,具有多种存储模式、多种
大学本科毕业设计
6
外围接口模式,适用于复杂的实时控制场合;MSP430系列单片机是一种超低功耗、
功能集成度较高的16位低功耗单片机,特别适用于要求功耗低的场合
松翰单片机(SONIX):是台湾松翰公司的单片,大多为8位机,有一部分与
PIC8位单片机兼容,价格便宜,系统时钟分频可选项较多,有PMWAD内振内部
杂讯滤波。缺点RAM空间过小,抗干扰较好。
2.4研究的意义
由于语音对讲系统越来越广泛的就用于公安、民航、运输、铁路、水利、服
务、建筑等行业。用于团体成员间的联络和指挥调度,以提高沟通效率和提高处
理实发事件的快速反应能力,随着对讲机进入民用市场,人们外出购物、旅游也
开始越多的使用对讲机。短距离语音对讲系统的种类也越来越多种,本着物尽其
用的原则,在一些场合对于短距离语音通信要求不是很高的情况下,没有必要去
买价格比较贵的对讲机。所以本课题可以很好的解决短距离语音通信,基于CC2500
的语音对讲系统成本低,功耗低可以节省资源浪费。
2.5本设计方案思路
基于CC2500的功能比较强大,其各方面的优点可以用来传输比较大的PCM
编码,用单片机控制其发送音频信号能达到8KHZ的电话音质,故而想到用其做
一个简易的语音对讲系统,基于这里研究的主要为CC2500,所以语音对讲系统的
语音输入PCM编码调制省略为用单片机读取存于FLASH里的PCM编码来替代。
大学本科毕业设计
7
3语音对讲系统硬件电路设计
3.1语音对讲系统总体设计框架
考虑到研究的针对性,本设计主要针对CC2500模块的研究。对讲系统省略去
语音输入的PCM调制,基于CC2500的语音对讲系统的体框图如下图(图2-4)。
图2-4系统框图
单片机控制读取存于4M-bitFlash中的PCM编码,送CC2500模块发送,从
机通过CC2500模块接收数据,接收到的数剧通过单片机模拟产生PWM波输出到
音频输出模块。音频输出模块用RC滤波电路滤波再通过LM385跟4871放大送喇
叭发生。切换键用来切换接收还是发送数据,由数码管显示系统工作在何种模式
(接收、发送)。
3.2主控制器部分设计2
利用单片机的具有的微型计算机及存储功能进行设计发送和接收模块的。本
系统使用了stc89c51。STC89C51系列单片机是从引脚到内核都完全兼容标准8051
的单片机,有PDIP(塑料双列直插式封装,芯片封装的形式之一)-40、PLCC(特
殊引脚芯片封装,它是贴片封装的一种)-44、PQFP(塑料方块平面封装,一种芯
片封装形式)-44三种封装形式。STC推出的系列51单片机芯片是全面兼容其它
51单片机的。STC89C51/芯片分别含有4K/字节FLASHROM供用户编程使用。
STC89C系列单片机是高速/低功耗的新一代8051单片机,最高工作频率可分别达
到25MHz~50MHz,具体在芯片上的型号名称后以“-XX”标注。STC89C系列单
大学本科毕业设计
8
片机有较宽的工作电压,5V型号的可工作于3.4V~6.0V,3.3V型号的可工作于
2.0V~4.0V(ISP/IAP操作时对电压要求会稍严)。正常工作模式下的典型耗电为
4mA~7mA,空闲模式为2mA,掉电模式’(可由外部中断唤醒)下则小于0.1μA。
此外,STC89C系列单片机在完全兼容8052芯片(在标准8051基础上增加了T2定
时器和128字节内部RAM)的基础上,新增了许多实用功能。本次选用
本次选用了PDIP-40的51单片机,这款单片机一共有40pin引脚。RST(复位输
入端),当振荡器运行时,在该引脚上出项两个机器周期的高电平将是单片机复位。
ALE/PROG当访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的
低位字节。即使不访问外部存储器,ALE端仍以不变的频率(此频率为振荡器的
频率的1/6)周期性地出现正脉冲信号。因此,它可用作对外输出地时钟,或用于
定时目的。然而,要注意的是:每当访问外部数据存储器时,将跳过一个ALE脉
冲。在对FLASH存储器编程期间,该引脚还用于输入编程脉冲(/PROG)。如必
要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE
操作。该位置位后,只一条M0VX和M0VC指令ALE才会被激活。此外,该引
脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。PSEN:程序储存
允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51由外部程序存
储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当
访问外部数据存储器,没两次有效的PSEN信号。EAVPP:外部访问允许。欲使
CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接
地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如
EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。F1ash存储
器编程时,该引脚加上+12V的编程电压Vpp。XTALl:振荡器反相放大器及内部
时钟发生器的输入端。XTAL2:振荡器反相放大器的输出端。P0:P0口是一组8
位漏极开路型双向I/0口,也即地址/数据总线复用口。作为输出口用时,每位
能驱动8个TTL逻辑门电路,对端口写“l”可作为高阻抗输入端用。在访问外部
数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,
在访问期间激活内部上拉电阻。在F1ash编程时,P0口接收指令字节,而在程序
校验时,输出指令字节,校验时,要求外接上拉电阻。P1:Pl是一个带内部上拉
电阻的8位双向I/O口,Pl的输出缓冲级可驱动(吸收或输出电流)4个TTL逻
辑门电路。对端口写“l”,通过内部的上拉电阻把端口拉到高电平,此时可作输入
口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输
出一个电流(IIL)。Flash编程和程序校验期间,Pl接收低8位地址。P2:P2是
一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输
出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到
高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚
大学本科毕业设计
9
被外部信号拉低时会输出一个电流(IIL)。Flash编程或校验时,P2亦接收高位地
址和其它控制信号。P3:P3口是一组带有内部上拉电阻的8位双向I/0口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入
“l”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低
的P3口将用上拉电阻输出电流(IIL)。
图3-1单片机DIP40封装
基于CC2500的性能强大,应用方便,可以选择单位机来实现对其的主要控制
操作。由于本人在校期间比较习惯应用89C51系列中的STC89C52RC,所以本设
计的主控器选择STC89C52RC。STC单片机的理由:降低成本,提升性能,原有
程序直接使用,硬件无需改动。选用PLCC,PQFP小型封装,3.3V工作电压单片机,
可使产品更小,更轻,功耗更低。这里我们选择用DIP-40的封装(图3-1)。
STC89C52RC的最小系统如图3-2所示。最小系统由单片机、复位电路、晶振
电路构成。STC89C52RD其RST引脚在接收到2个机器周期的高电平信号后复位,
复位电路可在上电是复位单片机,通过SW1复位按钮在单片机运行过程当中可以
随时复位。晶振电路MCS-51单片机内部有一个用于构成震荡器的高增益反相放
大器,管脚XTAL1和XTAL2分别是该反相放大器的输入端和输出端,在芯片的
外部通过这两个引脚跨接晶振和微调电容,形成反馈电路,就构成了一个稳定的
自激震荡器。这里晶振选择12MHZ,两个微调电容取30P。
大学本科毕业设计
10
图3-2单片机最小系统
单片机复位电路的作用:单片机是属于数字电路,数字电路就只有“0”低电平
和“1”高电平两个状态。这两状态是已知状态,比如有的0代表是0.0-0.01v,1代
表4.99-5.0v。但在电路上电时候或电压波动不稳定的时候,当给单片机上电那一
瞬间,电压有在几微秒内(有的是几毫秒内)不是直接跳变到5V的而是一个直线
上升的阶段,这时候,单片机不能正常工作,需要复位电路给它延时以等到电压
稳定。这叫上电复位。晶振的作用:片机系统里都有晶振,在单片机系统里晶振
作用非常大,全程叫晶体振荡器,他结合单片机内部电路产生单片机所需的时钟
频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的
一切指令的执行都是建立在单片机晶振提供的时钟频率。在通常工作条件下,普
通的晶振频率绝对精度可达百万分之五十。高级的精度更高。有些晶振还可以由
外加电压在一定范围内调整频率,称为压控振荡器(VCO)。晶振用一种能把电
能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。
同时为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持
同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法
保持同步。
大学本科毕业设计
11
3.3FLASH选择
本设计用FLASH储存PCM编码来替代对讲系统的语音输入PCM调制部分。
PCM编码来自WAVE文件。标准的WAV格式的声音文件含有声音的采样数据和
文件头。文件头描述了后面声音数据的一些信息,如通道数、采样频率、采样位
数以及数据的长度等。通道数,是指声音的采样路数,如单声道、立体声等。采
样频率,是指每秒钟对声音的采样次数,采样频率越高,还原出来的声音越接近
原始声音,如表1所列。根据采样定理,要想精确还原出某种频率的波形,其最小
采样率应至少为该波形频率的2倍。
表1采样频率与音质关系1
音质频率范围/Hz采样频/kHz
电话音质200Hz~3400Hz8
短波段收音机音质50Hz~7kHz11.025
FM收音机音质20Hz~15kHz22.05
CD音质10Hz~20kHz44.1
提取声音数据时,要注意采样频率、采样位数、存储容量与存储时间的关系,
如表2所列。
表2采样频率/位数、存储容量与存储时间的关系1
采样频
率/kHz
6688
11.0
25
11.02
5
22.0
50
22.0
50
44.1
00
44.10
0
采样位
数/位
8816
存
储
容
量
/
K
B
325.462.734.102.052.971.491.490.740.740.37
6410.925.468.194.105.942.972.971.491.490.74
12821.8410.9216.388.19
11.8
9
5.945.942.972.971.49
25643.6921.8432.77
16.
38
23.7
8
11.
89
11.8
9
5.945.942.97
51287.3843.6965.54
32.7
7
47.5
5
23.78
23.7
8
11.8
9
11.8
9
5.94
注:存储时间单位:s
通常,8kHz的采样频率和8位的采样位数可获得清晰的语音以及较好的音乐
声,并且占有较少的存储空间。采样位数,指的是每次采样的采样精度。采样位
数越高,还原出来的声音的量化噪声越小,波形也越接近原波形。
由于WAVE文件比较大,所以选择用华邦的w25x40,其容量为4M-BIT可以
大学本科毕业设计
12
储存。对讲系统对音质要求不是很高所以使用8KHZ采样16位的电话音质,w25x40
可以储存32.77秒的声音。
3.4显示部分设计
显示部分只需显示语音对讲系统的工作模式,接收或发送。选择用共阳数码
管来做显示模块,用数字0表示OUT语音对讲系统处于发送工作模式下,用1表
示IN表示语音对讲系统处于接收工作模式下。数码管管脚图如图3-3。
图3-3共阳数码管脚图
因为考虑到PCB版的布线问题,所以数码管与单片机IO口的连接并非标准
的连。本系统数码管与单片机IO口的连接图如图3-4。a-P0.2、b-P0.3、c-P0.6、
d-P0.5、e-P0.4、f-P0.1、g-P0.0、DP-P0.7,这样子给PCB单面布线的时候带来了
不小的方便使得PCB布线更加简洁。
图3-4单片机数码管连接图
3.5信号发射/接收模块设计10
RF2500无线模块,其工作于2.4GHz的ISM/SRD频段免许可证使用,采用
TI公司的CC2500多通道RF收发器。CC2500是用于超低功耗无线应用的业界系
统成本最低的多通道无线产品,具有强大的数字处理特性,因此仅使用一颗低成
本MCU便可构建出高性能的射频系统,包括很多非常有用的数字功能,如整个数
据包处理、FIFO缓冲器、空闲通道评估和无线唤醒等,可广泛应用于消费类电子
产品(如无线键盘、鼠标、游戏控制器)、无线音频传输(如无线话筒、无线耳机、
无线音箱)等。
大学本科毕业设计
13
图3-5RF2500射频模块
CC2500射频收发器是用于低功耗无线应用的业界系统成本最低的多通道无
线电产品。工作波段频带是2.4GHz,包括很多非常有用的数字功能。射频模块通
过由6个引脚组成的数字交互界面与控制器进行通信。89C51系列单片机的端口功
能强大,每一个位都可以独立地配置成为输入、输出等功能引脚。射频模块可将
单片机的P1脚中的6位,分别与CC2500的SI、CLK、SO、GDO2、GDO0、CS
相连接,其中由CS、CLK、SI、SO组成SPI口,负责控制器与CC2500之间收发
数据的传送。GDO0与GDO2是CC2500可配置的多功能引脚,当CC2500收到数
据包时,令GDO0触发控制器引起中断,读取CC2500缓存里的数据。通过配置
GDO2则可提供CC2500的CCA检测结果。
对讲系统通过射频模块规定的数据包格式通信,CC2500规定的数据通信格式
如图3--5所示。导言、同步字与CRC校验在发送数据时是由CC2500硬件自动
添加,在接收时由硬件自动去除,在信道特性较好的场合,为提高识别速度,可
设定16位的导言与16位的同步字。CC2500在固定长度通信模式下,可删去长度
域;在可变长度通信模式下,需要8位的长度域给出除去导言与同步字外所有数
据负载的字节数。本设计中要用到多种不同长度的通信命令,因此采用了后一种
模式。地址域用于CC2500多设备识别,本设计没用到,删去。最后两个字节的
CRC校验是长度域、地址域与数据负载的校验和。
RF2500性能及特点:(1)工作电压:1.8V~3.6V,推荐靠近3.6V,但是不超过
3.6V;(2)2400-2483.5MHz的ISM和SRD频段,免许可证使用;(3)最高工作速率
500kbps,支持2-FSK、GFSK和MSK调制方式;(4)高接收灵敏度(1.2kbps下
-110dBm,10kbps下-101dBm,250kbps下-90dBm,1%数据包误码率);(5)内置硬件
CRC检错和点对多点通信地址控制;(6)耗电量极低:TX:在0dBm为21.2mARX:
大学本科毕业设计
14
在250kbps为13.3mA;(7)可编程控制的输出功率,最大输出功率为0dBm,最小
功率为-10dBm,数据速率可在1.2kbps至500kbps之间变化;(8)支持低功率电磁波
激活功能,外部中断唤醒、外部中断或RTC唤醒系统;(9)支持传输前自动清理信道
访问(CCA),即载波侦听系统;(10)快速频率变动合成器带来的合适的频率跳跃系
统;(11)模块可软件设地址,软件编程非常方便;(12)标准DIP间距接口,便于嵌入
式应用;(13)单独的64字节RX和TX数据FIFO;(14)很少的外部组件,工作可靠性
高;(15)模块可视直线通信距离,RF2500BK采用PCB天线20米-70左右,RF2500SE
采用外置天线可到50-100米;(16)模块尺寸,RF2500BK采用PCB天线尺
寸:28mm*22mm;RF2500SE尺寸:30mm*22mm(不含SMA及天线)。
接口说明:(1)VCC脚接电压范围为1.9V-3.6V之间,不能在这个区间之外,
超过3.6V将会烧毁模块。推荐电压3.3V左右;(2)除电源VCC和接地端,其余脚
都可以直接和普通的5V单片机IO口直接相连,无需电平转换。当然对3V左右
的单片机更加适用了;(3)硬件上面没有SPI的单片机也可以控制本模块,用普通单
片机IO口模拟SPI不需要单片机真正的串口介入,只需要普通的单片机IO口就
可以了,当然用串口也可以。
RF2500构成了语音对讲系统的主体模块。是语音对讲系统成功与否重要模块。
3.6音频输出模块设计
图3-6音频输出电路
语音对讲系统通过RF2500模块接收到从机读取FLASH通过RF2500发送的
数据后,经过单片机的处理后由P2.2口模拟PWM波形输出。PWM波不有直接驱
动喇叭发声。系统需要设计一个PWM音频信号放大电路。由于语音对讲系统的设
计对声音的质量要求并不是很高只要达到普通的电话音质即可,所以对音频输出
模块的设计只用了一个简单的RC低通滤波电路以及LM358跟4871进行音频放
大学本科毕业设计
15
大,进而驱动3欧的喇叭发出声音。其电路原理如图3-6所示。
4871概述:4871是一个BTL桥连接的音频功率放大器。它能够在5V电源
电压下给一个3Ω负载提供THD小于10%、平均值为3W输出功率。在关闭
模式下电流的典型值为0.6µA。4871是为提供大功率,高保真音频输出而专门
设计的。它仅仅需要少量的外围元件,并且能工作在低电压条件下(2.0V-5.5V)。
4871不需要偶合电容,自举电容或者缓冲网络,所以它非常适用于小音量和低重
量的低功耗系统。
4871主要特性:
■在失真度为10%,输入1KHZ的信号,不同负载的条件下输出功率为:
·3欧姆,3W(典型值)
·4欧姆,2.5W(典型值)
·8欧姆负载,1.5W(典型值)。
■待机电流:0.6µA
■工作电压:2.0-5.5V。
■在输入信号频率为1KHZ,负载8欧姆,输出平均功率为1W的条件下,最大
失真度为0.5%
■输出不需要耦合电容,自举电容或者缓冲电路。
■体积小,采用SOP8封装。
■增益稳定。
■外部配置可以改变增益。
LM358内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适
合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作
条件下,电源电流与电源电压无关。它的使用范围包括传感放大器、直流增益模
块和其他所有可用单电源供电的使用运算放大器的场合。特性:内部频率补偿、
直流电压增益高(约100dB)、单位增益频带宽(约1MHz)、电源电压范围宽:单电
源(3—30V);双电源(±1.5一±15V)、低功耗电流,适合于电池供电、低输入偏
流、低输入失调电压和失调电流、共模输入电压范围宽,包括接地差模输入
电压范围宽,等于电源电压范围、输出电压摆幅大(0至Vcc-1.5V)。
图3-7LM358封装图
大学本科毕业设计
16
在音频输出模块中R20与C6构成了一个简单的低通滤波器,因为这里用的音
频为8KHZ的电话音质,其它高频的杂音通过低通滤波过滤掉。低通滤波器13的
截止频率F=1/(2πRC),本设计取R20为10K,C6为470PF,其截止频率为29.5KHZ。
图3-8低通滤波电路
3.7按键电路设计
图3-9按键模块
切换按键直接使用开关与地相连如图3-9所示。当按键按下时读P1.7口电平,
读取P1.7口电平为低电平时时说明按键按下,语音对讲系统切换工作模式从发送
变为接收或从接收变为发送,具体通过程序来实现,同时通过程序使数码管显语
音对讲系统的工作模式IN(1)或OUT(0),按键的消抖通过程序实现。
3.8电源部分设计
基于华邦w25x40FLASH的工作电压以及RF2500模块的工作电压均为3.3V
比较合适,STC89C52、LM358、4871都在5V电压下可以工作。语音对讲系统要
的是携带方便,单片机、运放以及射频收发模块以及FLASH的功耗都不高,5V
电源可由3节1.5V电池串联得到。AMS1117系列稳压器有可调版与多种固定电压
版,设计用于提供1A输出电流且工作压差可低至1V。在最大输出电流时,AMS1117
器件的压差保证最大不超过1.3V,并随负载电流的减小而逐渐降低。AMS1117的
片上微调把基准电压调整到1.5%的误差以内,而且电流限制也得到了调整,以尽
量减少因稳压器和电源电路超载而造成的压力。AMS1117器件引脚上兼容其他三
端SCSI稳压器,提供适用贴片安装的SOT-223,8引脚SOIC,和TO-252(DPAK)
塑料封装。AMS1117参数AMS1117基本参数输出电流(A)1输出电压(V)
Adj,1.5,1.8,2.5,2.85,3.3,5.0,AMS1117其他特性初始误差(%)±1.5压差(V)
大学本科毕业设计
17
1.3AMS1117封装类型SOT-223TO-252SO-8三端口可调节或固定输出电压1.5V,
1.8V,2.5V,2.85V,3.3V和5.0V输出电流1A工作压差低至1V线荷载调节:0.2%
Max.负载调节:0.4%Max.可选SOT-223,TO-252和SO-8封装AMS1117应用高
效线性稳压器后置稳压器,用于交换式电源5V至3.3V线性稳压器、电池充电
器、有源SCSI终端笔记本电源管理、电池供电设备。所以语音对讲系统的3.3V
电压可以通过集成芯片ASM1117-3.3使用固定输出电压值模式输出如图3-10所
示。C16、以及C17用来稳波。
图3-103.3V电源模块
3.9本章小结
本章节对基于CC2500的语音对讲系统做了整体的硬件设计介绍,同时详细的
介绍了各个部分的设计方案,在器件的选择上也做了一定的分析。硬件电路的设
计对整个基于CC2500的语音对讲系统作用关键。
大学本科毕业设计
18
4语音对讲系统软件设计
4.1软件开发调试环境
C51工具包的整体结构中,其中uVision与Ishell分别是C51forWindows和for
Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发
流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51
及A51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也
可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换
成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可
由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
采用KEIL开发的89c51单片机应用程序步骤:
(1)在uVision集成开发环境中创建新项目(Project),扩展文件名为.UV2
并为该项目选定合适的单片机CPU器件(本设计采用STC公司下的STC89C52)。
(2)用uVision的文本编辑器编写源文件,可以是汇编文件(.ASM),也可以
使C语言文件(扩展名.C),并将该文件添加到项目中去。一个项目文件可以包含
多个文件,除了源程序文件外,还可以是库文件、头文件或文本说明文件。
(3)通过uVision3的相关选择项,配置编译环境、连接定位器以及Debug调
试器的功能。
(4)对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX文件,
如果出现编译连接错误则返回到第2步,修改源文件中的错误后重构整个项目。
(5)对没有语法错误的程序进行仿真调试,调试成功后将HEX文件写入到单
片机应用系统的ROM中。
4.2软件总体设计框图
基于CC2500的语音对讲系统其硬件电路并不是很复杂,RF2500用了现成的
模块。单片机的最小系统及一些不大的外围电路所组成。只有硬件电路没有软件
支持的系统只是摆设,就像一台电脑没安装操作系统一样,什么都做不了只是一
个摆设而已。所以要使语音对讲系统的功能得到较好的实现关键问题在于单片机
程序的设计。程序的好坏决定了语音对讲系统的成功与否,所以在编写程序之前
应该整体考虑,使程序在逻辑上不发生什么错误,寻找最完善的结构框架就行编
程可以使程序更为简洁而不失功能的强大。所以在硬件的基础上,考虑到程序的
可读性跟可移植性,基于CC2500的语音对讲系统进行分模块编程,其中包括按键
大学本科毕业设计
19
模块,显示模块,FLASH读取模块,PWM音频输出模块以及最为关键的RF2500
射频芯片模块的发送跟读取。主程序设计框架好图4-1所示。
图4-1程序主流程图
4.3各模块程序设计
4.3.1延时程序
voiddelay_1ms(void)
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
大学本科毕业设计
20
voiddelay_nms(unsignedintn)
{
unsignedinti=0;
for(i=0;i delay_1ms(); } 4.3.2w25x40驱动模块设计8 FLASH驱动模块单片机IO口的定义如下: sbit_cs=P2^7;//定义P2.7口为CS sbit_miso=P2^6;//定义P2.6口为SPI_MISO sbit_clk=P2^5;//定义P2.5口为CLK sbit_mosi=P2^4;//定义P2.4口为SPI_MOSI //-----------W25X40的指令定义-------------------------// #defineWREN0X06//设置写使能 #defineWRDI0X04//复位写使能 #defineRDSR0X05//读状态寄存器 #defineWRSR0X01//写阙云太寄存器 #defineREAD0X03//从内存中读取数据 #definePROGRAM0X02//写数据到内存中 #defineSECTOR_ERASE0X20//ERASEONESECTORINMEMORY ARRAY #defineCHIP_ERASE0Xc7//ERASEALLSECIORSINMEMORYARRAY #defineRDI0X90//读取制造信息和产品ID 定义单片机8位数据发送到FLASH unsignedcharRead8Bit() 单片机从FLASH读取8位数据 voidWrite8Bit(unsignedcharByte) 读状态寄存器 unsignedcharReadSR() 从FLASH中读取两位数据 voidTwo_Read(unsignedcharHaddress,unsignedcharMaddress,unsignedchar Laddress,unsignedchar*Read_Data) 芯片忙碌检测 unsignedcharCheck_Busy(void) 大学本科毕业设计 21 4.3.3按键及显示模块设计9 按键程序设计时考虑到按键开关去抖动问题,机械式按键再按下或释放时,由 于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳 定下来。其抖动过程如图4-2所示,抖动时间的长短与开关的机械特性有关,一般 为510ms。 图4-2按键按下状态图 软件上采取的措施是:在检测到有按键按下时,执行一个10ms左右(具体时 间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合 状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态。同理,在检测到 该键释放后,也应采用相同的步骤进行确认,从而可消除抖动的影响。 按键消抖程序: while(1) {if(k1==0) {for(i=0;i<20;i++) for(j=0;j<248;j++); if(k1==0)//确认按键按下 {要执行的程序; } while(k1==0);//等待按键抬起 for(i=0;i<20;i++) for(j=0;j<248;j++); while(k1==0);//确定按键抬起 } } 与单片机的IO口连接定义程序: sbitk1=P1^7; 大学本科毕业设计 22 数码管显示模块可以都过查表的方式进行,根据硬件连接方式定义 unsignedcharcodetable[]={0x81,0xb7}; 其中0x81使数码管显示数字0表示发送工作模式,0xb7使数码管显示1表示 接收工作模式。将显示的程序嵌到按键程序中即可。 4.3.4CC2500驱动程序设计15 下面先介绍CC2500的一些编程相关的定义。SPI读写时序如图4-3所示 图4-3SPI读写时序16 状态字节概述: 比特名称描述 7CHIP_RDYn保持高,直到功率和晶体已稳定。当使用SPI 接口时应始终为低。 6:4STATE[2:0]表明当前主状态机模式 值状态描述 000空闲空闲状态 001RX接收模式 010TX发送模式 011FSTXON快速TX准备 100校准频率合成器校准正运行 101迁移PLL正迁移 110XFIFO_O VERFLOW RXFIFO已经溢出,读出任何 有用数据,然后用SFRX冲洗 111XFIFO_O VERFLOW TXFIFO已经下溢,同SFTX 应答 3:0FIFO_BYTES_AV AILABLE[3:0] TXFIFO中的自由比特数。若 FIFO_BYTES_AVAILABLE=15,它表明有15或更 多个比特是可用/自由的。 大学本科毕业设计 23 命令滤波: 地址滤波名描述 0x30SRES重启芯片 0x31SFSTXON开启和校准频率合成器(若CAL=1 0x32SXOFF关闭晶体振荡器 0x33SCAL校准频率合成器并关断(开启快速启动)。在不设置手动 校准模式(_AUTOCAL=0)的情况下,SCAL 能从空闲模式滤波。 0x34SRX启用RX。若上一状态为空闲且 _AUTOCAL=1则首先运行校准。 0x35STX空闲状态:启用TX。若_AUTOCAL=1首先运 行校准。若在RX状态且CCA启用:若信道为空则进入 TX 0x36SIDLE离开RX/TX,关断频率合成器并离开电磁波激活模式若可 用 0x37SAFC运行22.1节列出的频率合成器的AFC调节 0x38SWOR运行27.5节描述的自动RX选举序列(电磁波激活) 0x39SPWD当CSn为高时进入功率降低模式。 0x3ASFRX冲洗RXFIFO缓冲 0x3BSFTX冲洗TXFIFO缓冲 0x3CSWORRST重新设置真实时间时钟 0x3DSNOP无操作。可能用来为更简单的软件将滤波命令变为2字节。 配置寄存器概述: 地址寄存器描述保存在休眠状态中 0x00IOCFG2GDO2输出脚配置Yes 0x01IOCFG1GDO1输出脚配置Yes 0x02IOCFG0GDO0输出脚配置Yes 0x03FIFOTHRRXFIFO和TXFIFO门限Yes 0x04SYNC1同步词汇,高字节Yes 0x05SYNC0同步词汇,低字节Yes 0x06PKTLEN数据包长度Yes 0x07PKTCTRL1数据包自动控制Yes 0x08PKTCTRL0数据包自动控制Yes 0x09ADDR设备地址Yes 大学本科毕业设计 24 0x0ACHANNR信道数Yes 0x0BFSCTRL1频率合成器控制Yes 0x0CFSCTRL0频率合成器控制Yes 0x0DFREQ2频率控制词汇,高字节Yes 0x0EFREQ1频率控制词汇,中间字节Yes 0x0FFREQ0频率控制词汇,低字节Yes 0x10MDMCFG4调制器配置Yes 0x11MDMCFG3调制器配置Yes 0x12MDMCFG2调制器配置Yes 0x13MDMCFG1调制器配置Yes 0x14MDMCFG0调制器配置Yes 0x15DEVIATN调制器背离设置Yes 0x16MCSM2主通信控制状态机配置Yes 0x17MCSM1主通信控制状态机配置Yes 0x18MCSM0主通信控制状态机配Yes 0x19FOCCFG频率偏移补偿配置Yes 0x1ABSCFG位同步配置Yes 0x1BAGCTRL2AGC控制Yes 0x1CAGCTRL1AGC控制Yes 0x1DAGCTRL0AGC控制Yes 0x1EWOREVT1高字节时间0暂停Yes 0x1FWOREVT0低字节时间0暂停Yes 0x20WORCTRL电磁波激活控制Yes 0x21FREND1前末端RX配置Yes 0x22FREND0前末端TX配置Yes 0x23FSCAL3频率合成器校准Yes 0x24FSCAL2频率合成器校准Yes 0x25FSCAL1频率合成器校准Yes 0x26FSCAL0频率合成器校准Yes 0x27RCCTRL1RC振荡器配置Yes 0x28RCCTRL0RC振荡器配置Yes 0x29FSTEST频率合成器校准控制No 0x2APTEST产品测试No 0x2BAGCTESTAGC测试No 大学本科毕业设计 25 0x2CTEST2不同的测试设置No 0x2DTEST1不同的测试设置No 0x2ETEST0不同的测试设置No 状态寄存器概述: 地址寄存器描述 0x30(0xF0)PARTNUMCC2550的组成部分数目 0x31(0xF1)VERSION当前版本数 0x32(0xF2)FREQEST频率偏移估计 0x33(0xF3)LQI连接质量的解调器估计 0x34(0xF4)RSSI接收信号强度指示 0x35(0xF5)MARCSTATE控制状态机状态 0x36(0xF6)WORTIME1WOR计时器高字节 0x37(0xF7)WORTIME0WOR计时器低字节 0x38(0xF8)PKTSTATUS当前GDOx状态和数据包状态 0x39(0xF9)VCOVCDACPLL校准模块的当前设定 0x3A(0xFA)TXBYTESTXFIFO中的下溢和比特数 0x3B(0xFB)RXBYTESRXFIFO中的下溢和比特数 RF2500模块与单片机的IO定义程序为: sbitGDO0=P1^2;//定义P1.2口为GDO0 sbitGDO2=P1^3;//定义P1.3口为GDO2 sbitMISO=P1^4;//定义P1.4口为MISO sbitSCK=P1^1;//定义P1.1口为SCK sbitCSN=P1^0;//定义P1.0口为CSN sbitMOSI=P1^5;//定义P1.5口为MOSI 根据以上CC2500的概括编写程序,由于程序较长详见附录,下面简单定义一 些用到的函数。 CC2500设置接收模式函数:voidCC2500_SetRxMode(void) CC2500寄存器写入函数:voidCC2500_WriteReg(unsignedcharaddr,unsigned charvalue) CC2500寄存器读取函数:unsignedcharCC2500_ReadReg(unsignedcharaddr) CC2500寄存器连续写入函数:voidCC2500_WriteBurstReg(unsignedcharaddr, unsignedchar*buffer,unsignedcharcount) CC2500寄存器连续读取函数:voidCC2500_ReadBurstReg(unsignedcharaddr, 大学本科毕业设计 26 unsignedchar*buffer,unsignedcharcount) CC2500命令函数:voidCC2500_Command(unsignedcharcmd) SPI初始化函数:voidSPI2500_Init(void) SPI单字节读取函数:unsignedcharSPI_Read(void) SPI单字节写入函数:voidSPI_Write(unsignedchartxdata) 4.3.5PWM程序设计11 首先定义PWM波输出口 sbitPWMOUT=P2^2; 由定时器0来定时要产生8KHZ频率的PWM波让定时器工作在方式1下其程序 初始化为TMOD=0x01; TH0=(65536-65535)/256; TL0=(65536-65535)%256; TR0=1; ET0=1; EA=1; voidTimer0()interrupt1 {unsignedcharcount; TF2=0; if(++count==D_C)PWMOUT=0;//达到脉宽设定值时,输出PWM低电平 elseif(count==125)//PWM的频率为8khz左右 {count=0; PWMOUT=1; } } D_C为能过RF2500模块接收到的16位数据处理后控制PWM占空比的值。 4.4本章小结 本章主要对基于CC2500的语音对讲系统的程序部分进行了设计,程序的总体 框架以及各程序模块的设计。由于总程序比较长所以这里只简单介绍了一些函数 的定义,以及设计的思路,详细程序在附录中。基于CC2500的语音对讲系统的成 功与否软件的成功设计至关重要。 大学本科毕业设计 27 5制作与调试 5.1原理图绘制及PCB制板12 在检验过设计方案的可行性之后进行原理图的绘制。AltiumDesigner提供了 唯一一款统一的应用方案,其综合电子产品一体化开发所需的所有必须技术和功 能。AltiumDesigner在单一设计环境中集成板级和FPGA系统设计、基于FPGA 和分立处理器的嵌入式软件开发以及PCB版图设计、编辑和制造。并集成了现代 设计数据管理功能,使得AltiumDesigner成为电子产品开发的完整解决方案-一个 既满足当前,也满足未来开发需求的解决方案。所以使用AltiumDesigner软件进 行原理图的绘制,以及PCB板的绘制。刚开始对这款软件的使用还不怎么清楚, 通过查找资料跟请教同学之后,最终完成了原理图及PCB的绘制。 绘制好PCB板之后开始PCB的转印及腐蚀。因为条件所限所以没能使用制板 机进行制板,而是选择了使用覆铜板就行电路板的制作。其过程是打印PCB原理 图到光滑表面的转印纸上,将覆铜板表面洗净擦干后,把转印纸打印面压到铜板 之上用胶带固定使之不会滑动。完成这些之后把覆铜板放到转印机下就行热转印。 几次之后拆掉转印纸,墨迹成功转印到铜板之上。接下来就是最后一步的腐蚀, 至此电路板空板制件成功。 5.2硬件电路的布线与焊接 5.2.1总体特点 该系统所涉及的各部分硬件电路,总体的特点是: (1)制作简单,RF2500用现成模块,只需要设计焊接好双排14脚排母就可以跟 RF2500模块进行连接,设计简单,按键部分也是一般的单片机外围按键的接法。 (2)布线较为合理各贴片元件位置合适。 (3)系统整体不大,FLASH、运放、稳压芯片、小电容以及电阻全为贴片元件使 得语音对讲系统整体不大。 使用的元器件清单: 器件名称及封装数值大小/型号数量 电阻,06031K8个 10K3个 20K2个 4709个 大学本科毕业设计 28 电解电容,直插22U2个 10U1个 共阳数码管,直插SM410561个 贴片电容,06031U2个 30P2个 470P1个 FLASH,0603W25X401个 稳压芯片,SOT223ASM1117-3.3V1个 运放,0603LM3581个 48711个 晶振,直插12M1个 40脚芯片座,直插1个 按键,直播2个 5.2.2焊接 焊接前熟悉了各个芯片及模块的引脚代表的意义,焊接时参照自己设计的电 路图及模块供应商提供的原理图,仔细地连接引脚。按照以下原则进行焊接: (1)先连接各芯片和模块的电源线和地线,这样确保各芯片有正确的工作电 压;由于使用了较多的贴片元件所以在焊接的时候特别注意了锡有没有使贴片短 路,在焊完贴片之后用万用表一个个测试过。 (2)同类的芯片应顺序焊接,在一片焊接并检查好之后,其他的同类芯片便 可以参照第一片进行焊接。这样便可大大节省时间,也可降低出错率。 (3)焊好以后,先不要上电,而是先检查电源和地有没有短路,再检查各个 焊点是否接触良好,因为使用贴片的原因所以检查的时候多花点时间细心查找各 个焊点。确保没有问题后,再上电调试。 5.3调试 对系统的调试是分模块进行的,先调试硬件,再调试软件。硬件部分首先调 试电路的电源电路部分查看有无短路,检查各芯片供电是否正常。 5.3.1硬件调试 (1)用万用表检测各芯片引脚有无短路,单片机与的外围设备间的连接是否 有中断。 (2)用万用表确定电源线和底线之间没有短路后,接通电路看显示部分是否 有显示,再用万用表确认供电情况。有显示那就表示电源部分正常,如没有显示, 大学本科毕业设计 29 则检查是电路连接的问题还是元器件的损坏,可用万用表进行分析。 (3)电源供电部分,在稳压芯片1117-3.3输出得到的电压测试,是否是索要 得到的3.3V。 5.3.2proteus软件仿真 1.硬件电路图的接法操作 (1).放置选择(删除)元器件 (2).移动元器件 (3).缩放视图 (4).连接导线 (5).仿真,调试 2.单片机系统PROTEUS设计与仿真过程 Proteus强大的单片机系统设计与仿真功能,使它可成为单片机系统应用开发 和改进手段之一。全部过程都是在计算机上通过Proteus来完成的。其过程一般也 可分为三步: (1)在ISIS平台上进行单片机系统电路设计、选择元器件、接插件、连接电路 和电气检测等。简称Proteus电路设计。 (2)在Keil平台上进行单片机系统程序设计、编辑、汇编编译、代码级调试,最 后生成目标代码文件(*.hex)。简称Proteus源程序设计和生成目标代码文件。 (3)在ISIS平台上将目标代码文件加载到单片机系统中,并实现单片机系统的 实时交互、协同仿真。它在相当程度上反映了实际单片机系统的运行情况。简称 Proteus仿真。 大学本科毕业设计 30 6总结 本设计方案达到了任务书的要求实现了由主机读取存于FLASH上的PCM编码 通过RF2500发送,从机通过RF2500接收到数据并通过PWM波输出发声。 由于基于CC2500的语音对讲系统使用单片机进行设计和制作,所以大大的简 化了本次设计的电路,提高了系统的智能性和可靠性。单片机以及RF2500模块是 本次设计的核心元件,本次设计的难点在于程序设计方面,RF2500接收跟发送数 据。 这次的毕业设计延续了将近3个月的时间,在这三个月里面我学到了很多东 西,在拿到这个题目的时候,我并没有什么概念,就知道选了这么一个题目,由 于找工作的情绪比较浮躁,一时之间我也没有对它进行深入的了解,在开题报告 的时候,也只是基本的了解了他的大概,当时觉得并不是很难,不就是将存于 FLASH里的PCM编码读到单片机中再由RF2500发送出去,再通过另一RF2500 模块接收数据,由单片机模拟PWM输出播放就OK了,理解是理解对了,但是没 有想到的是制作的过程中才发现自身的知识来完成这个系统还是有一定难度的, 因为之前没有接触过文件系统,存储设备的结构和性能,SPI通信也只是略有耳闻, 但是从来没有去学习过,这也体现了大学四年并没有主动的去接触知识,只停留 在了课堂的学习,在这次毕业设计的制作过程中,我学到的最大的收获就是要作 为一名合格的研发工程师,不是一天两天能做到的,必须有一种专业的素质和技 能,要不断的学习和更新知识,知识是永远也学不完的。 通过这次毕业设计使自己的动手能力得到了一定的提升,整个硬件制作的过 程在老师的指导下进行,动手操作全是自己一个人完成,包括PCB版图的绘制, 再到制板然后焊接到最后的调试。也是第一次使用贴片元件进行电路的焊接。在 原有的基础上自己以综合设计水平有所提升。在程序的逻辑方面也学到了很多经 验。对CC2500这一集成芯片有了一定的认识。 大学本科毕业设计 31 致谢 在论文完成之际,谨向给予我关心,帮助和指导的老师,同学和亲友们表示 衷心的感谢! 首先,感谢我的指导老师郑立老师。我不但从郑老师那里学到了丰富的知识, 更重要的是郑老师的严谨的治学态度和兢兢业业的工作作风,深深的感染着我, 并激励着我在以后的工作和学习中努力进取。感谢郑老师给予该课题的指导,该 课题从选题,到开题,再到论文的写作整个过程中,郑老师都给予了认真的指导, 才使得论文顺利完成。 再次,感谢大学四年教过我课程的老师,你们都对这次毕业设计有直接或者 间接的影响,从对电子知识毫不所知,到现在独立完成一个系统的设计,我想这 里面老师们的功劳是不可磨灭的。感谢电子信息学院的老师和同学在这四年的学 习期间给予我的关心,指导和帮助。 最后感谢养育我多年的父母和栽培我四年的母校——杭州电子科技大学 大学本科毕业设计 32 参考文献 [1]吕明,张捷.数字音频播放系统的设计与实现[J].荆楚理工学院学报,2009,24 (5):20-22. [2]李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994:6-28. [3]龚之春.数字电路[M].成都:电子科技大学出版,1999:123-127. [4]W.G.荣格.集成运算放大器应用手册[M].北京:世界图书出版公司,1990:3-72. [5]李伯成编著.基于MS-51单片机的嵌入式系统设计.电子工业出版社.2004.8 [6]周立功等.PDIUSBD12USB固件编程与驱动开发.北京:北京航空航天大学出版 社,2003.2:54-89. [7]丛伟波,杨勇,韩清凯.低功耗数据采集系统的USB接口设计[J].单片机与 嵌入式系统运用,2005,(5):56-60. [8]宋戈等.51单片机应用开发范例大全.人民邮电出版社.2010.2:81-86 [9]胡汉才.单片机原理及接口技术.清华大学出版社,1996. [10]刘振文,邓毅华,彭友斌.基于CC2500的2.4GHZRFID系统设计[J].电子技术应 用,2008年第7期:78-81. [11]罗光平,尤一鸣.利用PWM给单片机应用增加语音功能[J].单片机与嵌入式系统 应用,2007年第1期:36-38. [12]张义和.ProtelDXP电路设计大全[M].北京:中国铁道出版社,2004. [13]陈惠开,徐守义.无源与有源滤波器—原理与应用.人民邮电出版社,1989.12. [14]TI'snewMSP430wirelessdevelopmenttool[J].ElectronicsToday,2007,40(2) _1. [15]gyefficientmultimodalWirelessVideoSensorNetwork witheZ430–RF2500modules[R].PervasiveComputingandApplications(ICPCA), 20105thInternationalConferenceon. [16]CC2500,pdf.ChipconProductsfromTexasInstruments,2006. 杭州电子科技大学本科毕业设计 附录 原理图 PCB图 大学本科毕业设计 实物图(正面) 实物图背面 大学本科毕业设计 程序 #include #include unsignedchartwo_read; unsignedcharH_address,M_address,L_address,D_CO,D_CI,D_C,k_datah,k_datal; unsignedcharRead_Data[2]; unsignedcharcodetable[]={0x81,0xb7}; unsignedi;j,n; unsignedcharmod; sbit_cs=P2^7; sbit_miso=P2^6; sbit_clk=P2^5; sbit_mosi=P2^4; sbitk1=P1^7; sbitPWMOUT=P2^2; sbitGDO0=P1^2; sbitGDO2=P1^3; sbitMISO=P1^4; sbitSCK=P1^1; sbitCSN=P1^0; sbitMOSI=P1^5; #defineCC2500_DATA_LEN32 #definenop()_nop_() unsignedcharCC2500_TxRxBuf[1+CC2500_DATA_LEN]; unsignedcharCC2500_TxAddr=0x01; unsignedcharCC2500_RxAddr=0x01; unsignedcharRead8Bit(); voidwrite8Bit(unsignedcharByte); unsignedcharByte_Read(unsignedcharHaddress,unsignedcharMaddress,unsigned charLaddress); voidTwo_Read(unsignedcharHaddress,unsignedcharMaddress,unsignedchar Laddress,unsignedchar*Read_Data); voiddelay_spi(); voidWriteDis(void); voiddelay_1ms(void); 大学本科毕业设计 voidw25x40_start(void); unsignedcharCC2500_RxPacket(void); voidCC2500_TxPacket(void); voidCC2500_Write_RxADDR(void); voidCC2500_Write_TxADDR(void); unsignedcharSpiTxRxByte(unsignedchardat); voidSPI2500_Init(void); voidCC2500_Command(unsignedcharcmd); voidCC2500_ReadBurstReg(unsignedcharaddr,unsignedchar*buffer,unsignedchar count); voidCC2500_WriteBurstReg(unsignedcharaddr,unsignedchar*buffer,unsignedchar count); unsignedcharCC2500_ReadReg(unsignedcharaddr); voidCC2500_WriteReg(unsignedcharaddr,unsignedcharvalue); voidCC2500_SetRxMode(void); voidCC2500_Init(void); voiddelay_nms(unsignedintn); voiddelay_1ms(void); typedefstructCC2500_RF_SETTINGS; #defineCCxxx0_IOCFG20x00//GDO2outputpinconfiguration #defineCCxxx0_IOCFG10x01//GDO1outputpinconfiguration #defineCCxxx0_IOCFG00x02//GDO0outputpinconfiguration #defineCCxxx0_FIFOTHR0x03//RXFIFOandTXFIFOthresholds #defineCCxxx0_SYNC10x04//Syncword,highINT8U #defineCCxxx0_SYNC00x05//Syncword,lowINT8U #defineCCxxx0_PKTLEN0x06//Packetlength #defineCCxxx0_PKTCTRL10x07//Packetautomationcontrol #defineCCxxx0_PKTCTRL00x08//Packetautomationcontrol #defineCCxxx0_ADDR0x09//Deviceaddress #defineCCxxx0_CHANNR0x0A//Channelnumber #defineCCxxx0_FSCTRL10x0B//Frequencysynthesizercontrol #defineCCxxx0_FSCTRL00x0C//Frequencysynthesizercontrol #defineCCxxx0_FREQ20x0D//Frequencycontrolword,high INT8U #defineCCxxx0_FREQ10x0E//Frequencycontrolword,middle 大学本科毕业设计 INT8U #defineCCxxx0_FREQ00x0F//Frequencycontrolword,low INT8U #defineCCxxx0_MDMCFG40x10//Modemconfiguration #defineCCxxx0_MDMCFG30x11//Modemconfiguration #defineCCxxx0_MDMCFG20x12//Modemconfiguration #defineCCxxx0_MDMCFG10x13//Modemconfiguration #defineCCxxx0_MDMCFG00x14//Modemconfiguration #defineCCxxx0_DEVIATN0x15//Modemdeviationsetting #defineCCxxx0_MCSM20x16//MainRadioControlStateMachine configuration #defineCCxxx0_MCSM10x17//MainRadioControlStateMachine configuration #defineCCxxx0_MCSM00x18//MainRadioControlStateMachine configuration #defineCCxxx0_FOCCFG0x19//FrequencyOffsetCompensation configuration #defineCCxxx0_BSCFG0x1A//BitSynchronizationconfiguration #defineCCxxx0_AGCCTRL20x1B//AGCcontrol #defineCCxxx0_AGCCTRL10x1C//AGCcontrol #defineCCxxx0_AGCCTRL00x1D//AGCcontrol #defineCCxxx0_WOREVT10x1E//HighINT8UEvent0timeout #defineCCxxx0_WOREVT00x1F//LowINT8UEvent0timeout #defineCCxxx0_WORCTRL0x20//WakeOnRadiocontrol #defineCCxxx0_FREND10x21//FrontendRXconfiguration #defineCCxxx0_FREND00x22//FrontendTXconfiguration #defineCCxxx0_FSCAL30x23//Frequencysynthesizercalibration #defineCCxxx0_FSCAL20x24//Frequencysynthesizercalibration #defineCCxxx0_FSCAL10x25//Frequencysynthesizercalibration #defineCCxxx0_FSCAL00x26//Frequencysynthesizercalibration #defineCCxxx0_RCCTRL10x27//RCoscillatorconfiguration #defineCCxxx0_RCCTRL00x28//RCoscillatorconfiguration #defineCCxxx0_FSTEST0x29//Frequencysynthesizercalibration control #defineCCxxx0_PTEST0x2A//Productiontest 大学本科毕业设计 #defineCCxxx0_AGCTEST0x2B//AGCtest #defineCCxxx0_TEST20x2C//Varioustestsettings #defineCCxxx0_TEST10x2D//Varioustestsettings #defineCCxxx0_TEST00x2E//Varioustestsettings #defineCCxxx0_PARTNUM0x30 #defineCCxxx0_VERSION0x31 #defineCCxxx0_FREQEST0x32 #defineCCxxx0_LQI0x33 #defineCCxxx0_RSSI0x34 #defineCCxxx0_MARCSTATE0x35 #defineCCxxx0_WORTIME10x36 #defineCCxxx0_WORTIME00x37 #defineCCxxx0_PKTSTATUS0x38 #defineCCxxx0_VCO_VC_DAC0x39 #defineCCxxx0_TXBYTES0x3A #defineCCxxx0_RXBYTES0x3B #defineCCxxx0_PATABLE0x3E #defineCCxxx0_TXFIFO0x3F #defineCCxxx0_RXFIFO0x3F #defineCCxxx0_SRES0x30//Resetchip. #defineCCxxx0_SFSTXON0x31//Enableandcalibratefrequency synthesizer(_AUTOCAL=1).//IfinRX/TX:Gotoawaitstatewhere onlythesynthesizerisrunning(forquickRX/TXturnaround). #defineCCxxx0_SXOFF0x32//Turnoffcrystaloscillator. #defineCCxxx0_SCAL0x33//Calibratefrequencysynthesizerand turnitoff(enablesquickstart). #defineCCxxx0_SRX0x34//mcalibrationfirst _AUTOCAL=1. #defineCCxxx0_STX0x35//InIDLEstate:m _AUTOCAL=stateandCCAisenabled:Only gotoTXifchannelisclear. #defineCCxxx0_SIDLE0x36//ExitRX/TX,turnofffrequency synthesizerandexitWake-On-Radiomodeifapplicable. #defineCCxxx0_SAFC0x37//PerformAFCadjustmentofthe frequencysynthesizer 大学本科毕业设计 #defineCCxxx0_SWOR0x38//StartautomaticRXpolling sequence(Wake-on-Radio) #defineCCxxx0_SPWD0x39//EnterpowerdownmodewhenCSn goeshigh. #defineCCxxx0_SFRX0x3A//FlushtheRXFIFObuffer. #defineCCxxx0_SFTX0x3B//FlushtheTXFIFObuffer. #defineCCxxx0_SWORRST0x3C//Resetrealtimeclock. #defineCCxxx0_SNOP0x3D//sedtopad strobecommandstotwo #defineWRITE_SINGLE0x00//写入 #defineWRITE_BURST0x40//连续写入 #defineREAD_SINGLE0x80//读取 #defineREAD_BURST0xC0//连续读取 //---------------------上下位机串口调试命令----------------------------- #defineUART_READ_BACK0x01//串口回显,测试串口用 #defineCC2500_READ_RXADDR0xB0 #defineCC2500_READ_TXADDR0xB1 #defineCC2500_WRITE_RXADDR0xB2 #defineCC2500_WRITE_TXADDR0xB3 #defineCC2500_READ_BUF320xB4 #defineCC2500_READ_REG0xB5 #defineCC2500_WRITE_REG0xB6 #defineCC2500_WRITE_BUF320xB7 #defineCC2500_SET_RXMODE0xB8 #defineCC2500_RX0xB9 #defineCC2500_TX0xBA 大学本科毕业设计 #defineCC2500_CMD0xBD #defineCC2500_INIT0xBE #defineCC2500_EXT0xBF //RF_SETTINGSisadatastructurewhichcontainsallrelevantCCxxx0registers typedefstructCC2500_RF_SETTINGS { unsignedcharIOCFG2;//GDO2outputpinconfiguration unsignedcharIOCFG1; unsignedcharIOCFG0;//GDO0outputpinconfiguration unsignedcharFIFOTHR; unsignedcharSYNC1; unsignedcharSYNC0; unsignedcharPKTLEN;//Packetlength. unsignedcharPKTCTRL1;//Packetautomationcontrol. unsignedcharPKTCTRL0;//Packetautomationcontrol. unsignedcharADDR;//Deviceaddress. unsignedcharCHANNR; unsignedcharFSCTRL1;//Frequencysynthesizercontrol. unsignedcharFSCTRL0;//Frequencysynthesizercontrol. unsignedcharFREQ2;//Frequencycontrolword,highunsignedchar. unsignedcharFREQ1;//Frequencycontrolword,middleunsignedchar. unsignedcharFREQ0;//Frequencycontrolword,lowunsignedchar. unsignedcharMDMCFG4;//Modemconfiguration. unsignedcharMDMCFG3;//Modemconfiguration. unsignedcharMDMCFG2;//Modemconfiguration. unsignedcharMDMCFG1;//Modemconfiguration. unsignedcharMDMCFG0;//Modemconfiguration. unsignedcharDEVIATN;//Modemdeviationsetting(whenFSKmodulationis enabled). unsignedcharMCSM2;//MainRadioControlStateMachineconfiguration. 大学本科毕业设计 unsignedcharMCSM1;//MainRadioControlStateMachineconfiguration. unsignedcharMCSM0;//MainRadioControlStateMachineconfiguration. unsignedcharFOCCFG;//FrequencyOffsetCompensationConfiguration. unsignedcharBSCFG;//BitsynchronizationConfiguration. unsignedcharAGCCTRL2; unsignedcharAGCCTRL1; unsignedcharAGCCTRL0; unsignedcharWOREVT1; unsignedcharWOREVT0; unsignedcharWORCTRL; unsignedcharFREND1;//FrontendRXconfiguration. unsignedcharFREND0;//FrontendRXconfiguration. unsignedcharFSCAL3;//Frequencysynthesizercalibration. unsignedcharFSCAL2;//Frequencysynthesizercalibration. unsignedcharFSCAL1;//Frequencysynthesizercalibration. unsignedcharFSCAL0;//Frequencysynthesizercalibration. unsignedcharRCCTRL1; unsignedcharRCCTRL0; unsignedcharFSTEST;//Frequencysynthesizercalibrationcontrol unsignedcharPTEST; unsignedcharAGCTEST; unsignedcharTEST2;//Varioustestsettings. unsignedcharTEST1;//Varioustestsettings. unsignedcharTEST0;//Varioustestsettings. }CC2500_RF_SETTINGS; unsignedcharPaTabel[8]={0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0}; //--------------------------CC2500寄存器配置--------------------------------- constCC2500_RF_SETTINGSCC2500_Config= { 0x0B,//IOCFG2GDO2outputpinconfiguration. 0x06,//IOCFG1 0x06,//IOCFG0GDO0outputpinconfiguration. 0x07,//FIFOTHR 大学本科毕业设计 0xD3,//SYNC1MSB 0x91,//SYNC0LSB 1+CC2500_DATA_LEN,//PKTLENPacketlength. 0x02,//PKTCTRL1Packetautomationcontrol. 0x04,//PKTCTRL0Packetautomationcontrol. 0x01,//ADDRDeviceaddress. 0x00,//CHANNRChannelnumber. 0x07,//FSCTRL1Frequencysynthesizercontrol. 0x00,//FSCTRL0Frequencysynthesizercontrol. 0x5D,//FREQ2Frequencycontrolword,highbyte. 0x93,//FREQ1Frequencycontrolword,middlebyte. 0xB1,//FREQ0Frequencycontrolword,lowbyte. 0x2D,//MDMCFG4Modemconfiguration. 0x3B,//MDMCFG3Modemconfiguration. 0x73,//MDMCFG2Modemconfiguration. 0x22,//MDMCFG1Modemconfiguration. 0xF8,//MDMCFG0Modemconfiguration. 0x47,//DEVIATNModemdeviationsetting(whenFSKmodulationis enabled). 0x00,//MCSM2MainRadioControlStateMachineconfiguration. 0x02,//MCSM1MainRadioControlStateMachineconfiguration. 0x18,//MCSM0MainRadioControlStateMachineconfiguration. 0x1D,//FOCCFGFrequencyOffsetCompensationConfiguration. 0x1C,//BSCFGBitsynchronizationConfiguration. 0xC7,//AGCCTRL2AGCcontrol. 0x00,//AGCCTRL1AGCcontrol. 0xB2,//AGCCTRL0AGCcontrol. 0x00,//WOREVT1 0x00,//WOREVT0 0x00,//WORCTRL 0xB6,//FREND1FrontendRXconfiguration. 0x10,//FREND0FrontendRXconfiguration. 大学本科毕业设计 0xEA,//FSCAL3Frequencysynthesizercalibration. 0x0A,//FSCAL2Frequencysynthesizercalibration. 0x00,//FSCAL1Frequencysynthesizercalibration. 0x11,//FSCAL0Frequencysynthesizercalibration. 0x00,//RCCTRL1 0x00,//RCCTRL0 0x59,//FSTESTFrequencysynthesizercalibration. 0x00,//PTEST 0x00,//AGCTEST 0x88,//TEST2Varioustestsettings. 0x31,//TEST1Varioustestsettings. 0x0B,//TEST0Varioustestsettings. }; voiddelay_1ms(void) { unsignedchara,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } voiddelay_nms(unsignedintn) { unsignedinti=0; for(i=0;i delay_1ms(); } voiddelay_spi() { nop(); } 大学本科毕业设计 //---------------------------CC2500射频芯片初始化函数-------------------------------------- voidCC2500_Init(void) { CSN=1; delay_nms(250); CSN=0; delay_nms(250); CSN=1; delay_nms(250); CSN=0; SpiTxRxByte(CCxxx0_SRES);//写入复位命令 CSN=1; delay_nms(250);// CC2500_WriteReg(CCxxx0_FSCTRL1,CC2500_1); CC2500_WriteReg(CCxxx0_FSCTRL0,CC2500_0); CC2500_WriteReg(CCxxx0_FREQ2,CC2500_2); CC2500_WriteReg(CCxxx0_FREQ1,CC2500_1); CC2500_WriteReg(CCxxx0_FREQ0,CC2500_0); CC2500_WriteReg(CCxxx0_MDMCFG4,CC2500_4); CC2500_WriteReg(CCxxx0_MDMCFG3,CC2500_3); CC2500_WriteReg(CCxxx0_MDMCFG2,CC2500_2); CC2500_WriteReg(CCxxx0_MDMCFG1,CC2500_1); CC2500_WriteReg(CCxxx0_MDMCFG0,CC2500_0); CC2500_WriteReg(CCxxx0_CHANNR,CC2500_); CC2500_WriteReg(CCxxx0_DEVIATN,CC2500_N); CC2500_WriteReg(CCxxx0_FREND1,CC2500_1); CC2500_WriteReg(CCxxx0_FREND0,CC2500_0); CC2500_WriteReg(CCxxx0_MCSM0,CC2500_0); CC2500_WriteReg(CCxxx0_FOCCFG,CC2500_); CC2500_WriteReg(CCxxx0_BSCFG,CC2500_); CC2500_WriteReg(CCxxx0_AGCCTRL2,CC2500_L2); CC2500_WriteReg(CCxxx0_AGCCTRL1,CC2500_L1); CC2500_WriteReg(CCxxx0_AGCCTRL0,CC2500_L0); 大学本科毕业设计 CC2500_WriteReg(CCxxx0_FSCAL3,CC2500_3); CC2500_WriteReg(CCxxx0_FSCAL2,CC2500_2); CC2500_WriteReg(CCxxx0_FSCAL1,CC2500_1); CC2500_WriteReg(CCxxx0_FSCAL0,CC2500_0); CC2500_WriteReg(CCxxx0_FSTEST,CC2500_); CC2500_WriteReg(CCxxx0_TEST2,CC2500_2); CC2500_WriteReg(CCxxx0_TEST1,CC2500_1); CC2500_WriteReg(CCxxx0_TEST0,CC2500_0); CC2500_WriteReg(CCxxx0_IOCFG2,CC2500_2); CC2500_WriteReg(CCxxx0_IOCFG0,CC2500_0); CC2500_WriteReg(CCxxx0_PKTCTRL1,CC2500_L1); CC2500_WriteReg(CCxxx0_PKTCTRL0,CC2500_L0); CC2500_WriteReg(CCxxx0_ADDR,CC2500_); CC2500_WriteReg(CCxxx0_PKTLEN,CC2500_); CC2500_WriteBurstReg(CCxxx0_PATABLE,PaTabel,8);//原来没写 CC2500_Command(CCxxx0_SFRX); CC2500_Command(CCxxx0_SFTX); CC2500_Command(CCxxx0_SIDLE); } //---------------------------CC2500设置接收模式函数-------------------------------------- voidCC2500_SetRxMode(void) { CC2500_Command(CCxxx0_SRX); } //---------------------------CC2500寄存器写入函数-------------------------------------- voidCC2500_WriteReg(unsignedcharaddr,unsignedcharvalue) { CSN=0; while(MISO); SpiTxRxByte(addr|WRITE_SINGLE);//写地址 大学本科毕业设计 SpiTxRxByte(value);//写入配置 CSN=1; delay_nms(50); }// //---------------------------CC2500寄存器读取函数-------------------------------------- unsignedcharCC2500_ReadReg(unsignedcharaddr) { unsignedcharvalue; CSN=0; while(MISO); SpiTxRxByte(addr|READ_SINGLE); value=SpiTxRxByte(0); CSN=1; returnvalue; } //---------------------------CC2500寄存器连续写入函数-------------------------------------- voidCC2500_WriteBurstReg(unsignedcharaddr,unsignedchar*buffer,unsignedchar count) { unsignedchari; CSN=0; while(MISO); SpiTxRxByte(addr|WRITE_BURST); for(i=0;i { SpiTxRxByte(buffer[i]); } CSN=1; delay_nms(50); } //---------------------------CC2500寄存器连续读取函数-------------------------------------- voidCC2500_ReadBurstReg(unsignedcharaddr,unsignedchar*buffer,unsignedchar count) 大学本科毕业设计 { unsignedchari; CSN=0; while(MISO); SpiTxRxByte(addr|READ_BURST); for(i=0;i { buffer[i]=SpiTxRxByte(0); } CSN=1; } //----------------------------CC2500命令函数------------------------------ voidCC2500_Command(unsignedcharcmd) { CSN=0; while(MISO); SpiTxRxByte(cmd);//写入命令 CSN=1; } //--------------------------SPI初始化函数--------------------------- voidSPI2500_Init(void) { CSN=1; SCK=0; } unsignedcharSpiTxRxByte(unsignedchardat) { unsignedcharl,temp; temp=0; SCK=0; for(l=0;l<8;l++) { if(dat&0x80) 大学本科毕业设计 { MOSI=1; } elseMOSI=0; dat<<=1; SCK=1; nop(); nop(); temp<<=1; if(MISO)temp++; SCK=0; nop(); nop(); } returntemp; } //---------------------------CC2500数据包发送函数-------------------------------------- voidCC2500_TxPacket(void) { //CC2500_WriteReg(CCxxx0_TXFIFO,1+CC2500_DATA_LEN); CC2500_WriteBurstReg(CCxxx0_TXFIFO,CC2500_TxRxBuf,1+CC2500_DATA_ LEN);//写入要发送的数据 CC2500_Command(CCxxx0_STX); //进入发送模式发送数据 while(!GDO0);//WaitforGDO0tobeset->synctransmitted while(GDO0);//WaitforGDO0tobecleared->endofpacket delay_nms(250); CC2500_Command(CCxxx0_SFTX);//刷新发送缓冲区 CC2500_Command(CCxxx0_SIDLE); } //-------------------以下是CC2500数据包发送接收程序---------------------------------// //-------------------*********************************--------------------------------// //---------------------------CC2500数据包接收函数-------------------------------- unsignedcharCC2500_RxPacket(void) 大学本科毕业设计 { if((1+CC2500_DATA_LEN)==CC2500_ReadReg(CCxxx0_RXBYTES|READ_B URST)) { CC2500_ReadBurstReg(CCxxx0_RXFIFO,CC2500_TxRxBuf,1+CC2500_DATA_ LEN);//读出所有接收到的数据 return1; } else { return0; } } //---------------------------CC2500接收地址设置函数-------------------------------------- voidCC2500_Write_RxADDR(void) { CC2500_WriteReg(CCxxx0_ADDR,CC2500_RxAddr); } //---------------------------CC2500发送地址设置函数-------------------------------------- voidCC2500_Write_TxADDR(void) { CC2500_TxRxBuf[0]=0x01;//CC2500_TxAddr; } //-------------------结束CC2500数据发送接收程序定义 //-----------INSTRUCTIONOF25X40-------------------------// #defineWREN0X06//SETWRITEENABLELATCH #defineWRDI0X04//RESETWRITEENABLELATCH #defineRDSR0X05//READSTATUSREGISTER #defineWRSR0X01//WRITESTATUSREGISTER #defineREAD0X03//READDATAFROMMEMORYARRAY #definePROGRAM0X02//PROGRAMDATAINTOMEMORYARRAY #defineSECTOR_ERASE0X20//ERASEONESECTORINMEMORY ARRAY 大学本科毕业设计 #defineCHIP_ERASE0Xc7//ERASEALLSECIORSINMEMORYARRAY #defineRDI0X90//READMANUFACTUREANDPRODUCTid voidWrite8Bit(unsignedcharByte) { unsignedcharx=0; _cs=0; for(x=0;x<8;x++) { if((Byte&0x80)==0x80) _mosi=1; else _mosi=0; _clk=1; Byte=(Byte<<1); nop();nop();nop();nop(); _clk=0; } } unsignedcharRead8Bit() { unsignedcharx=0,in=0,temp=0; _cs=0; for(x=0;x<8;x++) { in=(in<<1); temp=_miso; _clk=1; if(temp==1) in|=0x01; _clk=0; } returnin; 大学本科毕业设计 } voidWriteDis(void) { _cs=0; delay_spi(); Write8Bit(WRDI);//sendWRENinstruction delay_spi(); _cs=1; } voidTwo_Read(unsignedcharHaddress,unsignedcharMaddress,unsignedchar Laddress,unsignedchar*Read_Data) { _cs=0; delay_spi(); Write8Bit(READ);//sendREADinstruction Write8Bit(Haddress);//sendhighaddress Write8Bit(Maddress);//sendmiddleaddress Write8Bit(Laddress);//sendlowaddress Read_Data[0]=Read8Bit();//Readdataonebyte Read_Data[1]=Read8Bit();// delay_spi(); _cs=1; } main() { SPI2500_Init(); CC2500_Init(); P0=table[0]; do{ if(k1==0) {for(i=20;i>0;i--) for(j=248;j>0;j--); 大学本科毕业设计 if(k1==0) {mod++; n++; if(n==2) { n=0; } if(mod==2) { mod=0; } P0=table[n]; } while(k1==0); } if(mod==0) { CC2500_Write_TxADDR(); //for(j=98;j>0;j--); WriteDis(); H_address=0x00; M_address=0x34; L_address=0x00; do { for(u=3;u<32;u++){ Two_Read(H_address,M_address,L_address,Read_Data);//读取两个字节 k_datal=Read_Data[0];//读取AT512的高位数据 k_datah=Read_Data[1];//读取AT512的高位数据 if(L_address>=254)//AT512的地址处理 { if(M_address>=0xff) { H_address=H_address+1; } 大学本科毕业设计 M_address=M_address+1; } L_address=L_address+2;//每次增加2 if(H_address==0xff) {M_address=0x34;} D_CO=(k_datah-6)/2; CC2500_TxRxBuf[u]=D_CO;} CC2500_TxRxBuf[1]=0x5a; CC2500_TxRxBuf[2]=0xa5; CC2500_TxPacket(); }while(k1==1); } elseif(mod==1) {CC2500_Write_RxADDR(); CC2500_SetRxMode(); do { if(CC2500_RxPacket()) { if((CC2500_TxRxBuf[1]==0xa5)&(CC2500_TxRxBuf[2]==0x5a)) { for(o=3;o<32;o++) {D_CI=CC2500_TxRxBuf[o]; TMOD=0x02; TH0=0xfe; TL0=0xfe; ET0=1; EA=1; TR0=1; while(TR0==1); } } } WriteDis(); 大学本科毕业设计 H_address=0x00; M_address=0x34; L_address=0x00; do { Two_Read(H_address,M_address,L_address,Read_Data);//读取两个字节 k_datal=Read_Data[0];//读取AT512的高位数据 k_datah=Read_Data[1];//读取AT512的高位数据 if(L_address>=254)//AT512的地址处理 { if(M_address>=0xff) { H_address=H_address+1; } M_address=M_address+1; } L_address=L_address+2;//每次增加2 if(H_address==0xff) {M_address=0x34;} D_CO=(k_datah-6)/2; TMOD=0x20; TH1=0xfe; TL1=0xfe; ET1=1; EA=1; TR1=1; while(TR1==1); }while(k1==1); }while(k1==1); } }while(1); } voidTimer0()interrupt1 { 大学本科毕业设计 TR0=0; TF0=0; if(++count==D_CI) { PWMOUT1=0; } elseif(count==125)//PWM的频率为8khz左右 { count=0; PWMOUT1=1; } } voidTimer1()interrupt3 { TR1=0; TF1=0; if(++count==D_CO) { PWMOUT=0; } elseif(count==125)//PWM的频率为8khz左右 { count=0; PWMOUT=1; } }