MC9S12XS单片机大作业红外线报警器.doc

上传人:文库蛋蛋多 文档编号:4146676 上传时间:2023-04-07 格式:DOC 页数:15 大小:313KB
返回 下载 相关 举报
MC9S12XS单片机大作业红外线报警器.doc_第1页
第1页 / 共15页
MC9S12XS单片机大作业红外线报警器.doc_第2页
第2页 / 共15页
MC9S12XS单片机大作业红外线报警器.doc_第3页
第3页 / 共15页
MC9S12XS单片机大作业红外线报警器.doc_第4页
第4页 / 共15页
MC9S12XS单片机大作业红外线报警器.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《MC9S12XS单片机大作业红外线报警器.doc》由会员分享,可在线阅读,更多相关《MC9S12XS单片机大作业红外线报警器.doc(15页珍藏版)》请在三一办公上搜索。

1、上海电力学院实验报告实验课程名称:嵌入式系统 实验项目名称:红外线报警器 班 级: 姓名: 学号: 成绩:_ 实验时间:_一、 实验目的1. 进一步熟悉CodeWarrior嵌入式开发系统的软硬件环境,C语言、调试方式;掌握其使用方法及调试方式,会建立并设计一个比较大、包含三个以上实验模块块的工程,并在机子上运行程序,显示试验结果。2. 回顾本学期学过的多个模块(定时器、串行口、数码管、液晶LCD显示、键盘中断等)及其作用,进一步巩固,熟悉本学期所学模块内容,能充分掌握嵌入式系统的基本操作。3. 理解红外线报警器的工作原理。通过红外线报警器的设计实验,学会将几个模块连接在一起完成一定的功能。4

2、. 在本实验中用到PWM、定时器输入捕捉、LED等模块: a) 理解用定时器实现计数定时基本工作原理以及实现方法,会根据计数器原理设计一个倒计时的计数器 。(定时器实现溢出中断接线图见图1)b) 理解LED小灯的基本原理(见图2、图3和图4),理解LED小灯的显示和编程方法。c) 理解PWM模块的接口及原理,利用PWM模块输出需要的脉冲波,理解占空比的含义。(如图)d) 理解定时器输入捕捉的原理及接口,学会使用定时器输入捕捉来判断沿跳变。图1:定时器实现溢出中断接线图Vcc导线接插点 PTA口(KEY1-8)PTA0 PTA1 PTA2 PTA3 PTA4 PTA5 PTA6 PTA7(a)

3、25%的占空比图1 PWM占空比示意图时钟PWM(b) 50%的占空比时钟PWM(c) 75%的占空比时钟PWM红外线模块介绍:红外线是著名科学家赫歇尔在一次科学实验中发现的,他发现在太阳的可见光线以外存在着一种神奇的光线,人的肉眼无法看见这种光线,但它的物理特性与可见光线极为相似,有着明显的热辐射。由于它位于可见光中红光的外侧,故而称之为红外线,红外线的波长范围很宽,介于0.751000微米之间,频率低于可见光。红外传感器模块(如图4-22所示)用来测量障碍物的距离,由红外发射管和红外接收管组成。其基本原理是:发射管发射红外光,当前方没有障碍物时,红外线就一直往前照射,一旦遇到障碍物后,红外

4、光就会反射回来。红外线的反射光愈强,则说明障碍物的距离愈近。但当障碍物表面是黑色时,红外线容易被吸收,从而使反射光的强度减弱,这是它的不足之处。对于其他颜色的障碍物红外线都有很好的反射效果。接口说明:IR-接收信号引脚图4-22红外传感器模块实物图VCC-给传感器提供电源+5VGND-给传感器提供电源的地ISR-发射信号引脚注意:在实际做实验时,ISR引脚接MCU的某个I/O口(有PWM功能的I/O口),MCU在该引脚上产生40KHZ的方波。IR引脚接MCU的某个I/O口(有输入捕捉功能的I/O口),当有反射的红外信号时,在该引脚上会产生下降沿。例如:用MC68HC908GP32作为主控MCU

