单片机家用多功能定时器设计与制作.docx
- 文档编号:27372826
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:19
- 大小:199.86KB
单片机家用多功能定时器设计与制作.docx
《单片机家用多功能定时器设计与制作.docx》由会员分享,可在线阅读,更多相关《单片机家用多功能定时器设计与制作.docx(19页珍藏版)》请在冰豆网上搜索。
单片机家用多功能定时器设计与制作
家用多功能定时器的设计
专业年:
电子信息工程
学号:
201130040307
学生姓名:
廖义忠
指导教师:
谢勇勤
报告完成日期2014年5月28日
第1章绪论
1.1系统背景
1.1.1单片机的电子技术
单片机是将CPU、RAM\ROM\定时器/计数器以及输入输出(I/O)接口等计算机的主要部件集成在一块的集成电路芯片,作为微机系统它还可以实现模/数转换、脉宽调制、计数器捕获/比较逻辑、高速I/O口和WDT各种控制功能。
通过在MCS-51系列的单片机中增设了全双工串行口I/O、片内数据存储器采用寻址范围为256kb的8位地址、均有四种工作方式的2个16位的定时/计数器、增加了中断系统、增设了颇具特色的布尔处理机、让单片机具有较强的指令寻址和运算功能这些技术,使单片机拥有了完善的外部并行总线(AB、DB、CB)具有多机识别功能的串行通信接口,规范了功能单元的特殊功能寄存器控制模式及适应控制器特点的布尔处理系统和指令系统,位发展具有良好兼容性的新一代单片机奠定了良好的基础。
单片机被广泛地应用在各种领域。
例如用来作家用电器中如洗衣机、电冰箱、微波炉、电饭煲、电视机、录像机以及其他视频音像设备的控制器;在办公室中用作大量通信、信息的承载体,比如磁盘驱动、打印机、复印机、电话等;它还可以来构成电子秤、收款机、仓储安全检测系统、空气调节系统等冷冻保鲜系统等的专用系统;在工业中,像工业过程控制、过程监制以及机电一体化控制等系统都是以单片机为核心火多网络系统;它还可以构成一些智能仪表与集成智能传感器传统的控制电路,实现一些像存储、数据处理、查找、判断、联网和语音功能等智能化功能,还可以构成一些电子系统中的集中显示系统、动力检测控制系统、自动驾驶系统、通信系统以及运行监视器等的冗余网络系统。
1.1.2定时器介绍
人类最早使用的定时工具是沙漏或水漏,但在钟表诞生发展成熟之后,人们开始尝试使用这种全新的计时工具来改进定时器,达到准确控制时间的目的。
1876年,英国外科医生索加取得一项定时装置的专利,用来控制煤气街灯的开关。
它利用机械钟带动开关来控制煤气阀门。
定时器确实是一项了不起的发明,使相当多需要人控制时间的工作变得简单了许多,家用电器都安装了定时器来控制开关或工作时间。
1.2设计要求
主要内容和任务:
完成单片机最小系统板设计与制作,在此基础上通过编程设计家用多路定时控制器。
目标:
通过编写程序,使单片机最小系统具有正常数字钟功能,包括时间校正,具有至少三路定时开关控制功能,每路定时时间可以任意设置。
第2章系统电路设计
2.1设计框架介绍
按键输入电路:
对定时器输入定时时间、时钟时间,并对其调整。
时钟电路:
给单片机一个时钟信号,让其工作。
复位电路:
使单片机为初始状态,并从初态开始工作。
数码管:
显示时间或者其它。
2.2系统硬件单元电路设计
2.2.1复位电路设计
复位操作有上电自动复位、按键电平复位和外部脉冲复位三钟方式,本次实验用的是按键电平复位,利用电容的充放电公式来选择所需的电容、电阻,能保证复位信号高电平持续时间大于2个机器周期。
2.2.2时钟电路设计
该时钟电路是由晶体振荡器和两个微调电容组成的。
在单片机芯片内部有一个高增益反相放大器,其输入端为引脚XTAL1,其输出端为引脚XTAL2。
只需要在片外通过XTAL1和XTAL2引脚跨接晶体振荡器或在引脚与地之间加接微调电容,形成反馈电路,振荡器即可工作。
由于该晶振使用的是12MHZ的晶体,因此它的时钟周期是0.167us,机器周期为1us。
2.2.3按键电路设计
本课程设计要用数码管显示数字钟、定时时间。
这就需要键盘来设定,键盘可以分为独立连接式和矩阵式。
本实验用的是矩阵式。
为了减少所以的I/O口,利用三——八译码器来实现12个键盘的连接。
对于这种矩阵式的键盘连接,扫描时依次将行线置为低电平,即在置某根行线为低电平时,其它都线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
注意在按键时一定要调延时子程序来消除抖动。
2.2.4数码管显示电路设计
实验中所用的数码管为共阴极数码管,当给其引脚加入高电平时,数码管中对应的那一段就亮。
2.3系统硬件总电路
第3章系统软件设计
3.1系统软件流程图
主程序在执行时,通过单片机内部中断对程序不断的扫描判断、刷新显示,当有键按下时,将数字钟中的时间与定时时间相比较,然后根据比较程序显示状态,并且还要延时消除抖动,之后进行按键处理,从而显示不同的状态,如此周期循环。
3.2系统程序设计
#include
#defineucharunsignedchar
#defineuintunsignedint
/******************定义管脚**********************/
sbitRELAY=P1^0;
sbitLED1=P1^1;
sbitLED2=P1^2;
sbitLED3=P1^3;
sbitLED4=P1^4;
sbitLED5=P1^5;
sbitLED6=P1^6;
sbitLED7=P1^7;
sbitLine1=P2^1;
sbitLine2=P2^0;
/******************定义缓冲区及初始化********************/
uchardataTimeTab[6]={0x06,0x5b,0x4f,0x66};
uchardataTab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchardataTimeTab1[4],TimeTab2[4];
/*****************定义参数及初始化********************/
charhour=12,minute=34,second=0,h=0,m=0,h1=0,m1=0;charsecond1;
charflag=0,flag1=0,flag2=0;
ucharKeyno=0;
ucharnum=0,count=0;
ucharSTATE=0;
/************************************************
延时子函数
*************************************************/
voidDelay(uintx)//自定义延时约0.1ms
{
uintt;
while(--x)
for(t=0;t<120;t++)
;
}
/******************************************************************/
/*刷新缓冲区子程序*/
/******************************************************************/
voidRefreshTab(void)
{if(flag==0)
{TimeTab[0]=Tab[hour/10];
TimeTab[1]=Tab[hour%10];
TimeTab[2]=Tab[minute/10];
TimeTab[3]=Tab[minute%10];}
if(flag==1)
{TimeTab1[0]=Tab[h/10];
TimeTab1[1]=Tab[h%10];
TimeTab1[2]=Tab[m/10];
TimeTab1[3]=Tab[m%10];
}
if(flag==2)
{TimeTab2[0]=Tab[h1/10];
TimeTab2[1]=Tab[h1%10];
TimeTab2[2]=Tab[m1/10];
TimeTab2[3]=Tab[m1%10];
}
if(flag==4)
{TimeTab[0]=0x00;
TimeTab[1]=0x00;
TimeTab[2]=Tab[(50-second1)/10];
TimeTab[3]=Tab[(50-second1)%10];}
}
/******************************************************************/
/*按键处理子程序*/
/******************************************************************/
voidKey_Process(void)
{
switch(STATE)
{
case0:
if(Keyno==1){STATE=1;}
break;
case1:
if(Keyno==2){hour++;if(hour==24)hour=0;}
if(Keyno==3){hour--;if(hour==-1)hour=23;}
if(Keyno==1){STATE=2;}
break;
case2:
if(Keyno==2){minute++;if(minute==60)minute=0;}
if(Keyno==3){minute--;if(minute==-1)minute=59;}
if(Keyno==1){STATE=3;flag=1;}
break;
case3:
if(Keyno==2){h++;if(h==24)h=0;}
if(Keyno==3){h--;if(h==-1)h=23;}
if(Keyno==1){STATE=4;}
break;
case4:
if(Keyno==2){m++;if(m==60)m=0;}
if(Keyno==3){m--;if(m==-1)m=59;}
if(Keyno==1){STATE=5;flag=0;}
break;
case5:
if(Keyno==1){STATE=6;flag=2;}
break;
case6:
if(Keyno==2){h1++;if(h1==24)h1=0;}
if(Keyno==3){h1--;if(h1==-1)h1=23;}
if(Keyno==1){STATE=7;}
break;
case7:
if(Keyno==2){m1++;if(m1==60)m1=0;}
if(Keyno==3){m1--;if(m1==-1)m1=59;}
if(Keyno==1){STATE=8;flag=0;}
break;
case8:
if(Keyno==4){STATE=9;flag=3;}
break;
case9:
if(Keyno==5){STATE=10;second1=20;flag=4;}
if(Keyno==1){STATE=0;flag=0;}
break;
case10:
if(Keyno==1){STATE=0;flag=0;}
break;
case11:
if(Keyno==1){STATE=0;flag=0;}
break;
case12:
if(Keyno==1){STATE=0;flag=0;}
break;
default:
break;
}
}
/******************************************************************/
/*数码管显示子程序*/
/******************************************************************/
voidSEG_Display(void)
{if(flag==0)
P0=TimeTab[num];
if(flag==1)
{
P0=TimeTab1[num];}
if(flag==2)
{
P0=TimeTab2[num];}
if(flag==3)
{P0=0x49;}
if(flag==4)
{P0=TimeTab[num];}
}
/****************************红绿灯*******************************/
voidhlhd(void)
{if(second1==50&&STATE==10)
{STATE=11;second1=45;}
if(second1==50&&STATE==11)
{STATE=12;second1=30;}
if(second1==50&&STATE==12)
{STATE=10;second1=20;}
}
/******************************************************************/
/*比较函数*/
/******************************************************************/
voidcompare(void)
{if(h==hour){if(m==minute){STATE=4;if(minute==m+2)STATE=0;}}
if(h1==hour){if(m1==minute){STATE=6;if(minute==m1+2)STATE=0;}}
}
/******************************************************************/
/*LED显示子程序*/
/******************************************************************/
voidLED_Display(void)
{
switch(STATE)
{
case0:
LED2=0;LED3=0;LED4=0;LED5=0;LED6=0;LED7=0;break;
case1:
LED2=1;LED3=0;LED4=0;LED5=0;LED6=0;LED7=0;break;
case2:
LED3=1;LED2=0;LED4=0;LED5=0;LED6=0;LED7=0;break;
case3:
LED4=1;LED2=0;LED3=0;LED5=0;LED6=0;LED7=0;break;
case4:
LED4=1;LED2=0;LED3=0;LED5=0;LED6=0;LED7=0;break;
case6:
LED5=1;LED2=0;LED3=0;LED4=0;LED6=0;LED7=0;break;
case7:
LED5=1;LED2=0;LED3=0;LED4=0;LED6=0;LED7=0;break;
case8:
LED2=1;LED3=1;LED4=1;LED5=0;LED6=0;LED7=0;break;
case9:
LED2=1;LED3=1;LED4=1;LED5=0;LED6=0;LED7=0;break;
case10:
LED2=0;LED3=1;LED4=0;LED5=0;LED6=0;LED7=0;break;
case11:
LED2=1;LED3=0;LED4=0;LED5=0;LED6=0;LED7=0;break;
case12:
LED2=0;LED3=0;LED4=1;LED5=0;LED6=0;LED7=0;break;
default:
break;
}
}
/******************************************************************/
/*主程序*/
/******************************************************************/
voidmain(void)
{
P1=0x00;
EA=1;
TMOD|=0x01;//定时器0计时50msin12Mcrystal
TH0=0x3C;//初值
TL0=0xB0;
ET0=1;
TR0=1;
TMOD|=0x10;//定时器1用于动态扫描
TH1=0xFa;//初值
TL1=0xF0;
ET1=1;
TR1=1;
while
(1)
{
RefreshTab();
LED_Display();
compare();
hlhd();
if(!
Line1||!
Line2){Delay(200);Key_Process();}
}
}
/******************************************************************/
/*定时器0中断用于计时*/
/******************************************************************/
voidTimer0(void)interrupt1
{TH0=0x3C;//重新赋值50ms溢出
TL0=0xB0;
count++;
if(count==10)
LED1=~LED1;
if(count==20)
{
count=0;
second++;
if(flag==4)second1++;//秒加1
if(second==60)
{
second=0;
minute++;//分加1
if(minute==60)
{
minute=0;
hour++;//时加1
if(hour==24)
{
hour=0;
}
}
}
}
}
/******************************************************************/
/*定时器1中断扫描显示+键值判断*/
/******************************************************************/
voidTimer1(void)interrupt3
{TH1=0xFa;//定时2ms显示下一个数码管
TL1=0xF0;
switch(num)
{
case0:
P2=0x0f;
if(!
Line1)Keyno=1;
if(!
Line2)Keyno=6;
SEG_Display();
break;
case1:
P2=0x1f;
if(!
Line1)Keyno=4;
if(!
Line2)Keyno=5;
SEG_Display();
break;
case2:
P2=0x2f;
if(!
Line1)Keyno=3;
if(!
Line2)Keyno=12;
SEG_Display();
break;
case3:
P2=0x3f;
if(!
Line1)Keyno=7;
if(!
Line2)Keyno=8;
SEG_Display();
break;
case4:
P2=0x4f;
if(!
Line1)Keyno=2;
if(!
Line2)Keyno=9;
SEG_Display();
break;
case5:
P2=0x5f;
if(!
Line1)Keyno=10;
if(!
Line2)Keyno=11;
SEG_Display();
break;
default:
break;
}
num++;
if(num==6)
num=0;
}
第4章实验结果和分析
4.1实验使用的仪器设备
电脑,PTOTEUS软件,KEIL软件,电烙铁,吸锡器,钳子,直流电源,电阻,电容等基本元器件。
4.2测试结果分析
程序烧录到单片机中后,将其接到+5V左右的直流电源中,并开始按键实现时间控制或调整,设置多路定时时间,每路定时时间有起始时间和终止时间。
当设定好每路时间段后,按键恢复时钟状态并开始计时。
当到了指定的时间后,LED灯便会开始亮直至定时时间结束。
具体的显示情况如下:
通过按shift键来改变电路状态,第一次按下shift键,进入调时状态。
第二次按下shift键,进入调分状态。
第三次按下shift键,进入第一路定时的调时状态。
第四次按下shift键,进入第一路定时的调分状态。
第五次按下shift键,回归时钟状态。
第六次按下shift键,进入第二路定时的调时状态。
第七次按下shift键,进入第二路定时的调分状态。
第八次按下shift键,回归时钟状态。
然后按下1键,进入交通灯提示状态。
按下2键,正式进入交通灯状态。
按下shift键,回归原始时钟状态。
结束语
通过本次实验学会了用keil编程,实现计时、多路定时功能,然后通过数码管显示时间还有LED灯的亮来提示定时。
当恢复到原来的初始状态时,再按按键可以看到原来的所定的三路时间的终止时间。
在制作PCB板的过程中和编程过程中,理解和加强了对单片机的了解。
这次设计课题中,在给定的源程序上修改并增加了多路定时程序,实现实验要求。
在焊接电路板过程中也没有出现过什么问题,只是在Protues仿真实验中有出现数码管显示数字成零不断跳动,而且LED灯自动跳变,相当于是中断不停执行、判断键值,特别不稳定。
虽然这次实验没有创新,但是也是自己动手查资料,修改程序,达到实验要求。
之前做过直流稳压电源,两级放大电路和数显温度计,但是都是照葫芦画瓢,没有融合自己的思想在所做的板子当中。
虽然达到实验要求,但是总是觉得只是为了完成老实交代的任务而已,并没有思考很多。
有时,只有经过自己亲手试验,才能更深层次的懂得实验原理和每部分电路的功能。
参考文献
张俊谟.单片机中级教程——原理与应用(第二版).北京:
北京航空航天大学出版社,2006.10.
谭浩强.C程序设计.北京:
清华大学出版社,2009.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 家用 多功能 定时器 设计 制作