MC9S12XS单片机大作业红外线报警器.doc_第1页
MC9S12XS单片机大作业红外线报警器.doc_第2页
MC9S12XS单片机大作业红外线报警器.doc_第3页
MC9S12XS单片机大作业红外线报警器.doc_第4页
MC9S12XS单片机大作业红外线报警器.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上海电力学院实验报告实验课程名称:嵌入式系统 实验项目名称:红外线报警器 班 级: 姓名: 学号: 成绩:_ 实验时间:_一、 实验目的1. 进一步熟悉codewarrior嵌入式开发系统的软硬件环境,c语言、调试方式;掌握其使用方法及调试方式,会建立并设计一个比较大、包含三个以上实验模块块的工程,并在机子上运行程序,显示试验结果。2. 回顾本学期学过的多个模块(定时器、串行口、数码管、液晶lcd显示、键盘中断等)及其作用,进一步巩固,熟悉本学期所学模块内容,能充分掌握嵌入式系统的基本操作。3. 理解红外线报警器的工作原理。通过红外线报警器的设计实验,学会将几个模块连接在一起完成一定的功能。4. 在本实验中用到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) 25%的占空比图1 pwm占空比示意图时钟pwm(b) 50%的占空比时钟pwm(c) 75%的占空比时钟pwm红外线模块介绍:红外线是著名科学家赫歇尔在一次科学实验中发现的,他发现在太阳的可见光线以外存在着一种神奇的光线,人的肉眼无法看见这种光线,但它的物理特性与可见光线极为相似,有着明显的热辐射。由于它位于可见光中红光的外侧,故而称之为红外线,红外线的波长范围很宽,介于0.751000微米之间,频率低于可见光。红外传感器模块(如图4-22所示)用来测量障碍物的距离,由红外发射管和红外接收管组成。其基本原理是:发射管发射红外光,当前方没有障碍物时,红外线就一直往前照射,一旦遇到障碍物后,红外光就会反射回来。红外线的反射光愈强,则说明障碍物的距离愈近。但当障碍物表面是黑色时,红外线容易被吸收,从而使反射光的强度减弱,这是它的不足之处。对于其他颜色的障碍物红外线都有很好的反射效果。接口说明:ir-接收信号引脚图4-22红外传感器模块实物图vcc-给传感器提供电源+5vgnd-给传感器提供电源的地isr-发射信号引脚注意:在实际做实验时,isr引脚接mcu的某个i/o口(有pwm功能的i/o口),mcu在该引脚上产生40khz的方波。ir引脚接mcu的某个i/o口(有输入捕捉功能的i/o口),当有反射的红外信号时,在该引脚上会产生下降沿。例如:用mc68hc908gp32作为主控mcu时,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. 现在日常生活中,人们越来越重视自身的安全情况,尤其是家庭的防盗,报警功能越来越被人们所重视,而红外线报警是一种比较普遍的报警器。2. 红外线报警器拥有四个端口:1)ir:接受端口 2)isr:发射信号端口 3)vcc:电源端口 4)gnd:接地端口3. 要完成本实验,首先需要了解红外线报警模块的工作原理。本实验要用到实验箱上的pwm模块来做为红外线的发射信号,(原来的想法是利用定时器来完成,但是后来发现如果用定时器来做脉冲信号,那么我所得到的脉冲信号的频率不够,红外线发射的频率需要在khz级别,而使用定时器得到的脉冲只有几十到几百hz,所以后来我选用了pwm模块作为脉冲信号的输出)。发射信号确定,接着就是完成接收功能,在接受功能这块,我犯了个极 大的错误这个错误让我一直无法完成我的接受功能,红外线模块的接收端,当接收端收到反射的红外线时,接收口就会产生一个下降沿信号,而我把下降沿信号当作是低电平来处理了,只是简单的在pota口来判断是否变为低电平,所以一直无法正确接受。当我意识到这个问题后,我及时的将接收功能使用定时器的输入捕捉来完成。以下为接口图,定时器输入捕捉功能为t口。图4-7 core3接口图4-8 core4接口定时器输入捕捉功能设置程序:定时器系统控制寄存器1:tscr1定时器系统控制寄存器2:tscr2输入捕捉输出比较选择寄存器:tios :tios寄存器的8位,iosx=1,即为选中那一位,将那一位设置为输出比较通道: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软件,以pwm主程序为框架,根据设计思路在增加ic.c、ic.h、led.c、led.h、isr.c、isr.h等文件进行代码编辑。a) 在ic.c中,进行定时器输入捕捉初始化设置,在led.c文件中,编写小灯亮的程序,该程序用作捕捉到信号时中断调用的程序。2. 对实验箱进行接线。3. 编译程序,擦除,写入,运行,观察结果:当手挡住红外模块时,小灯会由暗变亮,或者直接使用鼠标上的红外线光照射模块的接收端,小灯也会由暗变亮。四、 实验关键代码程序描述:当红外线模块接收到信号时,接收端会产生一个下降沿信号,这个信号送入pt0口,由具有输入捕捉功能的pt口定时器来判断,当有下降沿信号进入时,程序就会产生中断,调用中断处理程序,亮起小灯。在本程序中,tcl4的值即为设置是下降沿捕捉还是上升沿捕捉,这里我设置的是沿跳变捕捉,即为上升和下降都捕捉。实验关键代码截图:【main.c】/-*/工 程 名:dg128脉宽调制(pwm) */硬件连接:ptp.0,即定时器1通道0(4脚)接指示灯或蜂鸣器 */程序描述:通过对pwm占空比的调节实现现指示灯的渐亮的功能当占空比为100时 */ 再从0逐渐增加 */目 的:学习freescale hc(s)12(x)列定时器脉宽调制功 */日 期:2007.01.11 */-嵌入式系统使用hcs12微控制器的设计与应用教学实例-*/头文件#include includes.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,period,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-中心对齐 */返 回:无 */-*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/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+) 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占空比所占用的时钟周期个数 */ 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; /设置周期寄存器 pwmper1 = 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; /设置占空比寄存器 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:输入捕捉中断函数-*/功 能:当开关状态发生变化时,小灯的状态随之变化 */-*_interrupt 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; /禁止时钟tios = (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)控制引脚=高电平时,小灯暗;反之,小灯亮 */-*/头文件#include led.h /小灯驱动头文件/ledinit:定义控制小灯的mcu引脚为输出-*/功 能:定义控制小灯的mcu引脚为输出,并使小灯初始为暗 */参 数:无 */返 回:无 */-*void ledinit(void) /i/o初始化 light_d|=1light_pin; /令指示灯引脚为输出 light_p|=1light_pin; /初始时,指示灯暗/led_l_a:根据当前小灯

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论