《单片机技术及应用》教案——项目6 综合实训.docx
教学实施方案课题名称单片机技术及应用实训部审批任务名称项目6综合实训年月日学时10学时授课时间授课班级授课教师一、教学目标Ca知识目标掌握较复杂的电路设计与C51编程调试自技能目标掌握单片机项目开发的基本流程人情感目标培养团队合作意识二、重点难点i教学重点单片机项目开发案例曾教学难点复杂项目的开发思维三、学习内容一、设计任务导入使用YL-236装置中的相关模块及元件,构建一套虚拟“智能往返小车”系统。二、设计任务分析由项目说明及控制要求可知,本项目主要的功能为:控制、显示、按键、小车运动、报警。首先根据这些功能来选择模块:1)选用主机模块作为系统的控制核心及报警装置;2)选用显示模块完成TG12864及“LED0LED5”的显示功能;3)选用指令模块实现系统所需的独立按键功能;4)根据第五单元讲的电气控制系统,选用直流电机模块和继电器模块来模拟实现对小车运动方向的控制;5)最后选用电源模块对系统进行供电。三、任务信息学习(一)硬件电路的设计系统所需模块和I/O口的分配,接下来就开始搭建系统的硬件电路。系统模块接线图如图6-1所示。+5V地,+5V÷'+5V地+,+5Vp24V,24V地,图6-1智能往返小车的模块接线图(二)程序的设计1.各状态描述系统状态:系统有开机状态、设置状态、运行状态,暂停状态,用全局变量function表达,方便各中断服务函数、主函数访问。对应上述状态,function分别为0、1.2.3。运行模式:往返小车有自动模式与手动模式,用全局位变量MS表达。电机状态:用全局变量mm表达电机3种状态,0暂停、1前进,2一后退。电机方向:用全局变量direction表达电机运动方向,0前进,1后退。电机位置:用全局变量PIaCe表达,其范围为05,分别对应LED(TLED5。3s计时标志及计时变量:当全局位变量JSl置1时,启动3s计时,全局变量ii每IOmS计数;当ii计数到300时,3s计时完成,JSl清零。电机全程计时标志及计时变量:当全局位变量JS2置1时,启动20s计时,全局变量time每IOms计数;当ii计数到2000时,20s计时完成,JS2清零。2.部分程序流程图整个系统程序由三部分组成:TO中断服务函数、Tl中断服务函数、主函数。各部分主要承担如下功能。TO中断服务函数:主要完成定时扫描键盘、设置状态时按键功能、运行状态时暂停按键与暂停中恢复运行等功能。Tl中断服务函数:3s计时、20s计时。主函数:硬件初始化、定时器初始化、变量初始化;开机界面、设置界面、运行界面的显示;自动模式下电机运行控制、手动模式下按键处理等。对于较复杂系统,一般需要将系统功能进行适当分解,由各函数承担一部分任务。具体做法不一,可以灵活处理,基本原则是:不能让一些函数承担太多任务,否则该函数过分复杂;中断函数不能承担太多任务,执行时间不能太长,否则会影响主函数运行。如图6-2图6-3所示为3个函数的程序流程图。图6-2TI中断服务函数的程序流程图图63TO中断服务函数的程序流程图3.智能往返小车的程序清单:car.C文件的程序清单include"tgl2864.hinclude“geykey.hsbitsbitSbitK1=P6K2=P7FM=P37电机控制/电机控制蜂鸣器sbitLEDO=P2''0;站台灯LEDO-LED5sbitLEDl=P2''1;sbitLED2=P2''2;sbitLED3=P2''3;sbitLED4=P2''4;sbitLED5=P2''5;sbitLED7=P2''7;电源灯ucharmm;电机运行状态标志WdefineMzKl=O,K2=l,mm=l电机正转时继电器状态,mm:电机运行状态1:正转defineMfKl=I,K2=0,mm=2电机反转时继电器状态,mm:电机运行状态2:反转definetingK1=K2=1,mm=0电机停转时继电器状态,mm:电机运行状态0:停转uinttime;uintii;externucharkeynum;ucharplace;ucharstop;uchardirection;ucharfunction;电机运行时间总长度20s普通计时/目地点站点系统运行方向(去,回)系统运行状态/0/:系统初始化状态/1/:系统设置状态/2/:系统运行状态/3/:系统暂停状态bitMS;模式标志bitBACK;运行返回标志bitJSl,JS2;/JS1:自动时启动和返回时的3秒计时标志/JS2:系统电机整个的运行时间标志/defineDEBUG根据蜂鸣器驱动电平选择亚龙YL-236主机模块中蜂鸣器高电平鸣叫,不定义DEBUGvoiddidi(ucharx)蜂鸣器函数x:鸣叫时间(ttifdefDEBUG/若低电平时,蜂鸣器叫FM=I;先自激蜂鸣器(安全措施,可去掉)nop();FM=O;delayms(100*x);叫的时间FM=I;#else/若高电平时,蜂鸣器叫FM=O;/先自激蜂鸣器(安全措施,可去掉)_nop_();FM=I;delayms(100*x)叫的时间FM=O;WendifvoidmsDisplay(ucharx)模式显示x:在那页显示(If(MS=O)/手动(writeHan(x,84,0,hanzi_ZM15);else/自动(writeHan(x,84,0,hanzi_ZM14);voiddjDisplay()电机状态显示(if(mm=0)/电机停时显示暂停(writeHan(5,84,0,hanzi_ZM21);writeHan(5,100,0,hanzi_ZM22);if(mm=l)电机正转时显示前进(writeHan(5,84,0,hanzi_ZM17);writeHan(5,100,0,hanzi_ZM18);)if(mm=2)/电机反转时显示后退(writeHan(5,84,0,hanzi_ZM19);writeHan(5,100,0,hanzi_ZM20);voidWeiDisplayO运行中小车位置显示if(mm=l)电机正转(WriteAscii(3,84,O,shuzi_ZMplace);WriteAscii(3,92,O,shuzi_ZM12);WriteAscii(3,1OO,O,shuzi_ZMplace+l);if(mm=2)/电机反转(WriteAscii(3,84,O,shuzi_ZMplace);WriteAscii(3,92,O,shuzi_ZM12);WriteAscii(3,100,O,shuzi_ZMplace-l);voidStartDisplayO到了起始站显示(WriteAscii(3,84,O,shuzi_ZMplace);WriteAscii(3,92,O,shuzi_ZM10);WriteAscii(3,100,O,shuzi_ZM10);voidPauseDisplayO(writeHan(5,84,O,hanzi_ZM21);系统暂停时显示暂停writeHan(5,100,O,hanzi_ZM22);voidLedDisplay(ucharx)LED灯显示函数x:让LED0-LED5中的一个灯亮uchary,i;y=0xfe;/y为LED亮的2进制码for(i=0;i<x;i+)y=y<<lI0x01;/Oxfe:LEDO亮/Oxfd:LEDI亮/Oxfb:LED2亮/Oxf7:LED3亮/Oxef:LED4亮/Oxdf:LED5亮P2=y&(P2|0x3f);P2=y输出LED码,&(P20x3f)不影响P2.6,P2.7输出正常输出不影响电机状态voidmenul()界面1欢迎使用往返小车,系统初始化界面(Write_24x24(0,16,0,hanzi240);Write_24x24(0,40,0,hanzi24l);Write_24x24(0,64,0,hanzi242);Write_24x24(0,88,0,hanzi243);Write_24x24(4,16,0,hanzi244);Write_24x24(4,40,0,hanzi245);Write_24x24(4,64,0,hanzi246);Write_24x24(4,88,0,hanzi247);voidmenu2()设置界面(WriteHan(2,32,0,hanzi_ZM0);WriteHan(2,48,0,hanzi_ZMl);writeHan(2,64,0,hanzi_ZM2);writeHan(2,80,0,hanzi_ZM3);writeHan(4,12,0,hanzi_ZM4);writeHan(4,28,0,hanzi_ZM5);writeHan(4,44,0,hanzi_ZM6);writeHan(4,60,0,hanzi_ZM7);WriteAscii(4,76,0,shuzi_ZMll);writeHan(4,100,0,hanzi_ZM16);msDisplay(4);模式显示)voidmenu3()(writeHan(1,12,0,hanzi_ZM4);writeHan(1,28,0,hanzi_ZM5);writeHan(1,44,0,hanzi_ZM6);writeHan(1,60,0,hanzi_ZM7);WriteAscii(1,76,0,shuzi_ZMll);writeHan(1,100,0,hanzi_ZM16);msDisplay(1);模式显示writeHan(3,12,0,hanzi_ZM8);writeHan(3,28,0,hanzi_ZM9);writeHan(3,44,O,hanzi_ZM10);writeHan(3,60,O,hanziZMll);WriteAscii(3,76,O,shuzi_ZMll);WriteAscii(3,84,O,shuzi_ZMplace);WeiDisplayO;writeHan(5,12,O,hanzi_ZM8);writeHan(5,28,O,hanzi_ZM9);writeHan(5,44,O,ha