- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章 定时开关控制器 定时开关控制器广泛应用于日常生活与工业生产中的负载电源的通断,比如,传统的大容量电热水器的加热时间一般都比较长,如果热水器一直开着,则会一直耗能耗电,而通过定时开关控制器来设定其电源的通断时间可有效解决这些问题,使电热水器使用起来更加舒适省电。通过本项目的学习进一步掌握单片机定时器/计数器和中断的使用。 5.1 任务描述 5.2 电路设计 5.3 软件设计 5.1 任务描述 用单片机实现电源开关控制,可以由人通过按键来设定负载电源的开/关时间,并且通过显示器观察时间,达到定时开关机的目的,实物图如图5.1所示。 应用AT89C51单片机为核心,设计具备按键功能和数码管显示功能的外围硬件电路,以便控制器能够在设定的开关时刻控制输出继电器的动作,进而控制负载电源的启闭,并完成软件程序设计。可以实现电源的直接启动/关闭;也可以通过按键设置负载电源的启动时间,最大预约时间为12小时。 开始键:按下该键,电源接通。 关闭键:按下该键,电源断。 预约键:第一次按下该键,可以对电源的接通时间进行小时调整;第二次按下该键,可以对电源的接通时间进行分钟调整。 加一键:按下该键,调小时时间加一,最大值到11;或调分钟时间加一,最大值到59。 减一键:按下该键,调小时时间减一,最小值到0;或调分钟时间减一,最小可值到0。 预留键:本任务中,该键预留,用户可自定义。 显示功能 按键指示灯:只要有按键按下,该指示灯均会点亮。 开关电源指示灯:负载电源处于通的状态,该灯点亮;否则1S闪烁。 四位数码管:前两位为时,后两位为分。上电即显示“----”;预约调时前两位闪烁,预约调分后两位闪烁。预约时间内倒计时显示。负载电源通断均显示“----”。 负载电源通断功能在本项目中,需要实现多个按键的输入识别与控制,以及实现按秒计数、显示的显示控制方法。 为了实现功能要求,选用AT89C51作为电路的控制核心,根据设计的总体要求划分出各功能电路块,其系统组成方框图如图5.2。 5.2 电路设计 根据设计要求,选用AT89C51作为电路的控制核心,单片机的主要引脚设计选用如图5.3所示。该图中,已经包含了时钟电路、复位电路作为单片机的最小系统。其中,P0.7—P0.0作为四位七段数码管的段码输出端,P1.3—P1.0用作位选输出端;P2.5—P2.0及P3.2用作键盘控制输入端;P3.6为继电器控制输出端。 5.3软件设计 参考程序如下: /*定时开关控制器。按下KEYON键,继电器接通,如设定预约时间,则在预约时间到达后接通;按下KEYOFF键,继电器断;第一次按下KEYSET,调小时、数码管前两位闪烁;第二次按下KEYSET,调分钟、数码管后两位闪烁;按下KEYINC键,小时/分钟加一;按下KEYDEC键,小时/分钟减一;继电器接通时,指示灯点亮,否则1s闪烁*/ #include reg51.h #define uchar unsigned char #define uint unsigned int sbit KEYON=P2^0; sbit KEYOFF=P2^1; sbit KEYSET=P2^2; sbit KEYINC=P2^3; sbit KEYDEC=P2^4; sbit KEYFREE=P2^5; sbit POWER=P3^6; sbit LED=P3^3; uchar code dispcode[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f,0x40};//0-9 字型码 uchar data disbuf[]={0,0,0,0}; //显示缓冲区 uchar hour,min; bit Onflag,flag; uchar Setflag; void delay(uchar); //延时函数 void init(void); //初始化函数 uchar GetKeyNum(); //求键号 void Keyprocess(uchar); //按键处理函数 void caculate(); //计时函数 void display(); //显示函数 void main(void) { init(); P1=0x00; while(1) display(); } void init(void) // 定时器0、 1,外部中断0初始化 { TMOD = 0x11; // 定时器0 ,工作模式1, 16位定时方式 TH0=(65536-50000)/256; //设定定时初值高八位 TL0=(65536-50000
文档评论(0)