《基于51单片机的四路定时控制器设计报告--本科毕业设计论文.doc》由会员分享,可在线阅读,更多相关《基于51单片机的四路定时控制器设计报告--本科毕业设计论文.doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、河南理工大学单片机应用与仿真训练设计报告四路定时控制器姓 名: 范鹏超 学 号: 311108001309 专业班级: 电仪12- 2班 指导老师: 荆鹏辉 所在学院:电气工程与自动化学院 2015年1月13日 目录目录1摘要21 概述31.1 单片机的电子技术特征31.2 四路定时控制器基本功能31.3 系统原理31.4 实际应用32 系统总体方案及硬件设计32.1 系统总体设计框架结构32.2系统硬件电路42.3 系统硬件总电路63软件设计64 Proteus软件仿真75课程设计体会7参考文献:8附1:源程序代码9摘要 近年来,科学技术发展很快,单片机的使用也越来越多。我们在大学也学到了很
2、多关于单片机的知识,也做了很多单片机实验。单片计算机即单片微型计算机。(single-chip microcomputer),是集cpu,ram,rom,定时,计数和多种接接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。而c语言已成为当前举世公认的高效简洁又贴近硬件的编程语言之一。c语言现已成为专业化的单片机上的实用高级语言。而且由于开发速度、软件质量结构化、可维护性方面的原因,使c语言渐渐有取代汇编的趋势。这次我们做四路定时控制器作为微机原理与单片机的课程设计。 四路定时控制器主要应用于定时控制四个回路的电源通断。四路定时器的设计背景是单片机的电子技术特征以
3、及应用。本系统采用的是STC10F08XE为中心器件来设计四路定时器的。系统使用性强,操作简单,扩展性强。设计主要包括硬件的设计和软件的设计。一个完整的四路定时器相当于一个简单的单片机系统,该系统由四路定时器设置电路,单片机,显示电路等构成。单片机是集成IC芯片,只需要根据实际设计要求选型。其他部分都需要根据应用要求和性能指标自行设计。设计时,首先设置时间和线路,然后开始计时,在达到设定时间的时候指示灯闪烁。 该四路定时控制器实现的功能是以当前时间为基准,以24小时为周期,可以任意设定哪个回路于某时刻开,到某时刻关。如可以设置第一个回路在8:30-11:30开,14:30-18:00开,其他时
4、间段为关。能够通过按键任意设置某回路某时间段的开关状态,可以利用数码管直接显示。整个系统通过软硬件的协调工作,具有读取方便、显示直观、功能多样、电路简洁、成本低廉、操作安全等诸多优点,具有广阔的市场前景,尤其在智能化家用电器和办公自动化设备等领域。1 概述1.1 单片机的电子技术特征单片机是将CPU、RAMROM定时器/计数器以及输入输出(I/O)接口等计算机的主要部件集成在一块的集成电路芯片,作为微机系统它还可以实现模/数转换、脉宽调制、计数器捕获/比较逻辑、高速I/O口和WDT各种控制功能。1.2 四路定时控制器基本功能 四路定时控制器是指应用定时器的功能控制四个回路的通断状况,同时可以用
5、按键来设置每个通路的通断以及通断的时间和周期,利用定时器来控制单片机IO口的高低电平来间接控制继电器的通断。1.3 系统原理采用STC10F08XE单片机为控制核心,基于STC10F08XE单片机所具备的的计数功能,达到实时时钟的制作,并通过四位共阴极数码管将时间直观的显示出来。可以利用按键输入功能对显示时间进行调整。其共设置了四个定时通道,每个定时通道都是相互独立的。四个定时通道可以分别设置多个时间段的开关状态,每个通道都可以通过I/O口输出信号对电磁继电器进行控制,通过控制电磁继电器的通断进一步控制继电器所连接的其他电路的开关状态。充分利用了弱电控制强电的效果。1.4 实际应用被广泛地应用
6、在各种领域。例如,用来作家用电器的定时控制器;在办公室中用作磁盘驱动、打印机、复印机、电话的控制;它还可以作为电子秤、收款机、仓储安全检测系统、空气调节系统等冷冻保鲜系统等的专用系统的控制器;在工业中,像工业过程控制、过程监制以及机电一体化等控制系统;它还可以构成一些智能仪表与集成智能传感器传统的控制器等。2 系统总体方案及硬件设计2.1 系统总体设计框架结构数码管电路按键电路继电器电路图1 系统总体设计框架四路定时控制系统总体设计框架结构如图1所示。2.2系统硬件电路1) 时钟电路设计图2 时钟的电路时钟电路由振荡器及定时发生器和地址锁存允许信号ALE组成,如图2所示。所用的时钟电路用的是1
7、1.0592Mhz的晶振,它的振荡周期约为0.0833s,时钟周期是1/6s,机器周期是1s2)按键电路设计图3 按键电路原理图采用2x3键盘扫描,如图3所示,使用每一个按键。3)数码管显示电路 图4 数码管显示电路 显示块是由若干发光二极管组合而成的,一般的“8”字型显示块由a、b、c、d、e、f、g、h8个发光二极管组成,GND接1时均不亮,字位输出口和字形输出口采用高电压驱动,如图4所示。4)继电器电路1. 继电器的基本工作原理:继电器(是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制
8、系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护等作用。 图5 继电器工作原理图本次试验使用了电磁继电器,原理图如图5所示,电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而生生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这样吸合、释放,从而达到了在
9、电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。继电器一般有两股电路,为低压控制电路和高压工作电路。2.3 系统硬件总电路图6 系统硬件仿真电路图3软件设计图7 系统软件设计的步骤4 Proteus软件仿真图8 Proteus软件仿真5课程设计体会 本次课程设计基本结束,回想这一过程,真是困难重重,但是也学到很多。首先是实验程序,刚开始一片茫然,不知道该如何开始。在网上搜到部分资料后,经过和宿舍同学探讨学习后开始有点眉目,最后参考部分材料后得出了最终程序。其次,在焊接电路板
10、时,出现了元器件焊反的情况,但在同学的帮助下成功了。最后,在Protues仿真实验中有出现数码管显示数字成零不断跳动,而且LED灯自动跳变,相当于是中断不停执行、判断键值,特别不稳定的情况。但经过大量的修正最终正常。 虽然这次实验没有创新,但是也是自己动手查资料,修改程序,达到了实验要求。通过本次课程设计,学到了很多关于单片机的知识,我也懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。有时,只有经过自己亲手试验,才能更深层次的懂得实验原理和每部分电路的功能。我也很
11、感谢教育过我的老师和周围同学,在遇到困难的时热情的帮助我度过难关,并让我学到了很多。 此次课程设计,我学到了很多,对以后的学习生活都有很大帮助。今后我也会更加注重理论与实际相结合,多动手,多思考,全面提高自己的能力。参考文献:1余发山,王福忠,杨凌霄,王莉。微机原理与单片机接口技术.北京:煤炭工业出版社。2013.8.2 左金生.电子与模拟电子技术M.北京:电子工业出版社.2004:105-131.3 尹勇.单片机开发环境Vision2的开发指南M. 北京:北京航空航天大学出版社,2004:173-199.4 张俊谟.单片机中级教程-原理与应用. 北京:北京航空航天大学,2006.5 霍孟友.
12、单片机原理与应用.北京:机械工业出版社,2003.附1:源程序代码#include#include#define uint unsigned int/*0216-1*/#define uchar unsigned char /*028-1*/#define N 46080/*N=50000*f0/12,定时50ms*/#define M 20/* 定时M*0.05s */uint shi,fen;#define num3(X2) (X2)/10)#define num2(X2) (X2)%10)#define num1(X1) (X1)/10)#define num0(X1) (X1)%10)
13、sbit W1=P03;sbit W2=P02;sbit W3=P01;sbit W4=P00;sbit led=P35;sbit H1=P36;sbit H2=P37;sbit huiluA=P20;sbit huiluB=P21;sbit huiluC=P22;sbit huiluD=P23;sfr P1M1=0x91;/和后面的main函数中的 sfr P1M0=0x92;/P1M1 P1M0合在一起增加亮度sfr P2M1=0x95;sfr P2M0=0x96;uint num/*T0_timer*/,num0/*T0_timer*/,num1,key/*matrixkeyscan*/
14、; /定义全局变量uchar k2=0,k3=0,k5=1,k6=0;/按键计数uchar A0_shi=12,A0_fen=30,A1_shi=13,A1_fen=30,B0_shi=12,B0_fen=30,B1_shi=13,B1_fen=30,C0_shi=12,C0_fen=30,C1_shi=13,C1_fen=30,D0_shi=12,D0_fen=30,D1_shi=13,D1_fen=30;/继电器定时起点、终点uchar code duanxuan=0x3f,/*显示0*/0x06,/*显示1*/0x5b,/*显示2*/0x4f,/*显示3*/0x66,/*显示4*/0x6
15、d,/*显示5*/0x7d,/*显示6*/0x07,/*显示7*/0x7f,/*显示8*/0x6f,/*显示9*/0x77,/*显示A*/0x7c,/*显示B*/0x39,/*显示C*/0x5e,/*显示D*/0x79,/*显示E*/0x71/*显示F*/;void delay_ms(uint xms) /*延时子函数程序*/ uint i,j;for(i=xms;i0;i-) for(j=250;j0;j-);/*该层循环延时约1ms*/*/typedef unsigned char BYTE;typedef unsigned int WORD;/*Declare SFR associate
16、d with the IAP*/sfr IAP_DATA= 0xC2;/Flash data registersfr IAP_ADDRH= 0xC3;/Flash address HIGHsfr IAP_ADDRL= 0xC4;/Flash address LOWsfr IAP_CMD= 0xC5;/Flash command registersfr IAP_TRIG= 0xC6;/Flash commandtriggersfr IAP_CONTR= 0xC7;/Flash control register/*Define ISP/IAP/EEPROM command*/#define CMD
17、_IDLE0/Stand-By#define CMD_READ1/Byte-Read#define CMD_PROGRAM2/Byte-Program#define CMD_ERASE3/Sector-Erase/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/#define ENABLE_IAP0x80/SYSCLK30MHz/#define ENABLE_IAP0x81/SYSCLK24MHz/#define ENABLE_IAP0x82/SYSCLK20MHz #define ENABLE_IAP0x83/SYSCLK12MHz
18、/#define ENABLE_IAP0x84/SYSCLK 6MHz/#define ENABLE_IAP0x85/SYSCLK 3MHz/#define ENABLE_IAP0x86/SYSCLK 2MHz/#define ENABLE_IAP0x87/SYSCLK8;/Set ISP/IAP/EEPROM address highIAP_TRIG = 0x5a;/Send trigger command1(0x5a)IAP_TRIG = 0xa5;/Send trigger command2(0xa5)_nop_();/MCU will hold here until ISP/IAP/E
19、EPROM/operation completedat = IAP_DATA;/Read ISP/IAP/EEPROM dataIapIdle();/close ISP/IAP/EEPROM functionreturn dat;/Return Flash data/*-Programe one byte to ISP/IAP/EEPROM areaInput: addr(ISP/IAP/EEPROM address)dat(ISP/IAP/EEPROM data)Output:-*/void IapProgramByte(WORD addr, BYTE dat)IAP_CONTR = ENA
20、BLE_IAP;/Open IAP function,and set wait timeIAP_CMD= CMD_PROGRAM;/Set ISP/IAP/EEPROM PROGRAM commandIAP_ADDRL = addr;/Set ISP/IAP/EEPROM address lowIAP_ADDRH = addr8;/Set ISP/IAP/EEPROM address highIAP_DATA = dat;/Write ISP/IAP/EEPROM dataIAP_TRIG = 0x5a;/Send trigger command1(0x5a)IAP_TRIG = 0xa5;/
21、Send trigger command2(0xa5)_nop_();/MCU will hold here until ISP/IAP/EEPROM/operation completeIapIdle();/*-Erase one sector areaInput: addr (ISP/IAP/EEPROM address)Output:-*/void IapEraseSector(WORD addr)IAP_CONTR = ENABLE_IAP;/Open IAP function,and set wait timeIAP_CMD= CMD_ERASE;/Set ISP/IAP/EEPRO
22、M ERASE commandIAP_ADDRL = addr;/Set ISP/IAP/EEPROM address lowIAP_ADDRH = addr8;/Set ISP/IAP/EEPROM address highIAP_TRIG = 0x5a;/Send trigger command1(0x5a)IAP_TRIG = 0xa5;/Send trigger command2(0xa5)_nop_();/MCU will hold here until ISP/IAP/EEPROM/operation completeIapIdle();/*数码管显示函数*/void displa
23、ys(uchar X2,X1) W1=0;P1=duanxuannum0(X1);delay_ms(5);W1=1;P1=0x00;/消影 W2=0;P1=duanxuannum1(X1);delay_ms(5);W2=1;P1=0x00; W3=0;P1=duanxuannum2(X2)|0x80;delay_ms(5);W3=1;P1=0x00; W4=0;P1=duanxuannum3(X2);delay_ms(5);W4=1;P1=0x00;/*定时器初始化*/void T_initialize()/ EA=1; /开放ALL中断允许Enable ET0=1; /开放T0中断允许Ena
24、ble*/ TMOD=0x11; /定时器0、1,工作方式1,仅受TCON中TR控制*/ TH0=(65536-N)/256; TL0=(65536-N)%256; ET1=1; /开放T1中断允许Enable*/ TH1=(65536-N)/256; TL1=(65536-N)%256; TR0=1; /定时器计时开始/*/*时钟实时时间、定时段设置(显示放后边)*/void clk_weixuan()/switch(k5)case 1:switch(k2)case 0:;break;case 1:if(key=1)A0_shi+;if(A0_shi=24)A0_shi=0;/*shi=02
25、3*/ if(key=4)if(A0_shi=0)A0_shi=24;A0_shi-;/*shi=230*/break; case 2:if(key=1)A0_fen+;if(A0_fen=60)A0_fen=0;/*fen=059*/ if(key=4)if(A0_fen=0)A0_fen=60;A0_fen-;/*fen=059*/break;case 3:if(key=1)A1_shi+;if(A1_shi=24)A1_shi=0;/*shi=023*/ if(key=4)if(A1_shi=0)A1_shi=24;A1_shi-;/*shi=230*/break;case 4:if(k
26、ey=1)A1_fen+;if(A1_fen=60)A1_fen=0;/*fen=059*/ if(key=4)if(A1_fen=0)A1_fen=60;A1_fen-;/*fen=059*/break;case 5:IapEraseSector(0x0000);IapProgramByte(0x0000,A0_shi);IapProgramByte(0x0001,A0_fen);IapProgramByte(0x0002,A1_shi);IapProgramByte(0x0003,A1_fen);k2=0;break;break;case 2:switch(k2)case 0:;break
27、;case 1:if(key=1)B0_shi+;if(B0_shi=24)B0_shi=0;/*shi=023*/ if(key=4)if(B0_shi=0)B0_shi=24;B0_shi-;/*shi=230*/break; case 2:if(key=1)B0_fen+;if(B0_fen=60)B0_fen=0;/*fen=059*/ if(key=4)if(B0_fen=0)B0_fen=60;B0_fen-;/*fen=590*/break;case 3:if(key=1)B1_shi+;if(B1_shi=24)B1_shi=0;/*shi=023*/ if(key=4)if(
28、B1_shi=0)B1_shi=24;B1_shi-;/*shi=230*/break;case 4:if(key=1)B1_fen+;if(B1_fen=60)B1_fen=0;/*fen=059*/ if(key=4)if(B1_fen=0)B1_fen=60;B1_fen-;/*fen=059*/break;case 5:IapEraseSector(0x0200);IapProgramByte(0x0200,B0_shi);IapProgramByte(0x0201,B0_fen);IapProgramByte(0x0202,B1_shi);IapProgramByte(0x0203,
29、B1_fen);k2=0;break;break;case 3:switch(k2)case 0:;break;case 1:if(key=1)C0_shi+;if(C0_shi=24)C0_shi=0;/*shi=023*/ if(key=4)if(C0_shi=0)C0_shi=24;C0_shi-;/*shi=230*/break; case 2:if(key=1)C0_fen+;if(C0_fen=60)C0_fen=0;/*fen=059*/ if(key=4)if(C0_fen=0)C0_fen=60;C0_fen-;/*fen=590*/break;case 3:if(key=1
30、)C1_shi+;if(C1_shi=24)C1_shi=0;/*shi=023*/ if(key=4)if(C1_shi=0)C1_shi=24;C1_shi-;/*shi=230*/break;case 4:if(key=1)C1_fen+;if(C1_fen=60)C1_fen=0;/*fen=059*/ if(key=4)if(C1_fen=0)C1_fen=60;C1_fen-;/*fen=059*/break;case 5:IapEraseSector(0x0400);IapProgramByte(0x0400,C0_shi);IapProgramByte(0x0401,C0_fe
31、n);IapProgramByte(0x0402,C1_shi);IapProgramByte(0x0403,C1_fen);k2=0;break;break;case 4:switch(k2)case 0:;break;case 1:if(key=1)D0_shi+;if(D0_shi=24)D0_shi=0;/*shi=023*/ if(key=4)if(D0_shi=0)D0_shi=24;D0_shi-;/*shi=230*/break; case 2:if(key=1)D0_fen+;if(D0_fen=60)D0_fen=0;/*fen=059*/ if(key=4)if(D0_f
32、en=0)D0_fen=60;D0_fen-;/*fen=590*/break;case 3:if(key=1)D1_shi+;if(D1_shi=24)D1_shi=0;/*shi=023*/ if(key=4)if(D1_shi=0)D1_shi=24;D1_shi-;/*shi=230*/break;case 4:if(key=1)D1_fen+;if(D1_fen=60)D1_fen=0;/*fen=059*/ if(key=4)if(D1_fen=0)D1_fen=60;D1_fen-;/*fen=059*/break;case 5:IapEraseSector(0x0600);Ia
33、pProgramByte(0x0600,D0_shi);IapProgramByte(0x0601,D0_fen);IapProgramByte(0x0602,D1_shi);IapProgramByte(0x0603,D1_fen);k2=0;break;break;if(k2=0)switch(k3)case 0:TR0=1;break; case 1:if(key=1)shi+;if(shi=24)shi=0;/*shi=023*/ if(key=4)if(shi=0)shi=24;shi-;/*shi=230*/;break; case 2:if(key=1)fen+;if(fen=6
34、0)fen=0;/*fen=059*/ if(key=4)if(fen=0)fen=60;fen-;/*fen=590*/;break;/*矩阵键盘扫描,同时可进行数码管各位的+- */void matrixkeyscan()/如何确定时间设定时数码管显示的数字是否会自动+1 /*当两行H1、H2重新赋值时存在冲突,解决办法为:H1=1时H2=0,H2=1时H1=0或者对P3口进行整体赋值*/ uchar temp; /*扫描第一行*/ H1=0;H2=1;/扫描第一行 temp=P0; temp=temp|0x1f;/读取L1、L2、L3的状态/*判断哪个键摁下*/ if(temp!=0xf
35、f)/判断是否有键摁下 delay_ms(10);/延时 H1=0;H2=1;/扫描第一行/重新读取 temp=P0; temp=temp|0x1f;/读取L1、L2、L3的状态 if(temp!=0xff)/消抖 switch(temp)/判断哪个键摁下 case 0x7f:key=3;k3+;k3=k3%3/*k=02*/; TR0=0/*时间设定时定时器停止*/;break; case 0xbf:key=2;k3=0;k2+;if(k2=1)num1=0;TR1=1;break; case 0xdf:key=1;break; /键1 2 3 分别摁下clk_weixuan();while
36、(temp!=0xff)/按键释放才会跳出循环 H1=0;H2=1;/扫描第一行/重新读取 temp=P0; temp=temp|0x1f;/读取L1、L2、L3的状态 /*扫描第二行*/ H2=0;H1=1;/扫描第二行 temp=P0; temp=temp|0x1f;/读取L1、L2、L3的状态/*判断哪个键摁下*/ if(temp!=0xff)/判断是否有键摁下 delay_ms(10);/延时 H2=0;H1=1;/扫描第二行/重新读取 temp=P0; temp=temp|0x1f;/读取L1、L2、L3的状态 if(temp!=0xff)/消抖 switch(temp)/判断哪个键
37、摁下 case 0x7f:key=6;k6+;if(k6=2)k6=0;break; case 0xbf:key=5;k5+;/*1 2 3 4 */if(k5=5)k5=1;num1=0;TR1=1;/*内次按下K5 都会显示2s的回路(A/B/C/D),故需要打开定时器且计数清零*/break; case 0xdf:key=4;break; /键 4 5 6 分别摁下clk_weixuan();while(temp!=0xff)/按键释放才会跳出循环 H2=0;H1=1;/扫描第二行/重新读取 temp=P0; temp=temp|0x1f;/读取L1、L2、L3的状态 void disp
38、lays_hui() W1=0;P1=duanxuank5+9;delay_ms(5);W1=1;P1=0x00;/消影 W2=0;P1=duanxuank5+9;delay_ms(5);W2=1;P1=0x00; W3=0;P1=duanxuank5+9;delay_ms(5);W3=1;P1=0x00; W4=0;P1=duanxuank5+9;delay_ms(5);W4=1;P1=0x00;void displays_set() W1=0;P1=0x40;delay_ms(5);W1=1;P1=0x00;/消影 W2=0;P1=0x40;delay_ms(5);W2=1;P1=0x00; W3=0;P1=duanxuank5+9;delay_ms(5);W3=1;P1=0x00; W4=0;P1=duanxuank5+9;delay_ms(5);W4=1;P1=0x00;void displays_all()/先优先处理K5 K2按下时的显示问题,再进行正常显示 if(key=5) while(num140)displays_hui();TR1=