5、时,ISR可以接PTD4/T1CH0,用T1CH0通道PWM输出38KHZ的方波;IR接PTD5/T1CH1,用定时器1通道1进行输入捕捉。接收管实质是一种光电二极管,将光信号转变为电信号的元件。它的特点是被特定频率的光照射后,其阻值变小,光电二极管中就会有电流,光强度越大,阻值会越小。+5VGNDRVC检测点C光电二极管P图4-23 红外接收管原理图接收管原理图如图4-23所示。当没有光照射时,光电二极管P的阻值很大,VC0;当有光照射时,并随着光照强度的增大,VC也逐渐增大,VC最大值+5V。这样检测C点电压值就可以判断是否有障碍物,以及障碍物的大致距离。实验原理以及设计思路1. 现在日常

6、生活中,人们越来越重视自身的安全情况,尤其是家庭的防盗,报警功能越来越被人们所重视,而红外线报警是一种比较普遍的报警器。2. 红外线报警器拥有四个端口:1)IR:接受端口 2)ISR:发射信号端口 3)VCC:电源端口 4)GND:接地端口3. 要完成本实验,首先需要了解红外线报警模块的工作原理。本实验要用到实验箱上的PWM模块来做为红外线的发射信号,(原来的想法是利用定时器来完成,但是后来发现如果用定时器来做脉冲信号,那么我所得到的脉冲信号的频率不够,红外线发射的频率需要在KHZ级别,而使用定时器得到的脉冲只有几十到几百HZ,所以后来我选用了PWM模块作为脉冲信号的输出)。发射信号确定,接着

7、就是完成接收功能,在接受功能这块,我犯了个极 大的错误这个错误让我一直无法完成我的接受功能,红外线模块的接收端,当接收端收到反射的红外线时,接收口就会产生一个下降沿信号,而我把下降沿信号当作是低电平来处理了,只是简单的在POTA口来判断是否变为低电平,所以一直无法正确接受。当我意识到这个问题后,我及时的将接收功能使用定时器的输入捕捉来完成。以下为接口图,定时器输入捕捉功能为T口。图4-7 Core3接口图4-8 Core4接口定时器输入捕捉功能设置程序:定时器系统控制寄存器1:TSCR1定时器系统控制寄存器2:TSCR2输入捕捉输出比较选择寄存器:TIOS :TIOS寄存器的8位,IOSx=1

8、,即为选中那一位,将那一位设置为输出比较通道:IOSx=0,即为将那一位设置为输入捕捉通道。这里我将第0位设置为输入捕捉功能。信号输出选择PWM模块中的0通道,即为试验箱上的PWM1口,定时器输入捕捉口PT口为GPIO通用口,PT0为31口即GPIO47口。最后将红外模块的接收端IR接在PT0口上,信号输出端接在PWM1口上,VCC和GND分别接在5V和GND上。运行程序,当红外线被反射被接收端接受到时,就会进入中断,运行中断服务程序。二、 实验设备1. PC机(已安装CodeWarrior)2. S12嵌入式开发实验箱3. 红外线模块 三、 实验步骤1. 打开CodeWarrior软件,以P

9、WM主程序为框架,根据设计思路在增加IC.c、IC.h、LED.c、LED.h、isr.c、isr.h等文件进行代码编辑。a) 在IC.c中,进行定时器输入捕捉初始化设置,在LED.c文件中,编写小灯亮的程序,该程序用作捕捉到信号时中断调用的程序。2. 对实验箱进行接线。3. 编译程序,擦除,写入,运行,观察结果:当手挡住红外模块时,小灯会由暗变亮,或者直接使用鼠标上的红外线光照射模块的接收端,小灯也会由暗变亮。四、 实验关键代码程序描述:当红外线模块接收到信号时,接收端会产生一个下降沿信号,这个信号送入PT0口,由具有输入捕捉功能的PT口定时器来判断,当有下降沿信号进入时,程序就会产生中断,

10、调用中断处理程序,亮起小灯。在本程序中,TCL4的值即为设置是下降沿捕捉还是上升沿捕捉,这里我设置的是沿跳变捕捉,即为上升和下降都捕捉。实验关键代码截图:【main.c】/-*/工 程 名:DG128脉宽调制(PWM) */硬件连接:PTP.0,即定时器1通道0(4脚)接指示灯或蜂鸣器 */程序描述:通过对PWM占空比的调节实现现指示灯的渐亮的功能当占空比为100时 */ 再从0逐渐增加 */目 的:学习freescale HC(S)12(X)列定时器脉宽调制功 */日 期:2007.01.11 */-嵌入式系统使用HCS12微控制器的设计与应用教学实例-*/头文件#include Inclu

