上海电力学院飞思卡尔单片机应用实验报告题目:路灯控制器专业:电子信息工程班级:姓名:学号:一、实验要求:1.实现路灯控制器的功能;2.至少包含三个模块。
二、实验设备:1.PC机一台2.S12嵌入式开发系统一台3.LED 一个4.串行通信线一根5.4连排共阴极8段数码管一个三、实验原理:三个模块分别是定时器模块、LED模块和小灯模块。
通过时间的变化来达到我改变灯亮暗的目的。
其中,定时器进行时间的计算,分为6点-18点和18点-6点两段,而小灯就是由这两段时间产生亮暗的现象(当时间为6:00-18:00时,小灯的状态为暗,当时间为18:00-6:00时小灯的状态为亮)。
实验中要确认好相应代码,控制小灯亮红灯或者亮绿灯。
连线如下Vcc导线接插点PTA0 PTA1 PTA2 PTA3 PTA4 PTA5 PTA6 PTA7 PTA口(KEY1-8)四、实验内容:设定LED灯的前两位为小时项,后两位为分钟项,当时间为06:00-18:00时,小灯的状态为暗,当时间为18:00-06:00时小灯的状态为亮。
五、实验程序:1.主函数://总头文件#include "Includes.h"//主函数int main(){DISABLE_INTERRUPTS; //禁止总中断//1. 芯片初始化MCUInit();//2. 模块初始化SCIInit(); //(1) 串行通信初始化LEDInit(); //(2) LED控制引脚初始化TimerInit(); //(3) 定时器1初始化//3. 内存初始化//(1) "时分秒"缓存初始化(00:00:00)time[0] = 0;time[1] = 0;time[2] = 0;time[3] = 0;//(2) LED显示缓存初始化为"0123"LEDbuf[0] = '0';LEDbuf[1] = '0';LEDbuf[2] = '0';LEDbuf[3] = '0';//4. LED初始显示"0123"LEDShow(LEDbuf);//5. 开放各模块中断EnableSCIReInt; //(1) 开放SCI接收中断EnableT1OVInt; //(2) 开放定时器1溢出中断//6. 开放总中断ENABLE_INTERRUPTS;//总循环DDRA=0xff;PORTA=0xaa;LEDInit();while (1){if (time[0]==6){PORTA=0xff;}if (time[0]==18){PORTA=0xaa;}LEDbuf[3] = time[1]%10+0x30;LEDbuf[2] = time[1]/10+0x30;LEDbuf[1] = time[0]%10+0x30;LEDbuf[0] = time[0]/10+0x30;LEDShow(LEDbuf); //LED显示}}//头文件#include "Timer.h" //定时器头文件void TimerInit(void){//禁止定时器溢出中断,分频因子p=8//中断一次时间计算:t=n/(fbus/p)=1/38秒,其中n=65535,fbus=19.6608MHZ TSCR2 = 0x03;TSCR1 = 0x80; //允许主定时器开始计数}//TimerUpDate:定时器更新函数-----------------------------------------------*void TimerUpDate(void){time[1]++; //秒数加1if (time[1] != 60) goto isrTIMER1_exit; //秒数未增加到60,转time[1] = 0; time[0]++; //秒数增加到60,清0,分钟数加1if (time[0] != 24) goto isrTIMER1_exit; //小时数未增到24,转time[0] = 0; //时数增加到24,清0isrTIMER1_exit:TimInterCount = 0; //中断次数清零}//[LED.h]LED驱动头文件-----------------------------------------------------*//头文件#include <mc9s12dg128.h> //MCU映像寄存器名#include "Type.h" //类型别名定义//LED驱动相关寄存器宏定义#define LEDdata PORTB //LED数据口#define LEDdata_D DDRB //数据口相应方向寄存器#define LEDcs PTH //LED位选口#define LEDcs_D DDRH //位选口相应方向寄存器//小灯控制引脚定义#define Light_P PORTA //灯(Light)接在PTA口#define Light_D DDRA //相应的方向寄存器#define Light_Pin 1 //灯所在的引脚//外部函数声明void LEDInit(void); //4连排LED初始化void LEDShow(INT8U *Buf); //在4连排LED上显示4个十进制数//内部函数声明void LEDShow1(INT8U i, INT8U c); //在1个LED上显示数字//小灯控制相关函数声明void LEDInit(void); //定义控制小灯的MCU引脚为输出void LED_L_A(INT8U flag); //驱动小灯"亮"、"暗"#include "LED.h" //该头文件包含LED驱动相关寄存器宏定义void LEDInit(void){LEDdata_D = 0xFF; //数据口为输出LEDcs_D |= 0xF0; //位选口为输出Light_D |= 1<<Light_Pin; //令小灯引脚为输出Light_P |= 1<<Light_Pin; //初始时,小灯"暗"}void LEDShow(INT8U *Buf){INT8U i,c;INT16U j;for (i = 0;i <= 3;i++){c = Buf[i]-'0';LEDShow1(3-i,c);//延时for (j = 0;j <= 100;j++);}}void LED_L_A(INT8U flag){if (flag == 'A')Light_P |= 1<<Light_Pin; //小灯"暗"else if (flag == 'L')Light_P &= ~(1<<Light_Pin); //小灯"亮"}//[isr.c]中断处理函数__interrupt 16 void isrTimOver(void){DISABLE_INTERRUPTS; //关总中断TimInterCount++; //中断次数加一,中断38次为一秒if (TimInterCount == 1 ){TimerUpDate(); //定时器更新}TFLG2 = 0x80; //清除定时器溢出标志位ENABLE_INTERRUPTS; //开总中断}//[isr.h]中断处理函数头文件------------------------------------------------*//功能://(1)用于声明中断子函数//-------------------------------------------------------------------------*#ifndef ISR_H //避免重复定义#define ISR_H//头文件#include "SCI.h" //串行通信头文件#include "Timer.h" //定时器头文件#include "Type.h" //类型别名定义//开关总中断的宏定义#define ENABLE_INTERRUPTS asm("cli") //开中断#define DISABLE_INTERRUPTS asm("sei") //关中断//开关各模块中断的宏定义//开放或禁止SCI0的接收中断的宏定义#define EnableSCIReInt SCI0CR2 |= 0x20 //开放SCI0接收中断#define DisableSCIReInt SCI0CR2 &= 0xBF //禁止SCI0接收中断//开放或禁止定时器1溢出中断的宏定义#define EnableT1OVInt TSCR2 |= 0x80 //开放定时器1溢出中断#define DisableT1OVInt TSCR2 &= 0x7F //禁止定时器1溢出中断#endif六、实验小结:本次大作业课题自由选择,我选择了路灯控制器这个题目,根据现实情况结合自己的想法,简单的设计了一个路灯控制器并在试验箱上运行出我想要的现象。
当时间为6:00-18:00时,小灯的状态为暗,当时间为18:00-6:00时小灯的状态为亮。
通过本次实验,让我更进一步了解了CodeWarrior嵌入式开发系统软件的编程、运用,并且掌握了综合型的实验编程。
在实验过程中,并非是一帆风顺的,在编程过程中我遇到了许多问题,比如编译错误、模块未定义等等,最终经过自己的摸索,不断修改调试以及在老师的指导下得以解决。
本次实验得到正确结果让我很高兴但也有一丝遗憾,有一个想法由于时间不足没有得以实践,本打算加上开关的功能,当我给它一个信号(打开开关),小灯能不根据时间跳动而变化保持长亮状态。
虽然实验已经结束,希望今后有机会能把这个模块补上。
无论如何,通过这学期的实验,让我学到了很多,丰富了我学习内容的同时,也拓宽了我的视野,相信能给今后的工作带来较大的帮助。