1、 毕业设计(论文) 课题 红外线逻辑分析仪的设计 类 别 毕业设计论文 系 科 专 业 ¤应用电子技术¡应用电子技术/应用英语 ¡电气自动化技术¡电气自动化技术/市场营销 ¡计算机应用技术¡计算机应用技术/广告设计与策划 班 级 姓 名 完成日期 指导教师 红外线遥控逻辑分析仪的设计 摘 要 在高新技术飞速发展的今天,随着信息技术的普及,红外技术得到了迅猛发展。本设计采用用途广泛的红外线通信技术设计了一款基于计算机串口的红外逻辑分析仪,本课题由SM0038红外接收头、ST
2、C89C52单片机、MAX232电平转换器、DB9构成硬件部分,由下位机程序和上位机程序构成软件部分。设计的逻辑分析仪可对各种电器的红外遥控器所发射的控制信号进行识别、存贮和再现。还可通过红外硬件接口识别出红外信号并送入单片机处理,然后利用VB开发的虚拟软件在电脑屏幕上实时显示采集到的红外信号波形便于设计人员对各种调制方式的红外信号进行“可视化”的分析与研究。 关键词:串口 红外通信 红外逻辑分析仪 Infrared Remote Control Logic Analyzer Abstract The rapid development of high-tech today, w
3、ith the spread of information technology, infrared technology has been developing rapidly. This design uses a wide range of uses infrared communication technology designed a computer-based logic analyzer infrared serial port, this project was supported by SM0038 infrared receiver head, STC89C52 micr
4、ocontroller, MAX232 level converter, DB9 constitute the hardware part, by the next crew procedures and upper Machine procedures constitute software. Design logic analyzer can be a variety of electrical infrared remote control signal emitted by the identification, storage and reproduction. Hardware i
5、nterface can be identified by infrared infrared signal and sent to MCU processing, then use the VB development of virtualization software on a computer screen real-time display of the infrared signal waveforms collected to facilitate the designer of various modulation infrared signals "visual "of an
6、alysis and research. Key words:Serial Infrared communication Infrared logic analyze. 目 录 摘 要 I Abstract II 引言 1 1 红外线介绍 1 2 串口通信原理 1 2.1 波特率选择 1 2.2通信协议的使用 2 2.3 硬件连接 2 3 硬件设计 3 3.1 STC89C52芯片 3 3.1.1主要性能 4 3.1.2 STC89C52单片机芯片引脚介绍 4 3.2 SM0038芯片 4 3.2.1 SM0038引脚接法 4 3.2.2 SM0038
7、与单片机接口电路 5 3.3 MAX232芯片 5 3.3.1 MAX232芯片引脚 5 3.3.2 MAX232芯片功能 6 3.4 电源电路及其说明 6 3.5 总原理图及其说明 7 4 软件设计 7 4.1 红外编码格式 7 4.2 单片机的软件编程 8 4.2.1下位软件编程思路 8 4.2.2 下位机程序 8 4.3 上位机软件设计 11 4.3.1上位机软件编程思路 11 4.3.2 上位机程序 11 5 系统调试 24 5.1硬件调试 24 5.2 软件调试 25 5.3 软硬件联调 25 5.3.1 调试的方法 25 5.3.2 调试中出现
8、的故障及解决方案 25 总结 26 参考文献 - 1 - 致谢 - 2 - 附录 - 3 - III 南通职业大学电子工程系毕业论文 引言 红外通信技术是一种点对点的数据传输协议,是传统设备之间连接线缆的替代技术,是目前国际上普通采用的一种近程无线传输技术,常用于智能小区控制系统和电话教学交互式远程控制系统中,但是目前的家电(如空调、录像机、VCD机等)有各种不同的品牌和型号,其红外遥控编码及发送格式不尽相同。为了能够用一台通用控制器对多种不同型号的家电进行控制,本文利用功能强大的单片机和编程软件VB设计了一种基于计算机串口的通用型智能红外逻辑分析仪,它可对各种电器的红外遥
9、控器所发射的控制信号进行识别、存贮和再现。还可通过红外硬件接口识别出红外信号并送入单片机处理,然后利用VB开发的虚拟软件在电脑屏幕上实时显示采集到的红外信号波形 便于设计人员对各种调制方式的红外信号进行“可视化”的分析与研究。 1 红外线介绍 红外线是波长在7 5 0 nm至1mm之间的电磁波,它的频率高于微波而低于可见光,是一种人的眼睛看不到的光线。 红外通讯一般采用红外波段内的近红外线,波长在O,75um至25um之间。红外数据协会(IRDA)成立后,为了保证不同厂商的红外产品能够获得最佳的通讯效果,红外通讯协议将红外数据通讯所采用的光波波长的范围限定在850nm至900nm。 2
10、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。 2.1 波特率选择 波特率就是在串口通信中每秒能够发送的位数(bits/second),MSC51串行端口在四种工作模式下有不同的波特率计算方法。 其中,模式0和模式2波特率计算很简单;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式
11、为: 波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则 TH1=256-62500/波特率
12、 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表2.1所示。 表2.1 波特率与计数器重载值关系 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2.2通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定: 0xA1:单片机读取P0端口数据,并将读取数据返回PC机; 0xA2:单片机从PC机接收一段控制数
13、据; 0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 2.3 硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几
14、个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 图2.1 使用MAX232串口通信电路图 串口通讯的硬件电路如上图所示为了能够在计算机端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里利用如下图标的一个免费计算机串口调软件来观察。 3 硬件设计 3.1 STC89C5
15、2芯片 图3.1 STC89C52芯片引脚图 3.1.1主要性能 与MCS-51单片机产品兼容 、8K字节在系统可编程Flash存储器、 1000次擦写周期、全静态操作:0Hz~33Hz 、三级加密程序存储器 、 32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、 低功耗空闲和掉电模式 、掉电后中断可唤醒 、看门狗定时器 、双数据指针、掉电标识符 。 3.1.2 STC89C52单片机芯片引脚介绍 STC89C52芯片 共40引脚: 1--8脚: 通用I/O接口p1.0--p1.7 9脚:RST复
16、位键 10 .11脚:RXD串口输入 TXD串口输出 12--19:I/O p3接口 (12,13脚 INT0中断0 INT1中断1 14,15 : 计数脉冲T0 T1 16,17: WR写控制 RD读控制输出端) 18,19: 晶振谐振器 20 地线 21—28: p2 接口 高8位地址总线 29:PSEN片外ROM选通端,单片机对片外ROM操作时,29脚(PSEN)输出低电平 30:ALE/PROG 地址锁存器 31:EA ROM取指令控制器,高电平片内取,低电平片外取 32--39:p0.7--p0.0(注意此接口的顺序与其他I/O接口不同 与引脚号的排列顺序
17、相反) 40:电源+5V 3.2 SM0038芯片 3.2.1 SM0038引脚接法 图3.2 SM0038外观图 SM0038是红外线传感器,它对外只有3个引脚:GND、VS和1个脉冲信号输出引脚OUT,只能接收38KHZ的红外线信号,外形引脚如图3.2所示。 3.2.2 SM0038与单片机接口电路 图3.3 SM0038与单片机接口电路 与单片机接口非常方便,如图四所示。VCC接电源+5V并经电容进行滤波,以避免电源干扰; GND接系统的地线(0V);脉冲信号输出接CPU的中断输入引脚(例如8051的13
18、脚INT1)。采取这种连接方法,软件解码既可工作于查询方式,也可工作于中断方式。 3.3 MAX232芯片 3.3.1 MAX232芯片引脚 Max232产品是由德州仪器公司(TI)推出的一款兼容RS232标准的芯片。该器件包含2驱动器、2接收器和一个电压发生器电路提供TIA/EIA-232-F电平。 该器件符合TIA/EIA-232-F标准,每一个接收器将TIA/EIA-232-F电平转换成5-V TTL/CMOS电平。每一个发送器将TTL/CMOS电平转换成TIA/EIA-232-F电平,芯片图如图3.4所示。
19、 图3.4 MAX232 3.3.2 MAX232芯片功能 为了能使单片机与PC进行通信,必须使其遵循相同的通信协议。由于STC89C52的串行口输入/输出为TTL逻辑电平,高电平为3.8V左右,低电平为0.3V左右,因而这种以TTL电平传送数据的方式的抗干扰性较差。而计算机内部的RS-232C串行口用±12V和-12V电平方式,这种方式中,信号0和信号1的电平差别增大,从而增强了抗干扰性。但是,为了解决这种电平不一致的矛盾,必须采用一个RS-232C电平转换器,文中采用的MAX232自身带有电源电压变换器,可把+5V电压变换成RS-232输出电平所需的±10V
20、电压,因而采用这种方式进行串行通信具有较好的性能和低廉的价格。如果通信距离较远,还可以通过增加MAX485转换器来连接MAX232以满足要求。 3.4 电源电路及其说明 图3.5 电源电路 先通过变压器降压为12V,经过整流桥将交流电压变为直流电压,然后再滤波,通过78M05稳压器稳压,输出+5V的电压提供给总电路用,使其电路正常工作。 3.5 总原理图及其说明 图3.6 系统电路原理图 先通过SM0038的红外接收头接收38KHZ的红外线信号,然后将信号通过STC89C52单片机的P1.7口送单片机进行处
21、理,单片机再发出接收到的信号给PC机显示该信号的波形,由于STC89C52的串行口输入/输出为TTL逻辑电平,高电平为3.8V左右,低电平为0.3V左右,因而这种以TTL电平传送数据的方式的抗干扰性较差。而计算机内部的RS-232C串行口用±12V和-12V电平方式,所以就需要MAX232电平转换器来将可把+5V电压变换成RS-232输出电平所需的±10V电压,使得PC机与单片机能够正常的通信。 4 软件设计 4.1 红外编码格式 现有的红外遥控包括两种方式:PWM(脉冲宽度调制)和PPM(脉冲位置调制)。 两种形式编码的代表分别为NEC和PHILIPS的RC-5、RC-6以及将来的R
22、C-7。 PWM(脉冲宽度调制):以发射红外载波的占空比代表“0”和“1”。为了节省能量,一般情况下,发射红外载波的时间固定,通过改变不发射载波的时间来改变占空比。例如常用的电视遥控器,使用NEC upd6121,其“0”为载波发射0.56ms,不发射0.56ms;其“1”为载波发射0.56ms,不发射1.68ms;此外,为了解码的方便,还有引导码,upd6121的引导码为载波发射9ms,不发射4.5ms。upd6121总共的编码长度为108ms。 但并不是所有的编码器都是如此,比如TOSHIBA的TC9012,其引导码为载波发射4.5ms,不发射4.5ms,其“0”为载波发射0.52ms
23、不发射0.52ms,其“1”为载波发射0.52ms,不发射1.04ms。 PPM(脉冲位置调制):以发射载波的位置表示“0”和“1”。从发射载波到不发射载波为“0”,从不发射载波到发射载波为“1”。其发射载波和不发射载波的时间相同,都为0.68ms,也就是每位的时间是固定的。 通过以上对编码的分析,可以得出以某种固定格式的“0”和“1”去学习红外,是很有可能不成功的。即市面上所宣传的可以学习64位、128位必然是不可靠的。 另外,由于空调的状态远多于电视、音像,并且没有一个标准,所以各厂家都按自己的格式去做一个,造成差异更大。比如:美的的遥控器采用PWM编码,码长120ms左右;新科的
24、遥控器也采用PWM编码,码长500ms左右。如此大的差异,如果按“位”的概念来讲,应该是多少位呢?64位还是128位显然都不可能包含如此长短不一的编码。 4.2 单片机的软件编程 4.2.1下位软件编程思路 我用的是C语言编写的程序,该程序主要由串口初始化子函数、外部中断0中断子函数、单片机内部定时器T0中断子函数、红外信号发送子函数等3大模块组成。等到红外信号下降沿到来时,进入外部中断0中断子函数,打开T0定时器开关TR0,使得T0工作,在主函数中判断外部中断0接线端为1时,进入T0中断子函数,在T0中断子函数中主要是把TH0,TL0所记的数值送单片机处理。 4.2.2 下位机程序
25、
#include
26、22.1184MHZM// TL1=0xff 115200 EA=1; ES=0; EX0=1; IT0=1; PCON=0x80; TH0=0x00; TL0=0x00; // TR0=1; ET0=1; } void delay(void) //误差 -1.041666666667us { unsigned char a,b; for(b=61;b>0;b--) for(a=3;a>0;a--); } void INT() interrupt 0 { TR0=1; tmp=0; // P2+=1;
27、} void Time0() interrupt 1 { dat[0]=TH0; dat[1]=TL0; tmp=1; SBUF=dat[0]; delay(); TI=0; SBUF=dat[1]; delay(); TI=0; TR0=0; // TF0=0; TH0=0; TL0=0; // P33=0; } void Time1() interrupt 3 { RI=0; TI=0; } void main() { TimeSet(); while(1) { // SB
28、UF=0x0a; // P2+=1; if(tmp==0 && P32==1) { TF0=1; // P2+=1; } } } 4.3 上位机软件设计 4.3.1上位机软件编程思路 利用Visual Basic提供的MSComm控件可以简单便携地通过应用程序实现串行通信,也可以创建功能完备、具有事件驱动功能的高级通信工具。与DOS环境下用汇编或C语言等编制的串行通信程序及Windows环境下用Visual C编制的串行通信程序相比,在使用Visual Basic的MSComm控件实现串行通信时,程序员只需关心MSC
29、omm控件对Windows通信驱动程序的API函数的接口即可,换句话说,只需要设置和监视MSComm控件的属性和事件即可。 4.3.2 上位机程序 Modulel (Code) Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long Public Const WS_EX_LAYERED = &H80000 Public Con
30、st GWL_EXSTYLE = (-20) Public Const LWA_ALPHA = &H2 Public Const LWA_COLORKEY = &H1 Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd A
31、s Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Form1 Dim Buffer1(63488) As Byte Dim Buffer2(63488) As Byte Dim Buffer3(63488) As Byte Dim Data_point As Long Dim Wave_width As Integer Dim Width_per_BIT As Single Dim n As Integer Dim Time As Integer Dim Data_rate As Long Dim
32、 temp_long As Long Dim Click_flag As Boolean Dim Old_X, Old_Y As Single Dim Flag_about As Boolean Function Draw_Square_Wave(ByVal Start As Long, ByVal x, Y, Width_per_20us As Integer, ByVal Channel As Integer) Dim Time_long As Integer Dim HEiGHT, LINE_COLOR, START_Y As Integer Dim Temp_buffer
33、 Dp, Dp_old As Integer START_Y = Y HEiGHT = 200 LINE_COLOR = RGB(0, 0, 255) Picture1.Line (0, START_Y)-(1, START_Y), LINE_COLOR Time_long = Picture1.Width / Width_per_20us For i = 0 To Int(Time_long / 8) Select Case Channel Case 1 Temp_buffer = Buffe
34、r1(Start + i) Case 2 Temp_buffer = Buffer2(Start + i) Case 3 Temp_buffer = Buffer3(Start + i) End Select k = 0 For j = 7 To 0 Step -1 k = k + 1 Dp = Int(Temp_buffer / 2 ^ j)
35、If Dp = 0 Then If Dp_old = 0 Then Picture1.Line -((i * 8 + k) * Width_per_20us, START_Y), LINE_COLOR If Dp_old = 1 Then Picture1.Line -((i * 8 + k - 1) * Width_per_20us, START_Y), LINE_COLOR Picture1.Line -((i * 8 + k) * Wid
36、th_per_20us, START_Y), LINE_COLOR End If End If If Dp = 1 Then Temp_buffer = Temp_buffer - 2 ^ j If Dp_old = 1 Then Picture1.Line -((i * 8 + k) * Width_per_20us, START_Y - HEiGHT), LINE_COLOR If Dp_old = 0
37、Then Picture1.Line -((i * 8 + k - 1) * Width_per_20us, START_Y - HEiGHT), LINE_COLOR Picture1.Line -((i * 8 + k) * Width_per_20us, START_Y - HEiGHT), LINE_COLOR End If End If Dp_old = Dp Next Next
38、 Picture1.Line (0, Y + 200)-(Picture1.Width, START_Y + 200), RGB(200, 200, 255) PrintWord 0, Y + 20, Str(Round(Start * Width_per_BIT * 8 / 1000, 3)) & "ms" For j = 0 To Int(Time_long / 50) Picture1.Line (j * 50 * Width_per_20us, Y + 100)-(j * 50 * Width_per_20us, S
39、TART_Y + 200), RGB(200, 200, 255) Next End Function Function PrintWord(ByVal x, Y As Integer, ByVal toprint As String) Dim temp1, temp2 As Integer temp1 = Picture1.CurrentX temp2 = Picture1.CurrentY With Picture1 .CurrentX = x .CurrentY = Y
40、 .ForeColor = RGB(255, 96, 96) End With Picture1.Print toprint With Picture1 .CurrentX = temp1 .CurrentY = temp2 End With End Function Private Sub Command1_Click() CommonDialog1.Filter = "Ird文件|*.ird" CommonDialog1.ShowOpen Dim temp_Filename As Strin
41、g Dim save_Filename As String Dim temp_counter As Long temp_Filename = CommonDialog1.FileName 'CommonDialog1.ShowSave 'save_Filename = CommonDialog1.FileName On Error GoTo fuck Open temp_Filename For Binary As #1 For temp_counter = 0 To 63488 Get #1, , Buffer1(temp_counter)
42、 Next For temp_counter = 0 To 63488 Get #1, , Buffer2(temp_counter) Next For temp_counter = 0 To 63488 Get #1, , Buffer3(temp_counter) Next Close #1 Picture1.Cls temp_long = HScroll1.Value Draw_Square_Wave temp_long * 2, 0, 900, Wave_width, 1 Draw_S
43、quare_Wave temp_long * 2, 0, 2200, Wave_width, 2 Draw_Square_Wave temp_long * 2, 0, 3500, Wave_width, 3 GoTo out fuck: MsgBox "打开文件出错" out: End Sub Private Sub Command2_Click() If MSComm1.PortOpen = False Then Init_com Select Case MSComm1.PortOpen Case False
44、Data_point = 0 End Select MSComm1.PortOpen = Not MSComm1.PortOpen Select Case MSComm1.PortOpen Case False Timer1.Interval = 0 Label1.Caption = "串口已关闭,数据采集被强行停止" Data_point = 0 Label2.Caption = "0 Bit/s" Command
45、2.Caption = "开始采集" Picture1.Cls Command1.Enabled = True Command3.Enabled = True Case True Command2.Caption = "强行停止" Command2.Enabled = True Combo1.Enabled = False Command1.Enabled = False
46、 Command3.Enabled = False Label1.Caption = "串口已开启,波特率为115200bps,等待数据中" Time = 0 Timer1.Interval = 200 End Select End Sub Private Sub Command3_Click() CommonDialog1.Filter = "Ird文件|*.ird" CommonDialog1.ShowSave Dim temp_Filename As String D
47、im temp_counter As Long temp_Filename = CommonDialog1.FileName 'CommonDialog1.ShowSave 'save_Filename = CommonDialog1.FileName On Error GoTo fuck Open temp_Filename For Binary As #1 For temp_counter = 0 To 63488 Put #1, , Buffer1(temp_counter) Next For temp_counter =
48、 0 To 63488 Put #1, , Buffer2(temp_counter) Next For temp_counter = 0 To 63488 Put #1, , Buffer3(temp_counter) Next Close #1 GoTo out fuck: MsgBox "保存文件出错" out: End Sub Private Sub Command5_Click() If Wave_width >= 10240 Then Wave_width = 10240
49、 Wave_width = Wave_width * 2 HScroll1.Max = 63486 / 2 - (Picture1.Width / Wave_width) / 8 Picture1.Cls Draw_Square_Wave temp_long * 2, 0, 900, Wave_width, 1 Draw_Square_Wave temp_long * 2, 0, 2200, Wave_width, 2 Draw_Square_Wave temp_long * 2, 0, 3500, Wave_width, 3 End Sub
50、 Private Sub Command6_Click() Wave_width = Wave_width / 2 If Wave_width < 2.5 Then Wave_width = 2.5 HScroll1.Max = 63486 / 2 - (Picture1.Width / Wave_width) / 8 Picture1.Cls Draw_Square_Wave temp_long * 2, 0, 900, Wave_width, 1 Draw_Square_Wave temp_long * 2, 0,






