单片机作息时间控制.doc_第1页
单片机作息时间控制.doc_第2页
单片机作息时间控制.doc_第3页
单片机作息时间控制.doc_第4页
单片机作息时间控制.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

作息时间控制器 张舟 申文锋 邹坚单片机作息时间控制器姓 名:张舟 申文锋 邹坚 摘要:本作息时间控制器主要是由单片机及其基本外围电路组成。单片机使用C51单片机。外围电路主要有晶振,复位电路,数码显示器,按键电路等组成。通过44键盘外部输入控制信号,经单片机处理对数码管显示时钟,可对数码管时钟设置,删除,查询定时时间点,从而达到作息时间控制的功能。目录1系统设计41.1 设计要求41.2 系统设计方案预想42.单元硬件电路设计43单元软件实现74系统设计及调试过程105结论116附录(详细程序)121 系统设计1.1 设计要求1、用单片机作息时间控制器;2、用四位数码管显示实时钟(时、分,24小 时制、12小时),有秒闪,小时十位有零 消隐;3、可用数字键或+、- 键校时(可快速+、-) 被校位(时、分)闪烁;4、作息时间可设定(最多16个时间点),可任意查询、添加、删除;5、设定时间到发出提示音(5秒),时钟显示闪烁 。1.2 系统设计思路此次训练有硬件和软件两部分的设计,而且各个部分都比较容易出错,所以在制作时应注意让硬软件能分别调试,因此决定先做硬件部分,连接好后,用简单程序测试硬件电路。若检测无误,再逐步设计程序,并且也应注意功能渐进,不能一口吃,急于求成往往导致失败和无奈。2. 单元硬件电路设计硬件框图如下:共有44键盘,单片机外围电路(复位电路,P0,P1,P2口上拉电阻),和数码管显示电路3个印制电路板。键盘电路如下:键盘接口电路用P1口接成44结构,把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,经过比对之后就可知道是哪个键被按下。程序读键盘按下与否的时候用的是“二次反转法”扫描法。例如其中KEY6的扫描码为11011011 = 0xDB,以此类推各个键的扫描码。键值如下:数码管电路如下:数码管是共阴极,单片机显示为先位选,再段选,扫描显示,由于视觉暂留,对人眼不形成闪烁显示。位驱动代码分别为0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80。单片机接口如下:如图所示,单片机的封装图,本课题中用到单片机的P0,P1,P2口,外围电路分别在P0,P1,P2口上加了上拉电阻,在第9个引脚上加了复位电路,18和19引脚为晶振。外接晶振电路。RST端应外接复位电路。P0,P2口接数码管的段码和位码的显示端,P1口接键盘读取输入口。P0,P1,P2在布线的时候应紧贴硬质板,排线整齐,以减少干扰。引脚介绍VCC : 电源GND: 地P0 口:P0 口是一个 8 位漏极开路的双向 I/O 口。作为输出口,每位能驱动 8 个 TTL 逻 辑电平。对 P0 端口写“1”时,引脚用作高阻抗输入。 当访问外部程序和数据存储器时,P0 口也被作为低 8 位地址/数据复用。在这种模式下, P0 具有内部上拉电阻。在 flash 编程时,P0 口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1 口:P1 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p1 输出缓冲器能驱动 4 个 TTL 逻辑电平。对 P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 此外,P1.0 和 P1.2 分别作定时器/计数器 2 的外部计数输入(P1.0/T2)和时器/计数器 2 的触发输入(P1.1/T2EX),具体如下表所示。在 flash 编程和校验时,P1 口接收低 8 位地址字节。引脚号第二功能P1.0T2(定时器/计数器 T2 的外部计数输入),时钟输出P1.1T2EX(定时器/计数器 T2 的捕捉/重载触发信号和方向控制)P1.5MOSI(在系统编程用)P1.6MISO(在系统编程用)P1.7SCK(在系统编程用)P2 口:P2 口是一个具有内部上拉电阻的 8 位双向 I/O 口,P2 输出缓冲器能驱动 4 个 TTL 逻辑电平。对 P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 在访问外部程序存储器或用 16 位地址读取外部数据存储器(例如执行 MOVX DPTR) 时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送 1。在使用8 位地址(如 MOVX RI)访问外部数据存储器时,P2 口输出 P2 锁存器的内容。 在 flash 编程和校验时,P2 口也接收高 8 位地址字节和一些控制信号。P3 口:P3 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p2 输出缓冲器能驱动 4 个 TTL 逻辑电平。对 P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 P3 口亦作为 AT89S52 特殊功能(第二功能)使用,如下表所示。在 flash 编程和校验时,P3 口也接收一些控制信号。引脚号第二功能P3.0RXD(串行输入)P3.1TXD(串行输出)P3.2INT0(外部中断 0)P3.3INT0(外部中断 0)P3.4T0(定时器 0 外部输入)P3.5T1(定时器 1 外部输入)P3.6WR(外部数据存储器写选通)P3.7RD(外部数据存储器写选通)RST: 复位输入。晶振工作时,RST 脚持续 2 个机器周期高电平将使单片机复位。看门 狗计时完成后,RST 脚输出 96 个晶振周期的高电平。特殊寄存器 AUXR(地址 8EH)上 的 DISRTO 位可以使此功能无效。DISRTO 默认状态下,复位高电平有效。ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低 8 位地址 的输出脉冲。在 flash 编程时,此引脚(PROG)也用作编程输入脉冲。 在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或 时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE 脉冲将会跳过。 如果需要,通过将地址为 8EH 的 SFR 的第 0 位置 “1”,ALE 操作将无效。这一位置 “1”, ALE 仅在执行 MOVX 或 MOVC 指令时有效。否则,ALE 将被微弱拉高。这个 ALE 使 能标志位(地址为 8EH 的 SFR 的第 0 位)的设置对微控制器处于外部执行模式下无效。PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当 AT89S52 从外部程序存储器执行外部代码时,PSEN 在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN 将不被激活。EA/VPP:访问外部程序存储器控制信号。为使能从 0000H 到 FFFFH 的外部程序存储器读取指令,EA 必须接 GND。为了执行内部程序指令,EA 应该接 VCC。在 flash 编程期间,EA 也接收 12 伏 VPP 电压。XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。XTAL2:振荡器反相放大器的输出端。3. 单片机的软件实现(程序附在最后)键盘处理子程序的流程图软件编程上的总体思路是采用中断方式,程序当中定义了很多中断标志,中断标志发出一次中断请求,CPU响应中断后进入中断子程序。根据设计要求程序大概可以分为几大块,有数码管显示程序,有数字加减程序,有作息时间设定,删除,查询程序,发出提示音程序。其中里面的数字加减和作息时间设定,少不了键盘的读取程序。4 系统设计及调试过程4.1 硬件制作首先我们跟据要求用protel软件画出电路原理图,主要由键盘,数码管以及51芯片三部分组成,根据资料我们在板子上加上了复位,晶振和蜂鸣器电路。接下来我们就是根据电路原理图来焊接系统,焊接好基本的硬件电路后,我们就要进行硬件的测试。先测单片机的各个管脚是不是与键盘以及数码管连通。全部确定连通后,我们尝试烧入一个简单的时钟计时程序,自动计时,数码显示和开关改时。通过改变程序中的P口,可分别测试六个数码管,以及16个开关是否能正常工作。4.2 软件测试把程序烧入单片机,连接好键盘和数码显示电路,按键盘键对程序进行调试。键的定义用处如下:Key1:切换分,时,再按下为原正常态。Key4:分或时加,查询时向后查询Key8:分或时减,查询时向前查询Key10:在设定定时状态下删除定时节点Key12:按下存入节点Key13:进入查询定时状态,在按下退出Key16:切换12和24小时制按key1进行时分切换,按下key1进入分调试,按key4对分加,再按key8对分减,再按key1切换到时调试。同样按key4,key8进行加减。Key13进入设定定时状态,此时时钟显示全部清零,然后按key4,key8分别加减,当要求定时的数值再按key12存入数组,此时还是在定时的状态,还可以加入要定时的时间,如果不需要,则同样按key13退出。查询和删除定时节点的时候也要按key13进入定时状态,key4为向后查询,key8为向前查询。Key10为删除定时节点,按key13退出。最后key16为切换12和24小时制。5 结论 这次的课题设计,主要是对我们的一种训练,不仅仅是训练我们硬件电路的设计,还考验我们的单片机编程能力。其实硬件电路的设计要求并不是很高,不过即使如此,在调试过程中我们还是出现了许多问题,接口是最容易焊错的,我们就是由于P0和P2口焊接反了造成数码管显示的错误。排阻也是容易焊错的地方,由于排阻又9个接口,所以要注意不能焊反掉了。在编程的时候,除了对语言和单片机的功能需熟练外,编程的技巧还是至关重要的。一般结构化程序设计方法:自顶向下,逐步细化,模块化设计,模块化编码。这样程序就可以变得逻辑关系清晰,可读性强具有很强的可验证性和可维护性,便于协同合作和软件代码资源的共享。单片机的编程在一开始对我们是一个很大的困难,因为我们一组的同学几乎以前都没接触过单片机的c语言编程,后来花了一个多礼拜的研究,通过网上下载视频,图书馆借书等等的途径,我们终于有所小成,最终编写出这样一个程序,来实现了要求的功能。我觉得我们还需要不断的研究和学习总结,特别是在编程部分,我们还有很多需要提高和改进的部分,我们需要通过不断的实践,我们才能真正在这方面有所收获。6 附件(程序)第22页 共22页#pragma small#include #include #include /包含了_nop_()/*/以下为常量定义/*/键值列表#define Key1 0xE7#define Key2 0xEB#define Key3 0xED#define Key4 0xEE#define Key5 0xD7#define Key6 0xDB#define Key7 0xDD#define Key8 0xDE#define Key9 0xB7#define Key10 0xBB#define Key11 0xBD#define Key12 0xBE#define Key13 0x77#define Key14 0x7B#define Key15 0x7D#define Key16 0x7E/*/以下为函数声明/*void key_scan(void);void clock24(void);void clock12(void);void disp_h(void);void disp_m(void);/*/以下为变量等定义/*/代码(MOVC结构)code unsigned char led_seg =/LED显示段码0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x88,0x8c;/A&Pcode unsigned char led_seg_fan=/LED显示段码_反0xc0,0xf9,0x64,0x70,0x59,0x52,0x42,0xf8,0x40,0x50,0x80,0xb9,0x24,0x30,0x19,0x12,0x02,0xb8,0x00,0x10;code unsigned char led_loc =/LED显示位码0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;unsigned char alarm_m16=/闹钟时间点99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99;unsigned char alarm_h16=99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99;/-/变量定义unsigned char disp_buf8;/显示缓存第0位为最低位unsigned char disp_cnt;/显示刷新位置计数,08unsigned char cnt_2500us,cnt_100ms,cnt_500ms;unsigned int cnt_1s,cnt_800ms;cnt_5s;/定时器计数单元unsigned char s_buf;/秒寄存器unsigned char m_buf;/分寄存器unsigned char h_buf;/小时寄存器unsigned char m_tmp;/分暂存器unsigned char h_tmp;/小时暂存器unsigned char key_buf;/键值缓存unsigned char status;/状态字unsigned char status_buf;/-/位操作标志定义bdata unsigned char flag1;/为标志集合1sbit flag_2500us=flag10;/2500us定时器标志sbit flag_100ms=flag11;/100ms定时器标志(键延迟)sbit flag_500ms=flag12;/500ms定时器标志sbit flag_1s=flag13;/1s定时器标志sbit key_press=flag14;/键已被按下标志sbit key_acpt=flag15;/键值已接受标志sbit a=flag16;/交替标志sbit flag_800ms=flag17;sbit P3_7=P37;bdata unsigned char flag2;sbit b=flag20;sbit flag_5s=flag21;/*/以下为子程序模块/*void Time_0(void) interrupt 1/T0中断(定时中断)if(+cnt_2500us8)/2.5ms基础定时器cnt_2500us=0;P2 =0x00;P0 =disp_bufdisp_cnt&0x07;P2 =led_locdisp_cnt&0x07;disp_cnt+;/-if(!flag_100ms)/100ms定时器if(+cnt_100ms39)cnt_100ms=0;flag_100ms=1;/-if(!flag_500ms)/500ms定时器if(+cnt_500ms199)cnt_500ms=0;flag_500ms=1;/-if(!flag_800ms)/500ms定时器if(+cnt_800ms319)cnt_800ms=0;flag_800ms=1;/-if(!flag_5s)if(+cnt_5s1999)cnt_5s=0;flag_5s=1;/-if(!flag_1s)/1s定时器if(+cnt_1s399)cnt_1s=0;flag_1s=1;/2.5ms基础定时器结束/*/键扫描子程序void key_scan(void)P1 =0x0f; /读键if(P1|0xf0)=0xff)/是否有键按下/无键按下key_press=0;/清键已被按下标志key_acpt=0;/清键值已接受标志else/有键按下if(!key_press)/是否已置键已被按下标志key_press=1;/置键已被按下标志flag_100ms=0;/置100ms键延迟标志elseif(flag_100ms)/100ms键延迟是否到if(!key_acpt)/键值是否被接受key_buf =P1&0x0f;/读低4位P1 =0xf0;/读高4位key_buf=(P1&0xf0)|key_buf;/接受键值key_acpt=1;/置键值已接受标志/*/时钟子程序void clock24(void)if(flag_1s)flag_1s=0;if(s_buf59)s_buf+;elses_buf=0;if(m_buf59)m_buf+;elsem_buf=0;if(h_buf23)h_buf+;elseh_buf=0;if(flag_500ms)flag_500ms=0;if(a=0)disp_buf1=led_segh_buf%10+10;disp_buf2=led_seg_fanm_buf/10+10;a=1;elsedisp_buf1=led_segh_buf%10;disp_buf2=led_seg_fanm_buf/10;a=0;if(h_buf/10)disp_buf0=led_segh_buf/10;elsedisp_buf0=0xff;disp_buf3=led_segm_buf%10;disp_buf4=led_segs_buf/10;disp_buf5=led_segs_buf%10;disp_buf6=0xff;void clock12(void)if(flag_1s)flag_1s=0;if(s_buf59)s_buf+;elses_buf=0;if(m_buf59)m_buf+;elsem_buf=0;if(h_buf11)disp_buf6=led_seg21;elsedisp_buf6=led_seg20;/*/小时,分钟显示void disp_h(void)if(status_buf=0)if(h_buf/10)disp_buf0=led_segh_buf/10;elsedisp_buf0=0xff;disp_buf1=led_segh_buf%10;else if(status_buf=1)if(h_buf%12/10=1|h_buf%12=0)disp_buf0=led_seg1;elsedisp_buf0=0xff;if(h_buf%12=0)disp_buf1=led_seg2;elsedisp_buf1=led_segh_buf%12%10;if(h_buf11)disp_buf6=led_seg21;elsedisp_buf6=led_seg20;void disp_m(void)disp_buf2=led_seg_fanm_buf/10;disp_buf3=led_segm_buf%10;/*/以下为主程序/*void main(void)unsigned char i;unsigned char j;/-/程序初始化PCON=0x00;IE=0x00;/禁止全部中断IP=0x00;/默认优先级TH1=0xFD;/主频11.0592MHz,波特率=9600TL1=0xFD;TH0=0x00;/主频11.0592MHz,定时器0每秒3600次中断TL0=0x00;/SCON=0x50;/UART:9600/N/8/1TMOD=0x22;/设定时器0为8位自动重装载TCON=0x50;/启动定时器,INT0、INT1电平触发EA=1;/中断总允许控制位/EX0=1;/允许外部中断0ET0=1;/允许T0中断/EX1=1;/允许外部中断1/ET1=1;/允许T1中断/ES=1;/允许UART中断/EX2=1;/允许外部中断2/TI=0;/RI=0;flag1=0x00;/位标志集合1flag2=0x00;key_buf=0;/键值缓存s_buf=0;m_buf=0;h_buf=0;status =0;/起始状态字a=0;P3_7=1;/disp_buf0 =led_segstatus;for(i=1;i8;i+)/开机显示缓存初始化disp_bufi =0xff;for(i=0;i0xe8;i+)/开机延迟for(j=0;j0xff;j+);i=0;j=0;/-/主程序开始while(1)key_scan();/状态机处理:switch(status)/状态处理case 0:/0状态,24小时制时钟clock24();b=1;if(h_buf=alarm_hj&m_buf=alarm_mj)status_buf=0;status=10;flag_5s=0;else if(j=15)j=0;elsej+;switch(key_buf)case Key16:status=1;break;case Key3:status_buf=0;status=2;break;case Key5:status_buf=0;status=8;h_tmp=h_buf;m_tmp=m_buf;break;key_buf|=0xff;/清键值break;case 1:/1状态,12小时制时钟clock12();b=1;if(h_buf=alarm_hj&m_buf=alarm_mj)status_buf=1;status=10;flag_5s=0;else if(j=15)j=0;elsej+;switch(key_buf)case Key16:status=0;break;case Key3:status_buf=1;status=2;break;case Key5:status_buf=1;status=8;h_tmp=h_buf;m_tmp=m_buf;break;key_buf|=0xff;/清键值break;case 2:/2状态,调小时switch(key_buf)/调整case Key1:if(flag_800ms)status=4;elseif(h_buf0)h_buf-;elseh_buf=23;break;case Key3:status=3;break;case Key6:status=3;break;if(flag_500ms)/闪烁flag_500ms=0;if(a=0)disp_buf0=0xff;disp_buf1=0xff;a=1;elsedisp_h();a=0;key_buf|=0xff;/清键值 break;case 3:/3状态,调分switch(key_buf)case Key1:if(flag_800ms)status=6;elseif(m_buf0)m_buf-;elsem_buf=59;break;case Key3:status=status_buf;break;case Key6:status=9;break;if(fl

温馨提示

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

评论

0/150

提交评论