11、des.h /总头文件int main(void) INT8U period,duty; INT8S inc; DISABLE_INTERRUPTS; /关总中断 /1.芯片初始化 MCUInit(); /2.模块初始化 PWMInit(0,1,0); /初始化PWM的0通道,正极性,左对齐 /3.内存初始化 period = 0x22; duty = 0x00; inc = -1; DDRA=0xf0; PORTA=0xff; /主循环 while(1) if (duty=period | duty=0) inc = -(inc); duty += inc; PWMSetting(0,per

12、iod,duty); PWME |= 0x01; /允许通道0 Delay(5500); /延时 【PWM.c】/PWM.c脉宽调制-*/本文件包含: */ (1)PWMInit:PWM初始化 */ (2)PWMSetting:设置PWM周期和占空比设置 */-*/头文件#include PWM.h /脉宽调制头文件/PWMInit:PWM初始化-*/功 能:PWM初始化,A,B时钟频率均设为8MHz */参 数: */ channel-通道号,polarity-极性,align-对齐方式, */ polarity:0-负极性,1-正极性,align:0-左对齐,1-中心对齐 */返 回:无

13、*/-*void PWMInit(INT8U channel,INT8U polarity,INT8U align) INT8U i,j; /1 禁止通道channel j = 0x01; for (i=0; ichannel; i+) /禁止通道channel j = j1; PWME &= j; /2 PWM时钟源选择,选择X时钟作为channel的时钟源 j = 0x01; for (i=0; ichannel; i+) j = j1; PWMCLK &= j; /3 设置A,B的时钟频率 switch (channel) /通道0,1,4,5使用A时钟,A时钟频率=19.6608MHz

14、/128 case 0: case 1: case 4: case 5: PWMPRCLK |= 0x07; break; /通道2,3,6,7使用B时钟,B时钟频率=19.6608MHz/128 case 2: case 3: case 6: case 7: PWMPRCLK |= 0x70; break; default: break; /4 确定channel输出极性 j = 0x01; if (polarity = 1) /正极性 for (i=0; ichannel; i+) j = j1; PWMPOL |= j; else /负极性 for (i=0; ichannel; i+)

15、 j = j1; PWMPOL &= j; /5 确定channel输出方式 j = 0x01; if (align = 0) /左对齐 for (i=0; ichannel; i+) j = j1; PWMCAE &= j; else /中心对齐 for (i=0; ichannel; i+) j = j1; PWMCAE |= j; /6 清0通道channel计数器 PWMCNT0 = 0; /PWMSetting:PWM周期和占空比设置-*/功 能:根据参数设置f周期和占空比 */参 数: */ period=PWM周期所占用的时钟周期个数 */ duty=PWM占空比所占用的时钟周期

16、个数 */ Channel=所要设置的通道号(07) */返 回:无 */说 明:duty的值=period的值,并且两者的值都在0255之间 */-*void PWMSetting(INT8U channel,INT8U period,INT8U duty) switch(channel) case 0: PWMCNT0 = 0x00; /清通道0计数器 PWMDTY0 = duty; /设置周期寄存器 PWMPER0 = period; /设置占空比寄存器 break; case 1: PWMCNT1 = 0x00; /清通道1计数器 PWMDTY1 = duty; /设置周期寄存器 PW

17、MPER1 = period; /设置占空比寄存器 break; case 2: PWMCNT2 = 0x00; /清通道2计数器 PWMDTY2 = duty; /设置周期寄存器 PWMPER2 = period; /设置占空比寄存器 break; case 3: PWMCNT3 = 0x00; /清通道3计数器 PWMDTY3 = duty; /设置周期寄存器 PWMPER3 = period; /设置占空比寄存器 break; case 6: PWMCNT6 = 0x00; /清通道6计数器 PWMDTY6 = duty; /设置周期寄存器 PWMPER6 = period; /设置占空

