基于51单片机的多功能定时器.docx
《基于51单片机的多功能定时器.docx》由会员分享,可在线阅读,更多相关《基于51单片机的多功能定时器.docx(25页珍藏版)》请在冰豆网上搜索。
基于51单片机的多功能定时器
《单片机技术》课程设计报告
项目名称:
家用多功能定时器设计与制作
第一章绪论1
1.1系统背景1
第二章系统电路设计5
2.1系统总体设计框架结构5
2.2系统硬件单元电路设计6
2.2.1时钟电路设计6
2.2.2复位电路设计7
2.2.3按键电路设计7
2.3系统硬件总电路8
第三章系统软件设计8
3.1系统软件流程图8
3.2系统程序设计9
第四章实验结果和分析15
4.1实验使用的仪器设备15
4.2测试结果分析15
结束语15
参考文献16
第一章绪论
1.1系统背景
1.1.1单片机技术及其发展特点
早期的单片机(SingleChipMicrocomputer单片微计算机)只是将CPU及计算机外围功能单元(如I/O口、定时/计时器、UART、RAM、ROM等)集成在一块芯片上。
随着单片机技术的发展以及微处理器(MPU)技术及超大规模集成电路技术的发展,单片机集成了更多的用于控制目的的功能单元(如高速I/O口、ADC、PWM、WATCHDOG、I2CBus-InterICBus、CANBus–ControllerAreaNetworkBus等),从而成为严格意义上的单片微控制器(SingleChipMicrocontroller)。
图10一4所示的为MCS—51单片机片内总体结构框图。
单片机系统以单片机为核心部件,可分为单机应用和多机应用。
单机应用是指一个应用系统中只使用一个单片机,这是目前应用最多的方式;多机应用是单片机在高科技领域应用的主要模式。
单片机的高可靠性、高控制功能及高运行速度的“三高”特点必然使得未来的高科技工程系统将采用da单片机多机系统作为主要的发展方向。
图10一5所示的为典型的单片机系统原理框图。
图10一4MCS—51单片机片内总体结构框图
单片机的生存周期相对于普通CPU而言非常之长,如MCS8051已超过15年。
以某类单片机(如8051/52)为核心,集成不同I/O功能模块的新单片机系列层出不穷;而某些单片机更是突出了以功能分类的特点(如Microchip公司的PIC单片机)。
8位、16位、32位单片机共同发展也是当前单片机技术发展的另一特点。
单片机运算速度越来越快,为提高单片机抗干扰能力和降低噪声,尽量不采用提高时钟频率单一措施,而是通过调整单片机的内部时序、使用琐相环技术或内部倍频技术等技术,在不提高时钟频率的条件下,使运算速度提高了很多。
图10-5典型单片机系统原理框图
低电压与低功耗是单片机技术的发展的另一个特点。
采用最新的集成电路制造技术,全静态设计使时钟频率从直流到数十兆任选,使功耗不断下降。
PIC单片机、Motorola的某些单片机等在这方面具有很强的优势。
为提高单片机系统的抗电磁干扰能力,使产品能适应恶劣的工作环境,满足电磁兼容性方面更高标准的要求,各单片机商家尽量采用低噪声与高可靠性技术,在单片机内部电路中采取了一些新的技术措施,如增加了抗EMI电路、增强了WATCHDOG的性能等。
为降低单片机产品的成本,广泛采用掩膜(MaskROM)、一次编程(OTP-OneTimeProgrammable)和多次编程(MTP-MultiTimeProgrammable)单片机。
过去成熟的单片机产品一般采用掩膜型单片机,由于掩膜需要一定的生产周期,而一次编程型单片机价格不断下降,使得近年来直接使用一次编程完成最终产品制造更为流行。
近年来,一次编程型单片机需量大幅度上扬,为适应这种需求许多单片机都采用了在片编程技术(InSystemProgramming)。
未编程的一次编程芯片先焊在印刷板上,然后再其进行编程,解决了批量写一次编程芯片时容易出现的芯片与写入器接触不好的问题。
编程线与I/O线共用,不增加单片机的额外引脚。
而多次编程向一次编程提出了挑战,一些单片机厂商采用FLASH存储器作为程序存储器(如ATMEL公司的单片机),可多次编程。
1.1.2单片机在电子技术中的应用
单片机的应用领域
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录象机、摄象机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:
1.在智能仪器仪表上的应用
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。
采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。
例如精密的测量设备(功率计,示波器,各种分析仪)。
2.在工业控制中的应用
用单片机可以构成形式多样的控制系统、数据采集系统。
例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
3.在家用电器中的应用
可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。
4.在计算机网络和通信领域中的应用
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
5.单片机在医用设备领域中的应用
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。
此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。
1.1.3课程设计的内容与任务
本课程设计是基于ATMEL公司生产的AT89CS51单片机为主而设计的,本课程设计主要内容和任务是完成单片机最小系统板设计与制作,在此基础上通过编程设计家用多路定时控制器。
使其具有正常数字钟功能,包括时间校正,具有至少三路定时开关控制功能,每路定时时间可以任意设置。
当然,该定时器依然可以通过编程设计出多种功能,例如:
电子日历,交通指示灯等等。
第二章系统电路设计
2.1系统总体设计框架结构
复位电路:
通过复位电路使所有的状态都恢复原始状态。
时钟电路:
通过该电路产生单片机工作所需要的时钟信号。
按键电路:
通过该电路改变单片机控制的功能。
单片机:
控制整个电路。
数码管:
显示时间或者其它。
2.2系统硬件单元电路设计
2.2.1时钟电路设计
该时钟电路是由晶体振荡器和两个微调电容组成的。
在单片机芯片内部有一个高增益反相放大器,其输入端为引脚XTAL1,其输出端为引脚XTAL2。
只需要在片外通过XTAL1和XTAL2引脚跨接晶体振荡器或在引脚与地之间加接微调电容,形成反馈电路,振荡器即可工作。
由于该晶振使用的是12MHZ的晶体,因此它的时钟周期是0.167us,机器周期为1us。
2.2.2复位电路设计
2.2.3按键电路设计
2.3系统硬件总电路
第三章系统软件设计
3.1系统软件流程图
主程序流程图:
说明:
程序开始执行,启动定时器0和定时器1,然后执行while语句,但条件一直成立,因此while语句中的子函数一直在执行。
If语句也一直在判断有没有shift键有没有按下,是否进入了调时调分的阶段,一段进入,通过键盘扫描和键值判断,使得按键处理子程序进入新的状态,从而数码管显示新的内容。
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)