基于单片机的多功能定时器毕业设计论文
(此文档为word格式,下载后您可任意编辑修改!)
目录
1 引言 (1)
2 概述 (2)
2.1 定时开关电源插座系统概述 (2)
2.2 本设计方案思路 (2)
2.3 研发方向和技术关键 (3)
2.4 主要技术指标 (3)
3 总体设计 (4)
3.1 可控开关设计的选择 (4)
3.2 时钟信号的实现 (6)
3.3 译码方案的选取 (6)
4 硬件设计 (10)
4.1 可控开关电路 (12)
4.2 电平转换电路 (12)
4.3 单片机系统电路 (14)
4.4 显示电路 (16)
5 软件设计 (17)
5.1 总体方案 (17)
5.2 主程序流图 (17)
5.3 中断模块说明 (18)
6 制作与调试 (19)
6.1 硬件电路的布线与焊接 (19)
6.2 调试 (20)
6.3 改进与扩展 (20)
7 结论 (21)
致谢 (23)
参考文献 (23)
附录 (24)
1.引言
随着电子技术和电源技术的发展,开关电源以体积小、重量轻、功率密度大、集成度高、输出组合便利等优点而成为电子电路电源的首选。定时开关电源插座,即可以定时打开或关掉电源的插座,这样既能省电又方便用户的个性化使用。
2 概述
2.1定时开关电源插座系统概述
本文设计的定时开关电源插座电路系统[1]主要是利用单片机P89V51RD2FN
作为主控制元件,通过外围电路控制可控开关的通断以达到定时开、关的目的。P89V51具有体积小、功能强大、运行速度快、价格低廉等优点,非常适合制作集成度较高的控制电路。通过键盘键入程序控制可控开关和译码器来实现数码管的显示。主板电路包括MCU P89V51 、键盘与显示、输入与输出口、可控开关和稳压等电路组成。
2.2本设计方案思路
本设计实现通过定时电路来控制电源插座开关的通断,和时钟电路的显示为主要目的;以时钟信号的检测,信号控制,信号译码和数据显示为主要设计内容。
定时器是本设计系统中的重点,时间控制器(即定时器)既可以通过纯硬件实现,也可以通过软硬件结合实现,根据时间控制器的核心部件—秒信号的产生原理,通常有四种形式,如下所述。
(1)采用石英钟专用芯片的实现形式
采用石英钟专用芯片的实现的时间控制器,具有实现简单、计时精度高的特点。石英计时芯片比较多,常用的型号有STP5512F、SM5546A和D60400等。如结合利用5512F的2秒输出信号作为秒信号电路的计数脉冲,可实现电子时钟。
(2)采用NE555时基电路的实现形式
采用NE555时基电路或其他振荡电路产生秒脉冲信号,作为秒加法电路的时钟信号或微处理器的外部中断输入信号,可构成时间控制器。由555构成的秒脉冲发生器电路[2]如图1-1所示。输出的脉冲信号Vo的频率f=1.443(Ra+2Rb)*C,可以通过调节这3个参数,使输出Vo的频率为精确的1HZ。但这类定时器精度低,脉冲周期由外接的电阻和电容决定,常用于旋转灯光控制等。
(3)采用单片机常用的时钟芯片
以前,通常采用并行的实时时钟芯片计时、EEPROM作为存储器,但对一些微小型智能控制设备而言,并行实时时钟芯片封装形式大,再加上EEPROM,占用扩展线多,使电路结构很难进一步简化。Dallas公司生产的串行实时时钟芯片DS1302[3]具有实时时钟和静态RAM,采用串行通信,可方便地与单片机接口。除了在工业控制中使用外,还可以应用到一般的时钟计数上。
(4)用软件来实现定时
通常利用单片机或多媒体或PLC内部的定时器,编写大量的源程序来设计,常称为软件定时器。
电子定时器[4]可用一般数字电路搭建而成,一台四位数的定时器要用十多片数字电路组成,电路结构复杂、体积庞大,而且功能有一定的局限性。在进行定时电路设计时,如果需要定时的时间不是很精确且时间较短的话,往往采用555定时集成电路来实现。然而,若需要定时的时间较长(如1小时以上)则采用专用的集成电路定时器比较方便[5],而且使用定时器专用集成电路所设计的应用电路比较简单,同时调试也比较容易。本设计采用单片机作为主硬件电路,外围电路简单,配合软件设计,使用其灵活的编程实现定时,译码和时间显示等,使定时器插座可有更多的扩展功能选择。
2.3 研发方向和技术关键
(1)合理选取定时器方案,提高系统的精度;
(2)交直流电压转换;
(3)多路优先译码器的选取及扩展;
(4)与微机连接进行程序的汇编输入,实现对定时功能的调试;
(5)显示部分中数码管的四位一体共阴接法。
2.4 主要技术指标
(1)具有电子钟功能,显示为四位数
(2)可设定定时起动(开始)时间与定时结束(关断)时间
(3)定时开始,指示灯亮;定时结束,指示灯灭
(4)定时范围可以选择
(5)开关次数:≥2次天
(6)时钟日差:≤±2秒天
(7)工作温度范围:-10o~50o
(8)工作条件:AC220V,10A,50Hz
(9)使用范围:办公室电源开关、实验室电源开关等
(10)插头插座孔型:插头国标三扁型
3 总体设计
单片机虽然种类繁多,但每片单片机内部结构都大同小异,均由控制器、运算器、存储器、输入端口、输出端口等组成。各个厂商制成了多种型号的单片机。任何一种单片机不论功能如何强大,都是通过其IO口来发辉作用的,用户可根据所需来选择单片机的型号,引脚最少从8脚到近百脚的都有。本设计用单片机设计的体积小巧的定时器来控制电源开关插座的通电和断电,并还能作为一台数字钟使用实现时间显示。根据需要选用了一片40条引脚的P89V512FN单片机[6],属于飞利浦80C51系列单片机,带64KB闪存和1024字节RAM。并且P89V51系列单片机内部包含64位FLASH的ISP(在线可编程系统)和IAP(在应用编程)。其设计的几个基本模块如下图3-1,包括:插头插座(孔型),控制开关,电平转换器,单片机系统,显示电路部分。
图3-1 定时开关电源插座的设计原理框图
3.1可控开关设计的选择
本设计中的定时操作是通过可控开关收到外部电路的控制信号后延时通断的。其中延时实现方式分类一般按常规可分为以下几种:a、通电延时;b、接通延时;c、断电延时;d、断开延时;e、(间隔)定时;f、往复延时;g、星三角启动延时;Intel MCS-51 Microcontroller. https://www.360docs.net/doc/715388650.html,IOL_m80c51fbPdfView 4628.=P1^4; 模式控制
sbit operation_button=P1^5;操作控制
sbit inc_button=P3^6;执行加键
sbit dec_button=P3^7;执行减键
sbit s3 = P1^3;
sbit s2 = P1^1;
sbit s1 = P1^2;
sbit s0 = P1^0;
sbit bell= P2^7; 蜂鸣器控制
sbit power_ctrl = P1^7;继电器控制
sbit Clock = P2^2; 时钟口线
sbit DataOut = P2^1; 数据输出口线
sbit ChipSelect = P2^0; 片选口线
******************************************************
******************延时定义****************************
#define Wait1us {_nop_();}
#define Wait2us {Wait1us;Wait1us;}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait30us {Wait8us;Wait8us;Wait8us;Wait4us;Wait2us;}
*********************************************************
******************共阳数码管代码**********************
code unsigned char table[10]
={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char led[4];
unsigned char timer2_tick,mode,operation;
unsigned char flag=0,timer=0,timer_second=0,timer_minute;s=0;跑表时间
int ring_(value);
}
*************************************************************** *****************LED动态扫描程序******************************** void display(void)
{
P1|=0x0f; lit off all led
P0=0xff;
s0=0;
P0=table[led[0]];
delay_ms1();
P1|=0x0f; lit off all led
P0=0xff;
s1=0;
P0=table[led[1]];
delay_ms1();
P1|=0x0f; lit off all led
P0=0xff;
s2=0;
P0=table[led[2]];
delay_ms1();
P1|=0x0f; lit off all led
P0=0xff;
s3=0;
P0=table[led[3]];
delay_ms1();
P1|=0x0f; lit off all led
P0=0xff;
}
********************************************************************* *********************显示两位函数************************************ void display1(unsigned char a,b) 显示两位
{
led[0]=a%10;
led[1]=a10;
led[2]=b%10;
led[3]=b10;
display();
}
*****************************************************************
*******************中断服务函数*********************************
void timer2(void) interrupt 5 using 1
{
if(s==1)
{timer++;
if(timer==2)
{timer=0;flag++;
if(flag==10)
{flag=0;timer_second++;
if(timer_second==60)
{timer_second=0;
timer_minute++;}
}
}
}
timer2_tick++;
if(timer2_tick==20)
{ timer2_tick=0;
now.second++;
if(now.second==60)
{ now.minute++;
now.second=0;
if(now.minute==60)
{ now.==0)
{
delay100ms();
if (mode_button==0)
keys=1;
}
if (operation_button==0)
{
delay100ms();
if (operation_button==0)
keys=2;
}
if (inc_button==0)
{delay100ms();
if (inc_button==0)
keys=3;
}
if (dec_button==0)
{
delay100ms();
if (dec_button==0)
keys=4;
}
return (keys);
}
********************************************************************* *********************主函数***************************************** void main(void)
{
float temp,j,value;
unsigned char tmp;
unsigned char temph;
mode=0;
operation=0;
timer2_initialize();
temph=35;
do{
Wait30us;
value=adc_conv();
tmp=value;
temp=(float)tmp;
j=log(temp(255-temp));
temp=j3380+1298.15;
temp=1temp-273.15;
tmp=(unsigned char)temp;
*******************温度超过上限报警******************************** if(tmp>temph)
bell=0;
else
bell=1;
keys=gotkey();
******************按键值******************************************* switch(keys)
{
case 1:
mode++;
if(mode==5)
mode=0;
break;
case 2:
operation++;
if(operation==2)
operation=0;
break;
default :break;
}
*******************模式控制**************************************** switch(mode)
{
case 0:显示时间
display_time();
break;
case 1: 时间校准
if(operation==0)时校准
{display1(0,now._button==0)
{delay100ms();
if(operation_button==0)
{ s++;if(s==2){ s=0;}
}
}
if(inc_button==0)
{flag=0;timer=0,timer_second=0;}
break;
case 3: 闹铃设定
display_ring();
if(operation==0)
{ if (keys==3)
{delay100ms();
if (keys==3)
{if(++ring_==0)
display_temp();
else 设定上限温度
{display1(0,temph);
if (keys==3)
{delay100ms();
if (keys==3)
{if(++temph>99)
temph=0;
}
}
if (keys==4)
{delay100ms();
if (keys==4)
{if(--temph<0)
temph=99;
}
}
}
break;
default: break;
}
} while(1);
}
*******************************************************************