18、比寄存器 break; case 7: PWMCNT7 = 0x00; /清通道7计数器 PWMDTY7 = duty; /设置周期寄存器 PWMPER7 = period; /设置占空比寄存器 break; default: break; 【isr.c】 /isr.c中断处理函数-*/功 能: */ (1)定义中断处理函数 */-*/头文件#include isr.h /中断处理函数头文件#pragma CODE_SEG _NEAR_SEG NON_BANKED /ISR_TimerChan0:输入捕捉中断函数-*/功 能:当开关状态发生变化时,小灯的状态随之变化 */-*_interrup

19、t 8 void ISR_TimerChan0(void) DISABLE_INTERRUPTS; /关总中断 LEDDrive(); TFLG1 |= (1C0F); /清除输入捕捉标志位 ENABLE_INTERRUPTS; /开总中断 【IC.c】/IC.c输入捕捉-*/本文件包含: */ (1)ICInit:输入捕捉系统配置初始化 */-*/头文件#include IC.h /输入捕捉头文件/ICInit:初始化输入捕捉系统配置-*/功 能:初始化,设置通道0为沿跳变输入捕捉 */参 数:无 */返 回:无 */-*void ICInit(void)TSCR1 = 0; /禁止时钟TI

20、OS = (10); /设置通道0为输入捕捉功能TCTL4 = 0x03; /设置上升沿和下降沿输入捕捉TIE = 0x01; /允许通道0中断TSCR2 = 0x06; /不允许溢出中断,分频因子为64TSCR1 |=(1TEN); /时钟计数【LED.c】/LED.c小灯驱动-*/本文件包含: */ (1)LEDInit:定义控制小灯的MCU的I/O引脚为输出 */ (2)LEDDrive:根据当前小灯状态驱动小灯亮、暗 */ 当前小灯亮,则驱动小灯变暗 */ 当前小灯暗,则驱动小灯变亮 */硬件连接: */ (1)本处的小灯是一个发光二极管,由MCU的I/O引脚控制 */ (2)控制引脚

21、=高电平时,小灯暗;反之,小灯亮 */-*/头文件#include LED.h /小灯驱动头文件/LEDInit:定义控制小灯的MCU引脚为输出-*/功 能:定义控制小灯的MCU引脚为输出,并使小灯初始为暗 */参 数:无 */返 回:无 */-*void LEDInit(void) /I/O初始化 Light_D|=1Light_Pin; /令指示灯引脚为输出 Light_P|=1Light_Pin; /初始时,指示灯暗/LED_L_A:根据当前小灯状态驱动小灯亮、暗-*/功 能:根据当前小灯状态驱动小灯亮、暗 */ 当前小灯亮,则驱动小灯变暗 */ 当前小灯暗,则驱动小灯变亮 */参 数:

22、无 */返 回:无 */-*void LEDDrive(void) Light_P = 1Light_Pin;五、 实验心得这次我选择红外线模块,是出于对本模块的一些想法,因为看过一些智能车的资料,知道智能车中的避障功能,有的就是使用红外线模块来完成的。处于兴趣,所以我选择了红外线报警这个题目。在以前学习51单片机的时候,我曾经使用过红外模块,而那时使用的发射信号就是用定时器产生的,接受信号也是通关对PT口是否为0来判断,所以在做这个的时候也是这么做的。但就是无法完成功能。在经过多次的翻阅资料。才发现,我对这个模块的使用存在问题,就是接收端所产生的是下降沿信号,而非低电平,所以不能通过判断PT

23、口是否为0。通过这次的实验,让我对dg128这个芯片的认识有了很大的提升,原来课堂上做实验时,接线都是根据实验指导书的图,都有明确的标明是那个口,而此次我使用了定时器输入捕捉和PWM模块。这两个都是平时没用过的模块,其管脚都不熟悉,尤其是定时器输入捕捉模块,芯片上大多数的引脚标的都是GPIO,所以我一直不知道到底那个才是T口,后来我仔细的查看了dg128芯片的引脚说明才找到了T口的位置。最后我终于把红外报警功能实现了,我发现,其实要实现这个功能并不复杂,也不难,关键就是要对芯片熟悉,知道各个接口的功能,这样。在使用的时候就不会有问题了。我之前做不出的原因就在于对芯片的不熟悉所导致的,所以在接下来,还要好好的学习下dg128这个芯片。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号