第一篇:无线麦克风课程设计报告
高频电子电路课程设计:无线麦克风
目录
1.绪论………………………………………………………………………………………2 1.1摘要………………………………………………………………………………………2 1.2开发环境介绍……………………………………………………………………………2 2设计目的和意义……………………………………………………………………………3 2.1设计目的…………………………………………………………………………………3 2.2设计意义…………………………………………………………………………………3 3需求及分析…………………………………………………………………………………4 4设计方案……………………………………………………………………………………5 5设计原理及电路……………………………………………………………………………5 5.1设计原理…………………………………………………………………………………6 5.2电路工作原理……………………………………………………………………………6 5.3原理电路…………………………………………………………………………………7 6.Multism仿真实现…………………………………………………………………………10 7.实物实现…………………………………………………………………………………12 8设计心得……………………………………………………………………………………13 9.参考文献…………………………………………………………………………………14
高频电子电路课程设计:无线麦克风
1.绪论
1.1摘要
高频电子线路系统地介绍了通信系统,特别是无线通信系统中的最基本电路及他们的功能,给出了定性及定量分析这些电路性能的方法。这些电路包括了发射机及接收机中的选频放大电路、混频电路、功放电路、振荡电路、调制及解调电路、锁相环电路、自动增益控制电路及频率合成电路。
本课程的基本知识教学目标与能力目标是:通过理论和实践教学,使学生了解晶体管工作于高频时的工作原理,特性参数及微变等效电路,掌握高频单元电路的线路组成、基本工作原理、分析方法、技术要求及一些典型集成电路的实际应用,并且具备一定的理论水平和足够的实践技能,以及使用先进仿真软件的能力,为进一步学习、掌握电子、通讯技术的专业知识和职业技能打下基础。
高频电子线路是一门理论性、工程性和实践性都很强的课程。学生通过本课程的学习,不但应该掌握必要的基础理论知识,而且还应在分析问题、解决问题和实际动手能力等方面得到锻炼和提高。对于这些能力的培养,理论教学与实践教学环节必须密切联系、互相配合,才会取得比较好的效果。在本课程教学中应从以下几个方面来加强这些能力的培养: 1 .在分析问题的方法上,由常用基本电路入手,讲清基本原理,然后适当综合,再应用到实用电路的分析中去。. 注意与实践课的配合,在理论课中讲清基本原理、典型电路和基本应用电路,在实践课中学习有关电路的测试、调整的原理和方法以及器件的参数选择等。.增加必要的例题和实用电路的分析。例题着重于问题的分析过程和解题方法的介绍,对电路实例的分析则力求由浅入深。
2设计目的和意义
2.1设计目的
(1)了解无线调频话筒的构成,并设计一小功率调频无线话筒。(2)理解和掌握无线调频话筒的主要技术指标和测试方法。(3)根据给出的技术条件和指标,设计无线调频话筒。(4)能够独立搭接电路、掌握调试技术。
高频电子电路课程设计:无线麦克风
(5)增强对课本理论知识的理解,并提升到实践制作当中,做到了学以致用。
2.2.设计意义
(1)针对目前市场上无线话筒鱼龙混杂,一般消费者消费又无法分别的现状,这次课程设计专门要设计一款无线话筒,这款话筒采用调频的方法发射信号,频率比较稳定,发射距离比较远,可以满足各种不同的需求,而且在设计过程中非常重视性价比,这主要是为低端消费者考虑的。
(2)如果本次课程设计可以成功,不仅可以使我们更好地理解调频无线话筒的原理,也会增加我们探索无线电的兴趣。如果设计不成功或达不到要求,本次课程设计也会使我们明白实践与理论的结合需要多加练习,从而认识到自己的不足,在以后的学习中加强实践。总之,这次课程设计会帮我们提高很多。
3.设计要求
(1)发射频率76-90mhz(2)采用调频模式
(3)频率偏移75khz(4)电源电压3.6-6
4设计原理及电路
4.1设计原理
电路板上的电子元件话筒(咪头)先将自然界的声音信号变成音频电信号,这个电信号会去调制电子振荡器产生的高频信号。最后,高频信号通过天线发射到空中。
我们将发射频率设计在FM收音机波段,因此可以配合任何FM收音机接收到该高频信 3
高频电子电路课程设计:无线麦克风
号,并从该高频信号还原出声音信号,从而完成各种用途。
4.2电路工作原理
话筒先将声音信号变成音频电信号,这个电信号会去调制电子振荡器产生的高频信号。最后,高频信号通过天线发射到空中。
我们将发射频率设计在 FM收音机波段,因此可以配合任何FM收音机接收到该高频信号,并从该高频信号还原出声音信号,从而完成各种用途。
话筒MIC采用的是驻极体小话筒,灵敏度非常高,可以采集微弱的声音,同时这种话筒工作时必须要有直流的偏压才能工作。
4.3原理电路
其中分为三部分,第一部分为声音信号接收部分,第二部分为振荡电路部分,第三部分为前后匹配耦合部分
高频电子电路课程设计:无线麦克风
5参数计算
5.1电感L的计算
在本电路中,最关键的是就是电感L的计算,因此在理论部分我们着重放在电感的计算上。首先我们根据电路原理图画出交流通路
再根据交流通路画出简化后的震荡部分
(a)(b)
高频电子电路课程设计:无线麦克风
(c)其中(a)为输入装置的电路
(b)为利用CA置换C1~C4(c)为利用CB置换C5和CV
5.2确定电感L的线圈数
我们利用诺模型可以确定线圈的形状。由之前我们计算的L=0.24 μH
高频电子电路课程设计:无线麦克风
假定线圈匝数n=5 直径D=10mm 因此由下图可以得到 绕线长度l=6mm
5.3静态工作点的计算
首先画出直流通路图
高频电子电路课程设计:无线麦克风
这一部分是直流通路,用于计算和确定静态工作点,这样就需要计算出Vb,Ic,Ib,Vce.5.Multism仿真实现
仿真的波形图
高频电子电路课程设计:无线麦克风
我们是按照80MHz的中心频率来计算的,在实际得到的仿真波形中可以算的频率在80MHz~85MHz之间(周期通过肉眼不能完全准确的确定)。
因此说仿真的得到的波形是我们所预期的,仿真部分所得结果比较完美,但仔细看稍微有点失真,这或许与我们所选级联电容等有一定关系,但总体来说波形不错。
6.实物波形检测
如下为我们实际测量得到的波形图
其中每段波形右边较粗的部分既为FM调频的表现,因此不管是从所得频率方面(87.95MHz,因为为自己手工绕制的电感有些许误差,但小于10%,在误差允许范围内),还是从波形的调制方面我们实际测试所得结果也是十分满意的。
7.实物焊接
所使用的焊接图如下(焊接之后发现图中有缺连部分,之后的总结中会提到)
高频电子电路课程设计:无线麦克风
焊接后所得到的实际电路板如下:
红线和蓝线为电源接出线,用一段导线做天线。
高频电子电路课程设计:无线麦克风
在最终的实际收听中我们得到的中心频率为88.9MHz与测得的88.95MHz可以认为相同(可能电感在触碰过程中有细微变化)
在测试收听距离时,因为我们没有专门设置几级放大电路,因此收听距离最远在8米左右(用两节5号电池测试)。
9参考文献
1.铃木宪治,高频电路设计与制作,北京:科学技术出版社,2005.4,第一版。2.谢自美,电子线路设计实验测试,武汉:华中科技大学,2000.7,第二版。
第二篇:教学用2.4G无线麦克风解决方案
教学用2.4G无线麦克风解决方案
互拓科技研发的2.4G智能无线教学麦克风在学校电脑教学上得到了广泛的应用与一致的好评!
互拓科技2.4G智能无线麦克风的介绍
深圳市互拓科技有限公司,专注于提供音频解决方案,通过不断的技术革新和努力,推出高品质的2.4G智能型无线麦克风,同时推出了领夹式的麦克风,解决了行业所碰到的如爆破音、领夹式麦克风远距离拾音、电池续航、设备不稳定等不能解决的问题,并得到众多用户的好评。
2.4G无线麦克风是完全数字化的麦克风,发射机的驻极体话筒信号(语音)通过音频AD转换器转换成数字音频信号,然后使用高速DSP处理芯片对这些数字信号进行封装,最后调制到2.4GHz ISM 频段,使用跳频方式传输給接收机,接收机对信号流进行处理后通过DA转换器将音频信号转换为模拟信号传输給音频功率放大器进行扩音。由于采用双向通信方式,其发射机和接收机可以通过地址码识别、锁定等软件手段,实现发射机和接收机的自动匹配、任意匹配。并且,采用高速嵌入式系统和DSP系统,能对高达96k,24bit的语音信号进行采样、处理和传输,因此语音效果达到高保真质量。
2.4GHz数字无线麦克风软硬件系统、通信协议、语音算法均为生产者自主知识产权,因此整个系统可以针对教学应用开发,非常适合教育工作者使用。
2.4g话筒,解放您的双手,保护您的嗓子,低功耗,拾音距离理想,保护从2.4g话筒做起.好的2.4g话筒是您一生的福利,健康伴您每节课,每次演讲.此从上图中可以看到,深圳互拓蓝牙无线麦克风通过数字蓝牙信号将使用者的声音传递到蓝牙接收器上,接收器通过音频线连接到已有的有源音箱、功放、一体机上,即可实现无线扩音功能。方案适合多媒体的教室改造,添加蓝牙扩声设备。
第三篇:无线课程设计实验报告
扩频实验报告
学 院: 电子信息工程学院
专 业: 通信工程 组员: 12211008 吕兴孝 12211010 牟文婷 12211096 郑羲 12211004 冯顺 任课教师: 姚冬萍 1实验四 扩频实验
一、实验目标
在本实验中你要基于labview+usrp平台实现一个扩频通信系统,你需要在对扩频技术有一定了解的基础上编写程序,完成所有要求的实验任务。在这一过程中会让你对扩频技术有更直接和感性的认识,并进一步掌握在labview+usrp平台上实现通信系统的技巧。
二、实验环境与准备
软件环境:labview 2012(或以上版本);
硬件环境:一套usrp和一台计算机;
实验基础:了解labview编程环境和usrp的基本操作;
知识基础:了解扩频通信的基本原理。
三、实验介绍
1、扩频通信技术简介
扩频通信技术是一种十分重要的抗干扰通信技术,可以大大提高通信系统的抗干扰性能,在电磁环境越来越恶劣的情况下,扩频技术在诸多通信领域都有了十分广泛的应用。
扩频技术简单来讲就是将信息扩展到非常宽的带宽上——确切地说,是比数据速率大得多的带宽。在扩频系统中,发端用一种特定的调制方法将原始信号的带宽加以扩展,得到扩频信号;然后在收端对接收到的扩频信号进行解扩处理,把它恢复为原始的窄带信号。
扩频系统之所有具有较强的抗干扰能力,是因为接收端在接收到扩频信号后,需要通过相关处理对接收信号进行带宽的压缩,将其恢复成窄带信号。对于干扰信号而言,由于与扩频信号不相关,所以会被扩展到很宽的频带上,使之进入信号带宽内的干扰功率大幅下降,即增加了相关器输出端的信号/干扰比。因此扩频系统对大多数人为干扰都具有很强的抵抗能力。
22、发射端程序简介
本实验包括发射端和接收端两个主程序,其中发射端主程序top_tx的前面板如图1所示。
图1 发射端程序前面板
前面板上部的选项卡控件中可以配置各项参数。在硬件参数部分中可以配置usrp的ip地址、载波频率等参数;在信号参数部分中可以配置调制方式、设配采样速率、成型滤波器等参数;在信道模型参数部分中你可以选择不同的信道模型并设置噪声功率;在右侧你可以设置扩频码的长度。在前面板下方为显示界面,包括发送信号的时域/频域波形以及星座图和眼图。
发射端的程序框图主要由两部分组成。
主程序框图左侧的transmitter子程序完成发射信号的生成、扩频、调制等功能,程序框图如图2所示。
3图2 transmitter的程序框图
3、接收端程序简介
接收端主程序top_rx的前面板如图3所示。
图3 接收端程序前面板
与发射端程序类似,接收端主程序前面板上部为各项参数的输入,例如硬件参数、扩频参数、同步参数等。前面板下部显示生成的图形,包括星座图、眼图、信噪比/误码率曲线等。接收端端的程序框图也主要由两部分组成。
主程序框图右侧的receiver.vi子程序主要完成发射信号的接受、同步、解扩和解调等功能,程序框图如图3所示。4 图3 receiver.vi 的程序框图
matched filter子程序完成匹配滤波;其中rx init子程序是接收机的初始化;
synch子程序使同步模块,完成收发同步;channel estimated子程序完成信道估计;equalize子程序的作用是信道均衡;strip control子程序用来删除控制信息,即训练序列;decode子程序实现信号的解调;de-dsss子程序用来实现解扩;error detect子程序的作用是计算误码率。
接收端主程序框图的其他部分主要用来完成usrp的配置、计算信噪比/误码率曲线以及生成所需的图形。
四、实验任务
1、ds-ss.vi子程序
ds-ss子程序的作用是对信源进行直接扩频(direct sequence spread spectrum)。其原理是利用10个以上的chips来代表原来的0或1,使得原来较高功率、较窄的频谱变成具有较宽频的低功率频谱,这种特性类似于噪声功率谱,因此接收端只有知道正确的扩频码才能进行正确的接收,进而增加了传输的可靠性。它是一种数字调制方法,具体说,就是将信源与一定的pn码(伪随机码、chip)进行同或运算。例如,在发射端用11000100110代替1,用00110010110代替0,这个过程就实现了扩频。上述过程如图4所示。
图4 扩频的实现过程
前面板:
图6 ds-ss前面板 ds-ss程序框图:
图7 ds-ss程序框图
实验步骤:
1、首先产生所需长度的伪随机序列(pn序列): pn序列(pseudo-noise sequence)即伪噪声序列,这类序列具有类似随机噪声的一些统计特性,但和真正的随机信号不同,它可以重复产生和处理,故称作
pn码最见的用途是在扩频系统中用来扩展信号频谱;伪随机噪声序列。此外pn 码也可以用来作为信源信息。
图8 mt generate bits输入输出
其中total bits为生成的伪随机序列的总长度、pn sequence order用来设定pn序列的循环周期(如果pn sequence order设为n,则周期为)、seed in指定pn序列生成器移位寄存器的初始状态(默认为0xd6bf7df2);output bit stream为伪随机序列的输出。
此外mt generate bits函数还有user defined模式,在此模式下函数可以 根据用户自定义的输入序列生成所需长度的循环序列。其输入输出如图9所示:
图9 user defined模式的输入输出 其中user base bit pattern为用户指定的序列,控件会不断循环用户指定的序列output bit stream为生成序列的直到输出序列的长度达到total bits所设定的值。输出。
本例中用到了三个mt generate bits函数,分别用来生成保护序列、同步序列和信息序列。
2、利用产生的序列对信源序列进行扩展:
图10 扩频模块
输入信源bit码、pn扩频码、误差;输出扩频码、误差。
72、de-dsss.vi子程序
de-dsss子程序的作用是在接收端实现对信号的解扩。解扩操作即扩频操作的逆过程。继续使用上面的例子,当你在发射端用11000100110代替1,而用00110010110代替0后,在接收机处只要把收到的序列是11000100110恢复成1,而00110010110恢复成0,这就是解扩。上述过程如图0所示。
图11 解扩的实现过程
前面板:
图12 de-dsss前面板 de-dsss程序框图:
图13 de-dsss程序框图
五、实验步骤:
1、产生所需长度的并与发射端相同伪随机序列(pn序列),同ds-ss;
2、然后利用产生的序列对接收信号进行解扩:
输入:将信源与pn序列通过“数组大小”模块返回其长度,相除得到的商作为搜索深度;输入经信道传输后的扩频码、与发送端同步的扩频序列以及误差。输出得解扩后码序列以及误差。
3、实验验证
在ds-ss子程序中,你可以手动输入一串0/1作为信源序列,并设置好pn序列的长度(设为n)。单独运行ds-ss子程序,观察输出的序列长度是否扩展了n倍,并注意输出序列中pn码是否与相应的0或者1对应。验证成功的话便表明你的ds-ss子程序编写正确。并利用类似的方法验证de-dsss子程序的正确性。
然后验证发射端主程序是否能正确的发射我们想要的扩频信号。首先正确的连接usrp并合理的配置发射端的各项参数,运行程序。
然后你可能会看到如图
9至图所示的发射信号时域波形和频域波形。
图14不扩频的时域信号
图16扩频后的时域信号
图17扩频后的频域信号 图15不扩频的频域信号
10可以看出经过扩频的发射信号与不经过扩频的发射信号相比,在频域上进行
了展宽,在时域上变得更加密集。这与扩频的基本原理相符,说明发射端的设计基本正确。
在接收端,我们需要使得参数能够与发射端匹配,这样才能正常的接收。特
别需要注意capture time、packet length和rx sample rate这几个参数,你首先需要理解它们的意义,这样才能够正确的配置它们。如果你在发射端没有修改默认参数的话,接收端的默认参数恰好能够与发射端匹配。你需要同时运行发射端和接收端程序,在发射端正确运行时观察接收端能否正确接收。程序会计算当前信噪比下的误码率,并逐渐增大信噪比、最终得出一条信噪比/误码率曲线,如图3-4-11所示。你可能需要稍等一段时间才能够看到程序运行完成的结果。在接收端程序运行的同时,你可以进入receiver子程序中的ber detected子程序,在里面观察当前信噪比接收到的数据数和误码数,如图3-4-12所示。
图18误码率曲线 图19运行时的数据显示
然后你可以尝试改变收发端的各项参数,观察不同参数对运行结果的影响。最后你需要按照要求完成实验报告。
六、实验结果 qpsk: 将usrp连接电脑,更改ip地址等参数。频率使用915mhz避免干扰。如下图20: 11 发送端前面板调制参数以及发送星座图发送时域波形如下图21:
发送端眼图和发送端频域波形如下,眼图的尖锐程度和发送频率有关,如图22:
接收端的硬件参数和误码率如下图,如图23:
接收端眼图如图24所示: bpsk: 调制参数如下: 14bpsk:发送端硬件参数
发送端星座图:
接收端眼图:
接收端星座图及误码率曲线(信噪比较低):
五、实验扩展
1、解释接收端同步模块的具体实现方式及其利用的基本原理。
(1)初始同步,或称粗同步、捕获。它主要解决载波频率和码相位的不确定性,保
证解扩后的信号能通过相关器后面的中频滤波器,这是所有问题中最难解决的问题。
(2)跟踪,或称精同步。
接收机对接收到的信号,首先进行搜索,对收到的信号与本地码相位差的大小进行判断,若不满足捕获要求,即收发相位差大于一个码元,则调整时钟再进行搜索。直到使收发相位差小于一个码元时,停止搜索,转入跟踪状态。图3-4-5同步流程图
图3-4-6跟踪流程图
2、扩频通信技术除了有较强的抗干扰能力外,还具有哪些优点?逐一例举出来并简述扩频技术具有这些优点的原因。
(1)易于重复使用频率,提高了无线频谱利用率
无线频谱十分宝贵,虽然从长波到微波都得到了开发利用,仍然满足不了社会
17的需求。在窄带通信中,主要依靠波道划分来防止信道之间发生干扰。为此,世界各国都设立了频率管理机构,用户只能使用申请获准的频率。扩频通信发送功率极低,采用了相关接收技术,且可工作在信道噪声和热噪声背景中,易于在同一地区重复使用同一频率,也可与各种窄道通信共享同一频率资源。所以,在美国及世界绝大多数国家,扩频通信无须申请频率,任何个人与单位都可以无执照使用。
(2)抗干扰性强,误码率低
扩频通信在空间传输时所占用的带宽相对较宽,而接收端又采用相关检测的办法来解扩,使有用宽带信息信号恢复成窄带信号,而把非所需信号扩展成宽带信号,然后通过窄带滤波技术提取有用的信号。这样,对于各种干扰信号,因其在接收端的非相关性,解扩后窄带信号中只有很微弱的成分,信噪比很高,因此抗干扰性强。在商用的通信系统中,扩频通信是唯一能够工作在负信噪比条件下的通信方式。
(3)隐蔽性好,对各种窄带通信系统的干扰很小
由于扩频信号在相对较宽的频带上被扩展了,单位频带内的功率很小,信号湮没在噪声里,一般不容易被发现,而想进一步检测信号的参数如伪随机编码序列就更加困难,因此说其隐蔽性好。再者,由于扩频信号具有很低的功率谱密度,它对使用的各种窄带通信系统的干扰很小。
(4)可以实现码分多址
扩频通信提高了抗干扰性能,但付出了占用频带宽的代价。如果让许多用户共用这一宽频带,则可大大提高频带的利用率。由于在扩频通信中存在扩频码序列的扩频调制,充分利用各种不同码型的扩频码序列之间优良的自相关特性和互相关特性,在接收端利用相关检测技术进行解扩,则在分配给不同用户码型的情况下可以区分不同用户的信号,提取出有用信号。这样一来,在一宽频带上许多对用户可以同时通话而互不干扰。
(5)抗多径干扰
这两种技术在扩频通信中都易于实现。利用扩频码的自相关特性,在接收端从多径信号中提取和分离出最强的有用信号,或把多个路径来的同一码序列的波形相加合成,这相当于梳状滤波器的作用。另外,在采用频率跳变扩频调制方式的扩频系统中,由于用多个频率的信号传送同一个信息,实际上起到了频率分集的作用。
(6)能精确地定时和测距
电磁波在空间的传播速度是固定不变的光速,人们自然会想到如果能够精确测
18量电磁波在两个物体之间的传播时间,也就等于测量两个物体之间的距离。在扩频通信中如果扩展频谱很宽,则意味着所采用的扩频码速率很高,每个码片占用的时间就很短。当发射出去的扩频信号在被测量物体反射回来后,在接收端解调出扩频码序列,然后比较收发两个码序列相位之差,就可以精确测出扩频信号往返的时间差,从而算出两者之间的距离。测量的精度决定于码片的宽度,也就是扩展频谱的宽度。码片越窄,扩展的频谱越宽,精度越高。
(7)适合数字话音和数据传输,以及开展多种通信业务
扩频通信一般都采用数字通信、码分多址技术,适用于计算机网络,适合于数据和图像传输。
(8)安装简便,易于维护
扩频通信设备是高度集成,采用了现代电子科技的尖端技术,因此,十分可靠、小巧,大量运用后成本低,安装便捷,易于推广应用。
3、伪随机序列有许多种,例如m序列、gold序列、m序列等。尝试使用不同的方法来产生伪随机序列,并用其实现对信号的扩频。
(1)m序列是目前广泛应用的一种伪随机序列,m序列每一周期中 1 的个数比 0 的个数多 1 个。状态“0”或“1”连续出现的段称为游程。游程中“0”或“1” m序列的一个周期(p=2^n-1)中,的个数称为游程长度。游程总数为 2^n-1,“0”、“1”
各占一半。2个彼此移位等价的相异m序列,按模2相加所得的序列仍为m序列,并与原m序列等价。
(2)gold序列gold码序列是一种基于m序列的码序列,具有较优良的自相关和互相关特性,产生的序列数多。gold码的自相关性不如m序列,具有三值自相关特性;互相关性比m序列要好,但还没有达到最佳。是由两个码长相等、码时钟速率相同的m序列优选对通过模2相加而构成的。
4、适当的在系统中添加干扰,以验证扩频的良好的抗干扰能力。
强扩频通信系统扩展的频谱越宽,处理增益越高,抗干扰能力就越强。简单
地说,如果信号频谱展宽10倍,那么干扰方面需要在更宽的频带上去进行干扰,分散了干扰功率,从而在总功率不变的条件下,其干扰强度只有原来的1/10。另外,由于接收端采用扩频码序列进行相关检测,空中即使有同类信号进行干扰,如果不能检测出有用信号的码序列,干扰也起不了太大作用,因此抗干扰性能强是扩频通信的最突出的优点。19 20
第四篇:无线传感网络课程设计
无线传感网络 课程设计报告
姓名:胡韶辉 胡衎
2017
学号:139074377 139074376 班级:物131班 指导教师:卫琳娜
年1月1日
无线传感网络课程设计
实验
一、无线传感网络点对点通信实验
1.实验内容
此实验为验证实验,根据实验步骤进行实验,观察结果是否与预期相符
2.实验步骤
用IAR8.1打开路径:C:UsersxsDesktop无线传感器网络课程设计无线传感网实验资料201604感知RF2-2530WSNV1.2代码和例子程序Light_SwitchIDELight_Switchsrf05_cc2530IarLight_Switch.eww分别编译并下载至两个节点上,打开节点,左右键选择
/* 功 能:查找字符在索引中的哪一个位置 */ /**************************************************************************************************/ static u16 lookforChar(u8 ch){ uint16 i;for(i = 0;i < FONTLISTCOUNT;i ++){
if(fontList[i] == ch)
return i;} return i;}
//查中文
static u16 lookforChar16(u16 ch){ uint16 i,j;u16 temp16;for(i = 0;i < fontChar16ListCount;i ++){
j = i*2;
temp16 = fontChar16List[j + 1];
temp16 <<= 8;
temp16 |= fontChar16List[j];
if(temp16 == ch)
return i;} return i;}
/**************************************************************************************************/ /* 功 能:在指定位置输出8*8 */ /**************************************************************************************************/ static void LcdPutChar8(u8 x,u8 y,u8 ch){ LcdBuf[y][x] = ch;} /**************************************************************************************************/ /* 功 能:在指定位置输出16*16 */ /**************************************************************************************************/
/*static void LcdPutChar16(u8 x,u8 y,u16 ch){ LcdBuf[y][x] =(u8)ch;
//低前高后
LcdBuf[y+1][x] =(u8)(ch>>8);}
void LcdPutString8(u8 x,u8 y,u8 *ptr u8 len,u8 op){
u8 i,*tptr = ptr,xx = x,yy = y;u16 m;if(x > 95)
return;if(y > 1)
return;for(i = 0;i < len;i ++){
m = lookforChar(*tptr ++);
if(m!= FONTLISTCOUNT)
{
m = m * 8;
}
else
return;
xx += 8;
if(xx > 88)
return;} } */
void LcdClearRam(void){ u8 i;for(i = 0;i < 96;i ++){
LcdBuf[0][i] = 0;} for(i = 0;i < 96;i ++){
LcdBuf[1][i] = 0;} } void LcdClearScrean(void){ LcdClearRam();PutPic((void *)LcdBuf);}
void LcdPutString16_8(u8 x,u8 y,u8 *ptr,u8 len,u8 op){ u8 i,j,*tptr = ptr,xx = x,yy = y;u16 m;if(xx > 95)
return;if(yy)
return;
for(i = 0;i < len;i ++){
m = lookforChar(*tptr ++);
if(m!= FONTLISTCOUNT)
{
m = m * 16;
for(j = 0;j < 8;j ++)
{
if(op)
{
LcdPutChar8((xx + j),yy,font[m+j]);
LcdPutChar8((xx + j),yy+1,font[m+j+8]);
}
else
{
LcdPutChar8((xx + j),yy,~font[m+j]);
LcdPutChar8((xx + j),yy+1,~font[m+j+8]);
}
}
}
else
break;
xx += 8;
if(xx > 96)
return;} PutPic((void *)LcdBuf);} //显示16*16字符
void LcdPutString16_16(u8 x,u8 y,u8 *ptr,u8 len,u8 op){ u8 i,j,*tptr = ptr,xx = x,yy = y;u16 m;if(xx > 95)
return;if(yy)
return;
for(i = 0;i < len;i ++){
m = lookforChar(*tptr ++);
if(m!= FONTLISTCOUNT)
{
m = m * 32;
for(j = 0;j < 16;j ++)
{
if(op)
{
LcdPutChar8((xx + j),yy,font[m+j]);
LcdPutChar8((xx + j),yy+1,font[m+j+16]);
}
else
{
LcdPutChar8((xx + j),yy,~font[m+j]);
LcdPutChar8((xx + j),yy+1,~font[m+j+16]);
}
}
}
else
break;
xx += 16;
if(xx > 80)
return;} PutPic((void *)LcdBuf);}
static void LcdPrint8(u8 x,u8 y,u8 vl,u8 op){ u8 j;u16 m;m = lookforChar(vl);if(m!= FONTLISTCOUNT){
m = m * 16;
for(j = 0;j < 8;j ++)
{
if(op)
{
LcdPutChar8((x + j),y,font[m+j]);
LcdPutChar8((x + j),y+1,font[m+j+8]);
}
else
{
LcdPutChar8((x + j),y,~font[m+j]);
LcdPutChar8((x + j),y+1,~font[m+j+8]);
}
} } } static void LcdPrint16(u8 x, u8 y, u16 val, u8 op){ u8 j;u16 m;m = lookforChar16(val);if(m!= fontChar16ListCount)
{
m = m * 32;
for(j = 0;j < 16;j ++)
{
if(op)
{
LcdPutChar8((x + j),y,fontChar16[m+j]);
LcdPutChar8((x + j),y+1,fontChar16[m+j+16]);
}
else
{
LcdPutChar8((x + j),y,~fontChar16[m+j]);
LcdPutChar8((x + j),y+1,~fontChar16[m+j+16]);
}
}
} }
void LcdPutDispBuf(u8 x,u8 y,OledCodeDataType *ptr,u8 op){ u8 tcount = x;OledCodeDataType *tptr = ptr;u16 temp16;if(x > 88)
return;if(y > 1)
return;while((*tptr!= ' ')&&(tcount <= 88)){
if(*tptr < 127)
//显示ASIC码
{
}
else //显示汉字
{
LcdPrint8(tcount,y,*tptr,op);tptr ++;tcount += 8;
temp16 = tptr[1];temp16 <<= 8;temp16 |= tptr[0];LcdPrint16(tcount,y,temp16,op);tptr += 2;
tcount += 16;
} } PutPic((void *)LcdBuf);}
//实现中英文混合显示
void LcdPutDisp(u8 x,u8 y,OledCodeDataType *ptr,u8 op){ u8 tcount = x;OledCodeDataType *tptr = ptr;u16 temp16;if(x > 88)
return;if(y > 1)
return;while((*tptr!= ' ')&&(tcount <= 88)){
if(*tptr < 127)
码
{
LcdPrint8(tcount,y,*tptr,op);
tptr ++;
tcount += 8;
}
else
//显示汉字
{
temp16 = tptr[1];
temp16 <<= 8;
temp16 |= tptr[0];
LcdPrint16(tcount,y,temp16,op);
tptr += 2;
tcount += 16;
} } PutPic((void *)LcdBuf);} //从右往左输出一组字符并移运显示
void LcdPutScDispRtoL(OledCodeDataType *ptr,u8 op,u16 dl){ OledCodeDataType *tptr = ptr;u16 temp16;// LcdClearRam();
//显示ASIC
while(*tptr!= ' '){
if(*tptr < 127)码
//显示ASIC
{
memcpy(LcdBuf[0],&LcdBuf[0][8],88);
memcpy(LcdBuf[1],&LcdBuf[1][8],88);
LcdPrint8(88,0,*tptr,op);
tptr ++;
}
else
//显示汉字
{
memcpy(LcdBuf[0],&LcdBuf[0][16],80);
memcpy(LcdBuf[1],&LcdBuf[1][16],80);
temp16 = tptr[1];
temp16 <<= 8;
temp16 |= tptr[0];
LcdPrint16(80,0,temp16,op);
tptr += 2;
}
PutPic((void *)LcdBuf);
LcdDelay(dl);} }
void LcdPutScDispRtoL12(OledCodeDataType *ptr,u8 op,u16 dl){ OledCodeDataType *tptr = ptr;u16 i,temp16;for(i = 0;i < 12;){
if(*tptr < 127)
//显示ASIC码
{
memcpy(LcdBuf[0],&LcdBuf[0][8],88);
memcpy(LcdBuf[1],&LcdBuf[1][8],88);
LcdPrint8(88,0,*tptr,op);
tptr ++;
i ++;
}
else
//显示汉字
{
memcpy(LcdBuf[0],&LcdBuf[0][16],80);
memcpy(LcdBuf[1],&LcdBuf[1][16],80);
temp16 = tptr[1];
temp16 <<= 8;
temp16 |= tptr[0];
LcdPrint16(80,0,temp16,op);
tptr += 2;
i +=2;
}
PutPic((void *)LcdBuf);
LcdDelay(dl);} }
//从左往右
void LcdPutScDispLtoR12(OledCodeDataType *ptr,u8 op,u16 dl){ OledCodeDataType *ttptr,*tptr = ptr;u16 temp16;u8 i,len,tempbuf[2][96];
len = 12;
tptr = ptr+11;for(i = 0;i < len;){
if(*(tptr)< 127)
ASIC码
{
memcpy(&tempbuf[0][0],&LcdBuf[0][0],96);
memcpy(&tempbuf[1][0],&LcdBuf[1][0],96);
memcpy(&LcdBuf[0][8],&tempbuf[0][0],88);
memcpy(&LcdBuf[1][8],&tempbuf[1][0],88);
LcdPrint8(0,0,*tptr,op);
tptr--;
i ++;
}
else
//显示汉字
{
memcpy(&tempbuf[0][0],&LcdBuf[0][0],96);
memcpy(&tempbuf[1][0],&LcdBuf[1][0],96);
memcpy(&LcdBuf[0][16],&tempbuf[0][0],80);
memcpy(&LcdBuf[1][16],&tempbuf[1][0],80);
ttptr = tptr;
//显示
temp16 = *ttptr;
temp16 <<= 8;
ttptr = tptr-1;
temp16 |= *ttptr;
LcdPrint16(0,0,temp16,op);
tptr-= 2;
i += 2;
}
PutPic((void *)LcdBuf);
LcdDelay(dl);} } void LcdPutScString(OledCodeDataType *ptr,u8 op,u8 rl,u16 dl){
switch(rl){
case LIFT_SC:
LcdPutScDispLtoR12(ptr,op,dl);
break;
case RIGHT_SC:
LcdPutScDispRtoL12(ptr,op,dl);
break;
default:break;
} }
void LcdPutPic(u8 x, u8 y,u8 w,u8 h,OledCodeDataType *ptr,u8 op){ u8 i;OledCodeDataType *tptr = ptr;if((x > 95)||((x + w)> 96))
return;if((y > 1)||((y + h)> 2))
return;
for(i = 0;i < w;i ++)
{
if(op)
{
LcdBuf[y][x + i] = *tptr;
if(h == 2)
LcdBuf[y+1][x + i] = *(tptr+w);
tptr ++;
}
else
{
LcdBuf[y][x + i] = ~*tptr;
if(h == 2)
LcdBuf[y+1][x + i] = ~*(tptr+w);
tptr ++;
} } PutPic((void *)LcdBuf);}
//整屏滑动显示
void LcdPutScPic(OledCodeDataType *ptr, u8 op,u8 qp,u16 dl){ u8 i,j;u8 tempbuf[2][96];if(qp){
for(i = 0;i < 96;i ++)
{
tempbuf[0][i] = *ptr++;
}
for(i = 0;i < 96;i ++)
{
tempbuf[1][i] = *ptr++;
}
} else {
for(i = 0;i < 96;i ++)
{
tempbuf[0][i] = ~*ptr++;
}
for(i = 0;i < 96;i ++)
{
tempbuf[1][i] = ~*ptr++;
}
}
switch(op){
case RIGHT_SC:
//右边
for(i = 0;i < 8;i ++){
for(j = 0;j < 84;j ++)
{
LcdBuf[0][95-j] = LcdBuf[0][83j];
}
for(j = 0;j < 12;j ++)
{
LcdBuf[0][11-j] = tempbuf[0][95j];
}
for(j = 0;j < 84;j ++)
{
tempbuf[0][95-j] = tempbuf[0][83j];
}
PutPic((void *)LcdBuf);
} LcdDelay(dl);break;case LIFT_SC:
//左边
for(i = 0;i < 8;i ++){
for(j = 0;j < 84;j ++)
{
LcdBuf[0][j] = LcdBuf[0][j + 12];
LcdBuf[1][j] = LcdBuf[1][j + 12];
}
for(j = 0;j < 12;j ++)
{
LcdBuf[0][95-j] = tempbuf[0][11-j];
LcdBuf[1][95-j] = tempbuf[1][11-j];
}
for(j = 0;j < 84;j ++)
{
tempbuf[0][j] = tempbuf[0][j+12];
tempbuf[1][j] = tempbuf[1][j+12];
}
PutPic((void *)LcdBuf);
} LcdDelay(dl);break;default:
break;} }
void LcdPutString16_8_R(u8 *ptr,u8 op){ u8 i,x=0;
for(i=0;i<12;i++){ x=88-i*8;LcdPutString16_8(x,0,ptr,i+1,op);LcdDelay(100);} } 4.实验总结
此实验室实现两个节点间的通信,可以输出中文或英文,或中英文混合输出。其主要原理是通过ASIC将中英文转换,通过字符串的拼凑输出。
实验
二、光照传感器实验
1.实验内容
1.了解光照采集的原理
2.学习CDS 光照传感器从而掌握光照传感器的原理 3.掌握“传感器节点板”模块的原理和使用方法。2.实验步骤
第一步:把“代码和例子程序Zigbee2007 多传感器”内文件夹 “ZStack-CC2530-2.2.0-1.3.0MS”“”复制至 IAR 安装盘根目录(如 C: Texas Instruments)下。使用 IAR7.51 打开“ProjectszstackSamplesSampleAppCC2530 DB”中工程文件“SampleApp.eww”。
第二步:打开工程后选择对应的设备类型 打开工程后如下右图所示选择当前要烧写设备的类型。
打开后的工程文件 工程名称 ZigBee 网络功能 CC2530-WSN 节点功能 CoordinatorEB-Pro 协调器 网关 RouterEB-Pro 路由器 路由器节点、传感器节点 EndDeviceEB-Pro 终端节点 传感器节点
第三步:编译工程并下载到目标板。点击菜单 Project,选择“Rebuild All”,等待一会儿工程文件编译完成。等 待一会儿工程文件编译完成把仿真器与网关通过仿真器下载线连接起来。确保仿 真器与计算机、仿真器与网关底板连接正确,ZigBee 无线模块正确地插在网关 底板后。点击菜单 Project,选择“Debug”,或点击如下图标,等待一会儿即完成程 序下载 重复进行第二步和第三步,将“RouterEB-Pro”设备对应的程序下载到带传 感器模块的传感器节点底板中(SMBD-V11-1)第四步:修改 IEEE 地址。在物理地址烧写软件中首先通过“Read IEEE”把物 理地址(IEEE 地址)读出来,如果节点物理地址为“0XFF FF FF FF FF FF FF FF” 或在网络中有相同地址,则需要通过“Write IEEE”修改 ZigBee 网络节点的物 理地址,在此例中,我们把网关的物理地址修改“0x31,0x30,0x30,0x30,0x30,0x30, 0x30,0x30”。按照第二步至第四步的方法下载传感器节点模块的程序,选择 “RouterEB”或“EndDevice”,如有多组在同一实验室进行实验,请修改为各 不相同的 IEEE 地址。第五步:获取和查看光照传感器数据 用 USB 线连接上 PC 机跟网关,打开“代码和例子程序Zigbee2007 多传感 器无线龙 ZigBee 演示软件 V1.21(串口用)”目录下“无线龙 ZigBee 演示软件 V1.21(串口用).exe”软件。通过设备管理器查看对应设备的串口号是多少,如图所示为 COM3。在监控 软件中选择“COM 端口”COM3,波特率:38400,点击“打开串口”。正确打开串口后,选择网络拓扑图,确保网关与计算机的正确连接。3.实验代码与分析
case 4://普通温度、光敏、蜂鸣器 if(DispState == 0){ LcdPutString16_8(0, 0,(void*)“ Temp/Light ”, 12 , 1);} else if(DispState == 1){ temp = ReadTc77();//读取温度 sprintf(msg,“TEMP:%2d ”,temp);LcdPutString16_8(0, 0,(void*)msg, 12 , 1);} else if(DispState == 2)//读取光照 { temp = ReadSensorAdc(1);sprintf(msg,“Light:%03d ”,temp);LcdPutString16_8(0, 0,(void*)msg, 12 , 1);}
break;通过 ADC 读取光敏传感器值:
temp = ReadSensorAdc(1);//读取光敏传感器值
ReadSensorAdc 子函数位于“ ComponentshaltargetCC2530EB”目录下的 Sensor.c 文件中
temp = HalAdcRead(channel,HAL_ADC_RESOLUTION_8);channel 光敏传感器对应的 AD 通道 P01
HAL_ADC_RESOLUTION_8 采集分辨率 8Bit
ADC 采 集 子 函 数 在 在 “ComponentshaltargetCC2530EB ” 目 录 下 的
“ hal_adc.c”文件
/****************************************************************************** ******************** * @fn HalAdcRead * * @brief Read the ADC based on given channel and resolution * * @param channelthe resolution of the value * * @return 16 bit value of the ADC in offset binary format.* Note that the ADC is “bipolar”, which means the GND(0V)level is mid-scale.******************************************************************************* *******************/ uint16 HalAdcRead(uint8 channel, uint8 resolution){ int16 reading = 0;#if(HAL_ADC == TRUE)uint8 i, resbits;uint8 adctemp;volatile uint8 tmp;uint8 adcChannel = 1;/* * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled.The code * does NOT disable the pin at the end of this function.I think it is better to leave the pin * enabled because the results will be more accurate.Because of the inherent capacitance on
* pin, it takes time for the voltage on the pin to charge up to its steady-state level.If * HalAdcRead()has to turn on the pin for every conversion, the results may show a lower voltage * than actuality because the pin did not have time to fully charge.*/ if(channel < 8){ for(i=0;i < channel;i++){ adcChannel <<= 1;} } /* Enable channel */ ADCCFG |= adcChannel;/* Convert resolution to decimation rate */ switch(resolution){ case HAL_ADC_RESOLUTION_8: resbits = HAL_ADC_DEC_064;break;case HAL_ADC_RESOLUTION_10: resbits = HAL_ADC_DEC_128;break;case HAL_ADC_RESOLUTION_12: resbits = HAL_ADC_DEC_256;break;case HAL_ADC_RESOLUTION_14: default: resbits = HAL_ADC_DEC_512;break;} /* read ADCL,ADCH to clear EOC */ tmp = ADCL;tmp = ADCH;/* Setup Sample */ adctemp = ADCCON3;adctemp &= ~(HAL_ADC_CHN_BITS | HAL_ADC_REF_BITS);adctemp |= channel | resbits | HAL_ADC_REF_VOLT;/* writing to this register starts the extra conversion */ ADCCON3 = adctemp;/* Wait for the conversion to be done */ while(!(ADCCON1 & HAL_ADC_EOC));/* Disable channel after done conversion */ ADCCFG &=(adcChannel ^ 0xFF);/* Read the result */ reading =(int16)(ADCL);reading |=(int16)(ADCH << 8);/* Treat small negative as 0 */ if(reading < 0)reading = 0;switch(resolution){ case HAL_ADC_RESOLUTION_8: reading >>= 8;break;case HAL_ADC_RESOLUTION_10: reading >>= 6;break;case HAL_ADC_RESOLUTION_12: reading >>= 4;break;case HAL_ADC_RESOLUTION_14: default:
HAL_ADC_DEC_BITS |
break;} #else // unused arguments(void)channel;(void)resolution;#endif return((uint16)reading);}
4.实验总结
通过串口助手,配置正确的串口号和波特率,填入测试的数据指令,点击发送就可以获取网关返回的读取到节点的数据。
实验
三、气压传感器实验
1.实验内容
1.了解气压采集的原理
2.学习MPX5010 气压传感器从而掌握气压传感器的原理 3.掌握“ 传感器节点板” 模块的原理和使用方法。2.实验步骤
同“实验二十四 光照传感器实验 实验步骤第一步至第四步”
第五步:获取和查看大气气压传感器数据用 USB 线连接上 PC 机跟网关,打开“ 软件工具及驱动无线龙 ZigBee 演示软件 V1.11”目录下“无线龙 ZigBee 演示软件 V1.11.exe”软件。通过设备管理器查看对应设备的串口号是多少,如图所示为 COM3。在监控软件中选择“ COM 端口” COM3,波特率: 38400,点击“打开串口”。在 RSS 曲线部分中的下拉选择框中选择节点压力(如下图),鼠标左键单击选中要查看的节点模块。点击“开始”按钮,就可开始显示节点空气压力的曲线了(注:这时“开始”
按钮将变为“关闭”按钮)。为了使显示曲线效果明显,可以通过电扇吹气方式来达到明显效果。点击“关闭”按钮,则曲线停止,但曲线不会消失,这时“关闭”按钮将变为“开始”按钮,这时在点击“开始”按钮会弹出一格对话框,选择“是”则不清空曲线,继续在图上画曲线。选择“否”则清空曲线,再 在图上画曲线。点击“保存”按钮,可将曲线图以 RSS 格式的数据保存在电脑上,点击“载入”按钮,可以载入保存了曲线数据的 RSS 文件,将曲线显示在曲线图上。3.实验代码与分析
传感器采集的函数在 void SampleApp_MessageMSGCB(afIncomingMSGPacket_t *pkt)中
if((RfRx.RXDATA.HeadCom[1] == 'P')&&(RfRx.RXDATA.HeadCom[2] == 'R'))//压力传感器 { if(SensorNum == 5)//压力传感器板 { memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);temp = ReadSensorAdc(0);RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;temp = temp%100;RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;RfHaveTxDara = 1;} } //调用子函数 ReadSensorAdc 完成读取
//---------------------------//Read Sensor ADC value //读取 AD 值 //输入:通道名
//返回: 8 位 AD 值
//---------------------------INT8U ReadSensorAdc(INT8U channel){ INT8U temp;temp = HalAdcReadSen(channel,HAL_ADC_RESOLUTION_8);return temp;} 通过 ADC 读取大气压力传感器值:
temp = HalAdcReadSen(channel,HAL_ADC_RESOLUTION_8);/读取空气压力传感器值 channel 气体压力传感器对应的 AD 通道
HAL_ADC_RESOLUTION_8 采集分辨率 8Bit
ADC 采 集 子 函 数 在 在 “ComponentshaltargetCC2530EB ” 目 录 下 的 “ hal_adc.c”文件
/****************************************************************************** ******************** * @fn HalAdcRead * * @brief Read the ADC based on given channel and resolution * * @param channelthe resolution of the value * * @return 16 bit value of the ADC in offset binary format.* Note that the ADC is “bipolar”, which means the GND(0V)level is mid-scale.******************************************************************************* *******************/ uint16 HalAdcRead(uint8 channel, uint8 resolution)int16 reading = 0;#if(HAL_ADC == TRUE)uint8 i, resbits;uint8 adctemp;volatile uint8 tmp;uint8 adcChannel = 1;/* * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled.The code * does NOT disable the pin at the end of this function.I think it is better to leave the pin * enabled because the results will be more accurate.Because of the inherent capacitance on the * pin, it takes time for the voltage on the pin to charge up to its steady-state level.If * HalAdcRead()has to turn on the pin for every conversion, the results may show a lower voltage * than actuality because the pin did not have time to fully charge.*/ if(channel < 8){ for(i=0;i < channel;i++){ adcChannel <<= 1;} } /* Enable channel */ ADCCFG |= adcChannel;/* Convert resolution to decimation rate */ switch(resolution){ case HAL_ADC_RESOLUTION_8: resbits = HAL_ADC_DEC_064;break;case HAL_ADC_RESOLUTION_10: resbits = HAL_ADC_DEC_128;break;case HAL_ADC_RESOLUTION_12: resbits = HAL_ADC_DEC_256;break;case HAL_ADC_RESOLUTION_14: default: resbits = HAL_ADC_DEC_512;break;} /* read ADCL,ADCH to clear EOC */ tmp = ADCL;tmp = ADCH;/* Setup Sample */ adctemp = ADCCON3;adctemp &= ~(HAL_ADC_CHN_BITS | HAL_ADC_DEC_BITS | HAL_ADC_REF_BITS);adctemp |= channel | resbits | HAL_ADC_REF_VOLT;/* writing to this register starts the extra conversion */ ADCCON3 = adctemp;/* Wait for the conversion to be done */ while(!(ADCCON1 & HAL_ADC_EOC));/* Disable channel after done conversion */ ADCCFG &=(adcChannel ^ 0xFF);/* Read the result */ reading =(int16)(ADCL);reading |=(int16)(ADCH << 8);/* Treat small negative as 0 */ if(reading < 0)reading = 0;switch(resolution){ case HAL_ADC_RESOLUTION_8: reading >>= 8;break;case HAL_ADC_RESOLUTION_10: reading >>= 6;break;case HAL_ADC_RESOLUTION_12: reading >>= 4;break;case HAL_ADC_RESOLUTION_14: default: break;} #else // unused arguments(void)channel;(void)resolution;#endif return((uint16)reading);} 4.实验总结
打开“ EXPLORERF-CC2530 增配传感器光盘 V1.1软件工具及驱动” 中工具 “ 串口调试助手.exe”配置正确的串口号和通讯波特率,填入测试的数据指令,点击发送就可以获取网关返回的读取到节点的数据。
实验
四、综合实验
1.实验原理
以一LED灯,LED显示屏作为工具。当LED灯显示时,LED显示屏上也显示信息灯亮。将LED灯作为协调器,LED显示屏作为终端,当LED灯亮时,会通过组网将信息传给终端,即此时LED显示屏显示灯亮,即LED显示屏给予LED灯亮的一个信息反馈。2.实验步骤
选择烧取设备的类型为CoordinatorEB-pro, 点击菜单 Project,选择“ Rebuild All”,等待一会儿工程文件编译完成。等待一会儿工程文件编译完成把仿真器与网关通过仿真器下载线连接起来。确保仿真器与计算机、仿真器与网关底板连接正确,ZigBee 无线模块正确地插在网关底板后。点击菜单 Project,选择“ Debug”,或点击如下图标,等待一会儿即完成程序下载.将烧取设备类型改为EndDeviceEB-pro,重复上述步骤。当LED亮时,此时显示屏也将有相应反应。4.实验代码
#include “OSAL.h” #include “ZGlobals.h” #include “AF.h” #include “aps_groups.h” #include “ZDApp.h”
#include “SampleApp.h” #include “SampleAppHw.h”
#include “OnBoard.h”
/* HAL */ #include “hal_lcd.h” #include “hal_led.h” #include “hal_key.h” #include “string.h” #include
#include “sensor.h” #include “SHT10.h” #include “ugOled9616.h” #include “LcdDisp.h” #include “TMP006.h” #include “hal_timer34.h” /********************************************************************* * MACROS */
/********************************************************************* * CONSTANTS */ /********************************************************************* * TYPEDEFS */
/********************************************************************* * GLOBAL VARIABLES */
// This list should be filled with Application specific Cluster IDs.const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] = { SAMPLEAPP_PERIODIC_CLUSTERID, SAMPLEAPP_FLASH_CLUSTERID };
const SimpleDescriptionFormat_t SampleApp_SimpleDesc = { SAMPLEAPP_ENDPOINT, // int Endpoint;SAMPLEAPP_PROFID, // uint16 AppProfId[2];SAMPLEAPP_DEVICEID, // uint16 AppDeviceId[2];SAMPLEAPP_DEVICE_VERSION, // int AppDevVer:4;SAMPLEAPP_FLAGS, // int AppFlags:4;SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters;(cId_t *)SampleApp_ClusterList, // uint8 *pAppInClusterList;SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters;(cId_t *)SampleApp_ClusterList // uint8 *pAppInClusterList;};
// This is the Endpoint/Interface description.It is defined here, but // filled-in in SampleApp_Init().Another way to go would be to fill // in the structure here and make it a “const”(in code space).The // way it's defined in this sample app it is define in RAM.endPointDesc_t SampleApp_epDesc;
/********************************************************************* * EXTERNAL VARIABLES */ extern unsigned char SensorNum;extern INT8U DispNum;unsigned char DispState = 0;unsigned char Relay1State = 0;unsigned char Relay2State = 0;extern INT16U LEDDispNum;/********************************************************************* * EXTERNAL FUNCTIONS */
/********************************************************************* * LOCAL VARIABLES */ uint8 SampleApp_TaskID;// Task ID for internal task/event processing // This variable will be received when // SampleApp_Init()is called.devStates_t SampleApp_NwkState;
uint8 SampleApp_TransID;// This is the unique message ID(counter)uint8 *ieeeAddr;//物理地址
unsigned char LCDUPDATA = 0;//LCD刷新标致位 unsigned char Shakeflag = 0;unsigned char InfraredState = 0;unsigned char InfraredCount = 0;unsigned char InfraredInitFlag = 0;unsigned char HallState = 0;union f1{ uint8 RxBuf[32];struct UARTCOMBUF { uint8 Head;//头 uint8 HeadCom[3];//命令头 uint8 Laddr[8];//物理地址 uint8 Saddr[2];//网络地址 uint8 DataBuf[16];//数据缓冲区 uint8 CRC;//校验位
uint8 LastByte;//帧尾 }RXDATA;}UartRxBuf;//从串口接收到的数据帧
union e{ uint8 TxBuf[32];struct UARTBUF { uint8 Head;//头 uint8 HeadCom[3];//命令头 uint8 Laddr[8];//物理地址 uint8 Saddr[2];//网络地址 uint8 DataBuf[16];//数据缓冲区 uint8 CRC;//校验位
uint8 LastByte;//帧尾 }TXDATA;}UartTxBuf;//从串口发送数据帧
union h{ uint8 RxBuf[32];struct RFRXBUF { uint8 Head;//头
uint8 HeadCom[3];//命令头 uint8 Laddr[8];uint8 Saddr[2];uint8 DataBuf[16];//数据缓冲区
uint8 CRC;//校验位
uint8 LastByte;//帧尾 }RXDATA;}RfRx;//无线接收缓冲区
union j{ uint8 TxBuf[32];struct RFTXBUF { uint8 Head;//头
uint8 HeadCom[3];//命令头
uint8 Laddr[8];uint8 Saddr[2];uint8 DataBuf[16];//数据缓冲区
uint8 CRC;//校验位
uint8 LastByte;//帧尾 }TXDATA;}RfTx;//无线发送缓冲区
uint16 Ultrasonic_Count;//超声波计数
/***************************************************************************** void WaitUs(uint16 microSecs)
延时uS函数.*****************************************************************************/ void WaitUs(uint16 microSecs){ while(microSecs--){ /* 32 NOPs == 1 usecs */ asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);} }
/***************************************************************************** uint8 SendData(uint16 addr, uint8 *buf, uint8 Leng)
发送一组数据.*****************************************************************************/ uint8 SendData(uint16 addr, uint8 *buf, uint8 Leng){ afAddrType_t SendDataAddr;
SendDataAddr.addrMode =(afAddrMode_t)Addr16Bit;SendDataAddr.endPoint = SAMPLEAPP_ENDPOINT;SendDataAddr.addr.shortAddr = addr;if(AF_DataRequest(&SendDataAddr, &SampleApp_epDesc, 2,//SAMPLEAPP_PERIODIC_CLUSTERID, Leng, buf, &SampleApp_TransID, AF_DISCV_ROUTE, // AF_ACK_REQUEST, AF_DEFAULT_RADIUS)== afStatus_SUCCESS){
return 1;} else {
return 0;// Error occurred in request to send.} } case 1://DAC 输出
if(DispState == 0)
{
DAC_OUT_CON(0x07ff, 0x07ff);
LcdPutString16_8(0, 0,(void*)“ DAC-OUT ”, 12 , 1);
}
else if(DispState == 1)
{
DAC_OUT_CON(0x03ff, 0x03ff);
sprintf(msg,“OUT:0.5MA/V ”,temp);
LcdPutString16_8(0, 0,(void*)msg, 12 , 1);
}
else if(DispState == 2)
{
DAC_OUT_CON(0x0Bff, 0x0Bff);
sprintf(msg,“OUT:1.5MA/V ”,temp);
LcdPutString16_8(0, 0,(void*)msg, 12 , 1);
}
break;case 2://高亮LED控制
if(DispState == 0)
{
ChangT3Cmp0Val(0xff);
P1_6 = 0;
LcdPutString16_8(0, 0,(void*)“ LED-LIGHT ”, 12 , 1);
}
else if(DispState == 1)
{
ChangT3Cmp0Val(230);
LcdPutString16_8(0, 0,(void*)“LEVEL:10% ”, 12 , 1);
}
else if(DispState == 2)
{
ChangT3Cmp0Val(25);
LcdPutString16_8(0, 0,(void*)“LEVEL:90% ”, 12 , 1);
}
break;
} void SampleApp_Init(uint8 task_id){ SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;
// Device hardware initialization can be added here or in main()(Zmain.c).// If the hardware is application specificThis app will handle all key events RegisterForKeys(SampleApp_TaskID);
#ifdef WXL_COORD
MT_UartRegisterTaskID(SampleApp_TaskID);
#endif } void SampleApp_Init(uint8 task_id){ SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;
// Device hardware initialization can be added here or in main()(Zmain.c).// If the hardware is application specificThis app will handle all key events RegisterForKeys(SampleApp_TaskID);
#ifdef WXL_COORD
MT_UartRegisterTaskID(SampleApp_TaskID);
#endif }
/********************************************************************* * @fn SampleApp_ProcessEvent * * @brief Generic Application Task event processor.This function * is called to process all events for the task.Events * include timers, messages and any other user defined events.* * @param task_idevents to process.This is a bit map and can * contain more than one event.* * @return none */ uint16 SampleApp_ProcessEvent(uint8 task_id, uint16 events){ afIncomingMSGPacket_t *MSGpkt;uint16 temp1;
#if(defined(WXL_ROUTER)|| defined(WXL_RFD))//ROUTER OR RFD uint16 SrcSaddr;#endif
(void)task_id;// Intentionally unreferenced parameter
if(events & SYS_EVENT_MSG){
MSGpkt =(afIncomingMSGPacket_t *)osal_msg_receive(SampleApp_TaskID);
while(MSGpkt)
{
switch(MSGpkt->hdr.event)
{
// Received when a key is pressed
case KEY_CHANGE:
SampleApp_HandleKeys(((keyChange_t *)MSGpkt)->state,((keyChange_t *)MSGpkt)->keys);
break;
// Received when a messages is received(OTA)for this endpoint
case AF_INCOMING_MSG_CMD:
SampleApp_MessageMSGCB(MSGpkt);
break;
// Received whenever the device changes state in the network
case ZDO_STATE_CHANGE:
SampleApp_NwkState =(devStates_t)(MSGpkt->hdr.status);
if((SampleApp_NwkState == DEV_ZB_COORD)
||(SampleApp_NwkState == DEV_ROUTER)
||(SampleApp_NwkState == DEV_END_DEVICE))
{
HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);#ifdef WXL_COORD
ugOled9616int();LcdPutString16_8(0, 0,(void*)“ COORD ”, 12 , 1);
//osal_start_timerEx(SampleApp_TaskID,//SAMPLEAPP_RUN__EVT,//SAMPLEAPP_RUN_TIMEOUT);//启动超时定时器
#endif
#ifdef WXL_RFD
memset(RfTx.TxBuf,'x',32);
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.HeadCom[0] = 'J';
RfTx.TXDATA.HeadCom[1] = 'O';
RfTx.TXDATA.HeadCom[2] = 'N';
ieeeAddr = NLME_GetExtAddr();
memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);
SrcSaddr = NLME_GetShortAddr();
RfTx.TXDATA.Saddr[0] = SrcSaddr;RfTx.TXDATA.Saddr[1] = SrcSaddr>>8;
RfTx.TXDATA.DataBuf[0] = 'R';
RfTx.TXDATA.DataBuf[1] = 'F';
RfTx.TXDATA.DataBuf[2] = 'D';
NLME_GetCoordExtAddr(&RfTx.TXDATA.DataBuf[3]);temp1 = NLME_GetCoordShortAddr();RfTx.TXDATA.DataBuf[11] =(unsigned char)(temp1>>8);RfTx.TXDATA.DataBuf[12] =(unsigned char)(temp1);
RfTx.TXDATA.DataBuf[13] = SensorNum;
RfTx.TXDATA.LastByte = '*';
SendData(0x0000, RfTx.TxBuf, 32);//发送自己的节点信息到主机
if((SensorNum == 1)||(SensorNum == 2))//点阵屏或数码管屏
{
init_T3();//打开定时器3开始扫描
}
else if(SensorNum == 9)//振动传感器
{
IEN1 |= 0x20;//Port 0 interrupt enable
}
osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_1000MS_TIMEOUT);//每秒检测一次红外传感器 #endif
#ifdef WXL_ROUTER
memset(RfTx.TxBuf,'x',32);
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.HeadCom[0] = 'J';
RfTx.TXDATA.HeadCom[1] = 'O';
RfTx.TXDATA.HeadCom[2] = 'N';
RfTx.TXDATA.Saddr[1] SrcSaddr>>8;
temp1 NLME_GetCoordShortAddr();RfTx.TXDATA.DataBuf[11](unsigned char)(temp1>>8);RfTx.TXDATA.DataBuf[12](unsigned char)(temp1);
RfTx.TXDATA.DataBuf[13] SensorNum;
RfTx.TXDATA.LastByte = '*';
息到主机
if((SensorNum == 2))//点阵屏或数码管屏
ieeeAddr = NLME_GetExtAddr();memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);SrcSaddr = NLME_GetShortAddr();RfTx.TXDATA.Saddr[0] = SrcSaddr;= RfTx.TXDATA.DataBuf[0] = 'R';RfTx.TXDATA.DataBuf[1] = 'O';RfTx.TXDATA.DataBuf[2] = 'U';NLME_GetCoordExtAddr(&RfTx.TXDATA.DataBuf[3]);= = = = SendData(0x0000, RfTx.TxBuf, 32);//发送自己的节点信== 1)||(SensorNum { init_T3();//打开定时器3开始扫描 } else if(SensorNum == 9)//振动传感器 { IEN1 |= 0x20;//Port 0 interrupt enable }
osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_1000MS_TIMEOUT);//每秒检测一次红外传感器
#endif
}
break;
case SPI_INCOMING_ZTOOL_PORT:
UartRxComCallBack();//串口收到一帖数据的处理
break;
default:
break;
}
// Release the memory
osal_msg_deallocate((uint8 *)MSGpkt);
// NextThis event is generated by a timer //(setup in SampleApp_Init()).if(events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT)//发送数据超时
{
if(SensorNum == 8)
{
if(InfraredInitFlag == 0)//人体红外传感器需要初始化20秒
{
if(++InfraredCount > 20)
{
InfraredInitFlag = 1;
}
}
else
{
if(P0_0 == 1)
{
if(InfraredState == 0)
{
InfraredState = 1;
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.HeadCom[0] = 'A';
RfTx.TXDATA.HeadCom[1] = 'I';
RfTx.TXDATA.HeadCom[2] = 'N';
ieeeAddr = NLME_GetExtAddr();
memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);
temp1 = NLME_GetShortAddr();
RfTx.TXDATA.Saddr[0] = temp1;
RfTx.TXDATA.Saddr[1] = temp1>>8;
RfTx.TXDATA.LastByte = '*';
SendData(0x0000, RfTx.TxBuf, 32);//发送报警数据
}
}
else
{
InfraredState = 0;
} if(DispState!= 0)//每一秒自动采集一次传感器
{
LCDUPDATA = 1;
}
}
}
else if(SensorNum == 9)//振动传感器
{
if(Shakeflag)
{
Shakeflag = 0;
P0IEN |= 0x01;//Port 0, inputs 0 interrupt enable.P0IFG &= 0xfe;//Clear any pending interrupts
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.HeadCom[0] = 'A';
RfTx.TXDATA.HeadCom[1] = 'S';
RfTx.TXDATA.HeadCom[2] = 'H';
ieeeAddr = NLME_GetExtAddr();
memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);
temp1 = NLME_GetShortAddr();
RfTx.TXDATA.Saddr[0] = temp1;
RfTx.TXDATA.Saddr[1] = temp1>>8;
RfTx.TXDATA.LastByte = '*';
SendData(0x0000, RfTx.TxBuf, 32);//发送报警数据
BEEPState2 = 2;} if(BEEPState2 == 1){
BEEPState2 = 2;
P1_4 = 1;} else if(BEEPState2 == 2){
BEEPState2 = 1;
P1_4 = 0;} } else if(SensorNum == 16)//霍尔传感器板 { if(P0_0 == 0){
if(HallState == 0)
{
HallState = 1;
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.HeadCom[0] = 'A';
RfTx.TXDATA.HeadCom[1] = 'H';
RfTx.TXDATA.HeadCom[2] = 'A';
ieeeAddr = NLME_GetExtAddr();
memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);
temp1 = NLME_GetShortAddr();
RfTx.TXDATA.Saddr[0] = temp1;
RfTx.TXDATA.Saddr[1] = temp1>>8;
RfTx.TXDATA.LastByte = '*';
SendData(0x0000, RfTx.TxBuf, 32);//发送报警数据
}
}
else
{
HallState = 0;
}
}
else if(SensorNum == 4)
{
if(DispState!= 0)//每一秒自动采集一次传感器
{
LCDUPDATA = 1;
}
if(BEEPState1 == 1)
{
BEEPState1 = 2;
P1_6 = 1;
}
else if(BEEPState1 == 2)
{
BEEPState1 = 1;
P1_6 = 0;
}
}
else if((SensorNum == 3)||(SensorNum == 5)||(SensorNum == 7)||(SensorNum == 10)||(SensorNum == 11)||(SensorNum == 13))
{
if(DispState!= 0)//每一秒自动采集一次传感器
{
LCDUPDATA = 1;
}
}
LCDDispFun();
// Setup to send message again in normal period(+ a little jitter)
osal_start_timerEx(SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_1000MS_TIMEOUT);
return(events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);} // Discard unknown events return 0;} void SampleApp_HandleKeys(uint8 shift, uint8 keys){(void)shift;// Intentionally unreferenced parameter
if(keys & HAL_KEY_UP){
P1_1 =!P1_1;
if(++DispState >= 3)DispState = 0;
LCDUPDATA = 1;} if(keys & HAL_KEY_DOWN){
P1_1 =!P1_1;
if(--DispState >= 200)DispState = 2;
LCDUPDATA = 1;} }
/********************************************************************* * LOCAL FUNCTIONS */
/********************************************************************* * @fn SampleApp_MessageMSGCB * * @brief Data message processor callback.This function processes * any incoming data-probably from other devices.So, based * on cluster ID, perform the intended action.* * @param none * * @return none */ void SampleApp_MessageMSGCB(afIncomingMSGPacket_t *pkt){ #ifdef WXL_COORD uint8 i;
memcpy(RfRx.RxBuf,pkt->cmd.Data,32);//读出无线按收到的数据
osal_stop_timerEx(SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT);//停止超时计数器
if((RfRx.RXDATA.Head == '&')&&(RfRx.RXDATA.LastByte == '*')){
memcpy(UartTxBuf.TxBuf,RfRx.RxBuf,32);
for(i=0;i<8;i++)
{
UartTxBuf.TXDATA.Laddr[i] = RfRx.RXDATA.Laddr[i];//长地址
}
for(i=0;i<2;i++)
{
UartTxBuf.TXDATA.Saddr[i] = RfRx.RXDATA.Saddr[1-i];//短地址
}
UartTxBuf.TXDATA.CRC = CheckUartData(&UartTxBuf.TxBuf[1],29);
HalUARTWrite(HAL_UART_PORT_0, UartTxBuf.TxBuf, 32);//从串口输出
} #endif
#if(defined(WXL_ROUTER)|| defined(WXL_RFD))//ROUTER OR RFD uint8 temp;uint16 temp1,temp2;uint8 RfHaveTxDara = 0;//无线有数据需要发送
ieeeAddr = NLME_GetExtAddr();memcpy(RfRx.RxBuf,pkt->cmd.Data,32);memset(RfTx.TxBuf,'x',32);switch(RfRx.RXDATA.HeadCom[0]){
case 'R'://读
if((RfRx.RXDATA.HeadCom[1] == 'A')&&(RfRx.RXDATA.HeadCom[2] 'S'))//读传感器
{
if(SensorNum == 4)//高精温湿度传感器
{
==
memcpy(RfTx.TxBuf, RfRx.RxBuf, 16);
if((RfRx.RXDATA.DataBuf[0] == 'G')&&(RfRx.RXDATA.DataBuf[1] == 'M'))//读光敏
{
temp = ReadSensorAdc(1);//显示值转换
RfTx.TXDATA.DataBuf[2] = temp/100 + 0x30;
temp = temp%100;
RfTx.TXDATA.DataBuf[3] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[4] = temp%10 + 0x30;
RfHaveTxDara = 1;;
}
else if((RfRx.RXDATA.DataBuf[0] == 'W')&&(RfRx.RXDATA.DataBuf[1] == 'D'))//读温度
{ //WriteTc77(1);//唤醒温度传感器
//Sensor_Delay(10000);//必须延时后才能读
temp = ReadTc77();//读取温度
//WriteTc77(0);//温度传感器休眠
//显示值转换
RfTx.TXDATA.DataBuf[2] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[3] = temp%10 + 0x30;
RfHaveTxDara = 1;
}
}
}
else if((RfRx.RXDATA.HeadCom[1] == 'S')&&(RfRx.RXDATA.HeadCom[2] == 'H'))//读取高精温湿度传感器
{ // 读取的温湿度为16位浮点数,在上位机上转换。if(SensorNum == 3)//高精温湿度传感器 { memcpy(RfTx.TxBuf, RfRx.RxBuf, 16);SHT1X_INT();if((RfRx.RXDATA.DataBuf[0] == 'W')&&(RfRx.RXDATA.DataBuf[1] == 'D'))
{
temp1 = Read_SHT1X(3);
RfTx.TXDATA.DataBuf[2] =(uint8)(temp1>>8);
RfTx.TXDATA.DataBuf[3] =(uint8)(temp1&0xff);
RfHaveTxDara = 1;
}
else if((RfRx.RXDATA.DataBuf[0] == 'S')&&(RfRx.RXDATA.DataBuf[1] == 'D'))
{
temp1 = Read_SHT1X(5);
RfTx.TXDATA.DataBuf[2] =(uint8)(temp1>>8);
RfTx.TXDATA.DataBuf[3] =(uint8)(temp1&0xff);
RfHaveTxDara = 1;
}
}
}
else if((RfRx.RXDATA.HeadCom[1] == 'P')&&(RfRx.RXDATA.HeadCom[2] == 'R'))//压力传感器
{ if(SensorNum == 5)//压力传感器板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp = ReadSensorAdc(0);
RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;
temp = temp%100;
RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;
RfHaveTxDara = 1;} }
else if((RfRx.RXDATA.HeadCom[1] == 'R')&&(RfRx.RXDATA.HeadCom[2] == 'A'))//雨滴传感器
{ if(SensorNum == 7)//雨滴传感器板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp = ReadSensorAdc(0);
RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;
temp = temp%100;
RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;
RfHaveTxDara = 1;} } else if((RfRx.RXDATA.HeadCom[1] == 'A')&&(RfRx.RXDATA.HeadCom[2] == 'D'))//控制加速度传感器
{
if(SensorNum == 10)//加速度传感器板 { //P1_4 = 1;if(RfRx.RXDATA.DataBuf[0] == 'X')
{
temp = ReadSensorAdc(XOUT);
}
else if(RfRx.RXDATA.DataBuf[0] == 'Y')
{
temp = ReadSensorAdc(YOUT);
} else if(RfRx.RXDATA.DataBuf[0] == 'Z')
{
temp = ReadSensorAdc(ZOUT);
}
//P1_4 = 0;
memcpy(RfTx.TxBuf, RfRx.RxBuf, 15);RfTx.TXDATA.DataBuf[1] = temp/100 + 0x30;
temp = temp%100;
RfTx.TXDATA.DataBuf[2] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[3] = temp%10 + 0x30;
RfHaveTxDara = 1;
}
}//end
else if((RfRx.RXDATA.HeadCom[1] == 'G')&&(RfRx.RXDATA.HeadCom[2] == 'A'))//可燃气体传感器 { if(SensorNum == 11)//可燃气体传感器板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp = ReadSensorAdc(0);
RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;
temp = temp%100;
RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;
RfHaveTxDara = 1;} } else if((RfRx.RXDATA.HeadCom[1] == 'U')&&(RfRx.RXDATA.HeadCom[2] == 'L'))//超声波传感器 { if(SensorNum == 14)//超声波传感器板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
P1_4 = 1;
WaitUs(20);
P1_4 = 0;
Ultrasonic_Count = 0;
while(!P0_0)//等待返回高电平 {
WaitUs(20);
if((++Ultrasonic_Count)>= 1000)//超时自动退出
{
break;
} }
Ultrasonic_Count = 0;while(P0_0)
{
WaitUs(20);
Ultrasonic_Count++;
if(Ultrasonic_Count >= 600)//超时退出
{
Ultrasonic_Count = 0;
break;
}
}
temp1 = Ultrasonic_Count;
if((temp1 > 1)&&(temp1 <550)){
RfTx.TXDATA.DataBuf[0] = temp1/100 + 0x30;
temp = temp1%100;
RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;
}
else
{
RfTx.TXDATA.DataBuf[0] = 'E';
RfTx.TXDATA.DataBuf[1] = '0';
}
RfHaveTxDara = 1;} }
else if((RfRx.RXDATA.HeadCom[1] == 'N')&&(RfRx.RXDATA.HeadCom[2] == 'S'))//读模块连接状态
{
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp = pkt->LinkQuality;
RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;temp %= 100;RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;NLME_GetCoordExtAddr(&RfTx.TXDATA.DataBuf[3]);temp1 = NLME_GetCoordShortAddr();RfTx.TXDATA.DataBuf[11] =(INT8U)(temp1>>8);RfTx.TXDATA.DataBuf[12] =(INT8U)(temp1);
RfHaveTxDara = 1;
}//end 读模块连接状态 break;
case 'T'://测试
if((RfRx.RXDATA.HeadCom[1] == 'L')&&(RfRx.RXDATA.HeadCom[2] == 'D'))//LED测试
{
if(RfRx.RXDATA.DataBuf[0] == 'C')
{
if((RfRx.RXDATA.DataBuf[1] == 'D')&&(RfRx.RXDATA.DataBuf[2] == '1'))
{
if(RfRx.RXDATA.DataBuf[3] == '1')
{
HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);//开
}
else if(RfRx.RXDATA.DataBuf[3] == '0')
{
HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF);//关
}
}
else if((RfRx.RXDATA.DataBuf[1] == 'D')&&(RfRx.RXDATA.DataBuf[2] == '2'))
{
if(RfRx.RXDATA.DataBuf[3] == '1')
{
HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);//开
}
else if(RfRx.RXDATA.DataBuf[3] == '0')
{
HalLedSet(HAL_LED_2, HAL_LED_MODE_OFF);//关
}
}
} else if(RfRx.RXDATA.DataBuf[0] == 'T'){ if((RfRx.RXDATA.DataBuf[1] == 'D')&&(RfRx.RXDATA.DataBuf[2] == '1'))//控制LED1
{
if(RfRx.RXDATA.DataBuf[3] == '1')
{ HalLedSet(HAL_LED_1, HAL_LED_MODE_FLASH);
}
else if(RfRx.RXDATA.DataBuf[3] == '0')
{ HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF);
}
}
else if((RfRx.RXDATA.DataBuf[1] == 'D')&&(RfRx.RXDATA.DataBuf[2] == '2'))//控制LED2
{ if(RfRx.RXDATA.DataBuf[3] == '1')
{ HalLedSet(HAL_LED_2, HAL_LED_MODE_FLASH);
}
else if(RfRx.RXDATA.DataBuf[3] == '0')
{ HalLedSet(HAL_LED_2, HAL_LED_MODE_OFF);
}
}
}
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;
}//end LED测试
else if((RfRx.RXDATA.HeadCom[1] == 'D')&&(RfRx.RXDATA.HeadCom[2] == 'A'))//
{
if(SensorNum == 12)//DAC输出 { temp1 = RfRx.RXDATA.DataBuf[0];temp1 <<= 8;temp1 += RfRx.RXDATA.DataBuf[1];
temp2 = RfRx.RXDATA.DataBuf[2];temp2 <<= 8;temp2 += RfRx.RXDATA.DataBuf[3];
DAC_OUT_CON(temp1, temp2);
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;}
}//end DAC_OUT测试
else if((RfRx.RXDATA.HeadCom[1] == 'M')&&(RfRx.RXDATA.HeadCom[2] == 'O'))//
{
if(SensorNum == 15)//电机测试 {
if((RfRx.RXDATA.DataBuf[0] == 'M')&&(RfRx.RXDATA.DataBuf[1] == '1'))
{
if(RfRx.RXDATA.DataBuf[2] == '0')//停止
{
MOTOR_Con(1, 0x8F);
}
else if(RfRx.RXDATA.DataBuf[2] == '1')//正转
{
MOTOR_Con(1, 0x80);
}
else if(RfRx.RXDATA.DataBuf[2] == '2')//反转
{
MOTOR_Con(1, 0x88);
}
}
else if((RfRx.RXDATA.DataBuf[0] == 'M')&&(RfRx.RXDATA.DataBuf[1] == '2'))
{
if(RfRx.RXDATA.DataBuf[2] == '0')//停止
{
MOTOR_Con(2, 0x8F);
}
else if(RfRx.RXDATA.DataBuf[2] == '1')//正转
{
MOTOR_Con(2, 0x80);
}
else if(RfRx.RXDATA.DataBuf[2] == '2')//反转
{
MOTOR_Con(2, 0x88);
}
}
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;
}
}//end MOTOR电机测试
else if((RfRx.RXDATA.HeadCom[1] == 'E')&&(RfRx.RXDATA.HeadCom[2] == 'D'))//点阵屏测试
{
if(SensorNum == 1)//点阵屏板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
if((RfRx.RXDATA.DataBuf[0] >= '0')&&(RfRx.RXDATA.DataBuf[0] <= '9')){
LCDUPDATA = 1;
DispNum = RfRx.RXDATA.DataBuf[0]-0x30;
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';} else {
RfTx.TXDATA.DataBuf[0] = 'E';
RfTx.TXDATA.DataBuf[1] = '0';
} RfHaveTxDara = 1;} } else if((RfRx.RXDATA.HeadCom[1](RfRx.RXDATA.HeadCom[2] == 'U'))//数码管屏测试
{
if(SensorNum == 2)//数码管屏板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp1 = RfRx.RXDATA.DataBuf[0];
temp1 <<= 8;
temp1 += RfRx.RXDATA.DataBuf[1];
if(temp1 <= 9999)
{
LEDDispNum = temp1;
LEDDISPFUN();//显示数据
LCDUPDATA = 1;
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
}
else
{
RfTx.TXDATA.DataBuf[0] = 'E';
RfTx.TXDATA.DataBuf[1] = '0';
} RfHaveTxDara = 1;}
== 'N')&& }
else if((RfRx.RXDATA.HeadCom[1] == 'B')&&(RfRx.RXDATA.HeadCom[2] == 'L'))//测试电池电压
{
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp = ReadSensorAdc(4);
RfTx.TXDATA.DataBuf[0] = temp;
RfHaveTxDara = 1;
} else if((RfRx.RXDATA.HeadCom[1] == 'B')(RfRx.RXDATA.HeadCom[2] == 'E'))//测试蜂鸣器
{
if((SensorNum == 4)||(SensorNum == 9))
{
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
if(RfRx.RXDATA.DataBuf[0] == '1'){
if(SensorNum == 4)
{
BEEPState1 = 2;
}
else
{
BEEPState2 = 2;
} }
else if(RfRx.RXDATA.DataBuf[0] == '0'){
if(SensorNum == 4)
{
BEEPState1 = 0;
P1_6 = 1;
}
else
{
BEEPState2 = 0;
P1_4 = 1;
} }
&&
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;
}
} else if((RfRx.RXDATA.HeadCom[1] == 'R')&&(RfRx.RXDATA.HeadCom[2] == 'E'))//控制继电器
{
if(SensorNum == 6)//继电器板
{
if((RfRx.RXDATA.DataBuf[0] == 'K')&&(RfRx.RXDATA.DataBuf[1] == '1'))
{
if(RfRx.RXDATA.DataBuf[2] == '1')
{
Relay1State = 1;
P1_4 = 1;
}
else if(RfRx.RXDATA.DataBuf[2] == '0')
{
Relay1State = 0;
P1_4 = 0;
}
}
else if((RfRx.RXDATA.DataBuf[0] == 'K')&&(RfRx.RXDATA.DataBuf[1] == '2'))
{
if(RfRx.RXDATA.DataBuf[2] == '1')
{
Relay2State = 1;
P1_5 = 1;
}
else if(RfRx.RXDATA.DataBuf[2] == '0')
{
Relay2State = 0;
P1_5 = 0;
}
}
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;
}
}//end 控制继电器
else if((RfRx.RXDATA.HeadCom[1] == 'L')&&(RfRx.RXDATA.HeadCom[2] == 'L'))//控制高亮LED
{
if(SensorNum == 17)//高亮LED板
{
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
ChangT3Cmp0Val(RfRx.RXDATA.DataBuf[0]);
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;
}
}//end 控制高亮LED
break;
}//end if(RfHaveTxDara)//如果有数据要发送
{
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.LastByte = '*';
SendData(0x0000, RfTx.TxBuf, 32);//发送数据
RfHaveTxDara = 0;} #endif } 4.实验总结
主要是通过组网来使协调器与终端器进行数据的交流与反馈,当LED灯显示时,LED显示屏也会显示相应状态,进行信息反馈。
第五篇:挑战麦克风
挑战麦克风
节目现场
节目形式和主持人确定
湖南卫视新节目《挑战麦克风》主持人定为:李好(湖南卫视)、骁骁(湖南娱乐频道)、马可(湖南经济电视台)
《挑战麦克风》的选手还是采取“海选”的方式,观众免费报名参加,每天晚上将有108名选手比赛,周一至周三是普通选手,周四将有明星加盟,和选手一起比拼。
节目的由来
2008年12月1日,湖南卫视将隆重推出《挑战麦克风》第一季,该节目曾于2007年在湖南娱乐频道试播,取得了非常高的收视,更是引爆了星城长沙的又一次的KTV火爆。同时个省级卫视也开始模仿播出,同样引爆了全国的收视狂潮,相信此次通过湖南卫视上星播出,必定会再一次引爆全国KTV的K歌狂潮。
请锁定2008年12月1日,每周周一至周四晚20:30分的《挑战麦克风》!!
节目已于2009年4月1日播出时间更改为第周一至周四晚19:35分播出。节目特色——湖南台新选秀机器检测音准
《挑战麦克风》将选出“平民歌王”,节目最大的特色便是不比唱得好不好,只比唱得对不对,唱歌不走调的人将在这个节目中脱颖而出。
节目流程
湖南卫视目前正在用唱歌机器从歌手的唱片中录制歌曲,每支歌都有自己特有的波段,选手拿着麦克风唱歌,唱完之后,唱歌机器能测试出选手唱歌的波段跟唱歌机器提前录制的相似度有多高,并打出分数。选手演唱的将是近30年来耳熟能详的歌曲,比如《军港之夜》、《冬天里的一把火》;经典影视歌曲比如《千年等一回》《敢问路在何方》等等,但是挑选出来的片段大多是一首歌中最难掌握的部分,比如转音、变调等。可能出现这样的搞笑场面,选手一首歌都会唱,但基本不在调上,得分是零。在《挑麦》第二季中,湖南卫视别出心裁的增加了一个叫做“挑麦我不服”的环节。该环节的加入大大提高了各位选手的中奖几率,使节目更加体现出“挑战”这一概念。
[]
歌曲《挑战麦克风》
词曲:陆虎 演唱:马可 李好
我没有浑厚的声音能够俘虏你的心
我没有清澈的高音能够震撼你的心
我没有流畅的颤音能够缠绕你的心
但我用最最真实的声音感动你的心
我没有帅气的外表简单就能抓住你眼睛
我没有大块的肌肉能够让你死心塌地
我没有高高的个子一眼望去1米90
但我会为你唱歌一首一首直到你满意
其实我也想做麦霸
只是我嗓音太差
今天晚上多唱几句
明天就不能说话
这些年的美好回忆我唱到让你满意
MR.mic告诉你 决定勇敢唱就是第一
你嗓子破了 唱得很HIGH
我把你话筒霸占过来
你嗓子破了 唱得很HIGH
我把你话筒霸占过来
你嗓子破了 唱得很HIGH
我把你话筒霸占过来
[编辑本段]
细数实力唱将
第一季
过7段的有:
任娜(她才是第一个,只是没有选难而已)7段
李索 7段
孙文海 8段
黄莉斯 7段(分数664,N段上80分)
潘嗣敬 7段(要是歌再选好点可以过8段)
补充一个:黄晶,要不是她有几段没唱也可以过7段,前面5段全过。牵手唱得很好。
特邀嘉宾:
谭维维 747 8段(6段上90,4段上95)
王铮亮 682 8段
刘力扬 647 8段
苏醒 582 6段
第2季
陈丹丹 7段 第二轮65(以下都为平均分)
张耀灏 7段 最后一期2度被选上……
刘嘉伦 7段 第二轮菊花台63分
张红 7段 第二轮62,出现过单段9
5吴研研 6段 第二轮68
周涵 7段 上过三次,分别是65 63 70(好强)
何浏 7段 第二轮59,上过很多次电视哦
李岚 7段 第二轮62,最后一期66
林军 8段 第二轮63,终极挑战734分
张洪羽 7段 三次 61 62 6
2NIKKI 6段 是因为近视看错,前面得分超高,还有过90的,应该可以过8段吕白杨 6段 同样选歌错误,第二轮6
3纪敏佳 7段 655分 8段 678分
张杰 8段 700分(我算了的,刚刚好700。)9段 645分(MR MIC不喜欢明天过后。只喜欢高音,应该唱天下或者山歌好比春江水)
由此可见选歌是如此重要的事儿。
第3季
(感觉机器标准升高好多,还有以红歌为主,所以看点下降)
成青 7段 海阔天空62分
张晓敏 8段平均分67
王梦溪 7段平均分60(歌未央68分)
李杨璐 7段平均分56 爱你的两个我6
4毛译少 7段平均分61(很多期擂主的、后被成青赶下来了……)
喻佳丽 6段 唱《无辜》63分
孙晓亮 8段平均分61分
还有几个人气的选手:徐林 金池 樊博等等
第3季上55就已经算厉害了
魏晨 6段 55分 艾梦萌 5段 53分
郭彪 5段 55分 张亚飞 6段 55分(我不信他们就这么低,魏晨和亚飞应该都可以过7段)
张杰 6段 57分(明天过后)第二轮 8段 67分(勿忘心安)
曹格 8段 67分 背叛 第二轮 9段 75分 掌纹,并出现3季第一个100分品冠 7段 61分 疼你的责任
TANK 6段 58分 城里的月光
谭维维 8段 62分 谭某某(这歌唱LIVE很难,如果唱民歌可以破记录的)关(吉吉)8段 唯一 66分(想你的夜可能分数更高)