本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
黄 冈 师 院 物 科 院
《单片机技术》课程设计报告
项目名称: 家用多功能定时器设计与制作
专业年级: 电子信息工程2009级
学 号: 200922240120
学生姓名: 余 生
指导教师: 冯 杰
报告完成日期年日
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
第一章 绪论
1.1系统背景
1.1.1单片机技术及其发展特点
早期的单片机(Single Chip Microcomputer单片微计算机)只是将CPU及计算机外围功能单元(如I/O口、定时/计时器、UART、RAM、ROM等)集成在一块芯片上。随着单片机技术的发展以及微处理器(MPU)技术及超大规模集成电路技术的发展,单片机集成了更多的用于控制目的的功能单元(如高速I/O口、ADC、PWM、WATCHDOG、 I2CBus - Inter IC Bus、CAN Bus – Controller Area Network Bus等),从而成为严格意义上的单片微控制器(Single Chip Microcontroller)。图10一4所示的为MCS—51单片机片内总体结构框图。
单片机系统以单片机为核心部件,可分为单机应用和多机应用。单机应用是指一个应用系统中只使用一个单片机,这是目前应用最多的方式;多机应用是单片机在高科技领域应用的主要模式。单片机的高可靠性、高控制功能及高运行速度的“三高”特点必然使得未来的高科技工程系统将采用da单片机多机系统作为主要的发展方向。图10一5所示的为典型的单片机系统原理框图。
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
图10一4 MCS—51单片机片内总体结构框图
单片机的生存周期相对于普通CPU而言非常之长,如MCS8051已超过15年。以某类单片机(如8051/52)为核心,集成不同I/O功能模块的新单片机系列层出不穷;而某些单片机更是突出了以功能分类的特点(如Microchip 公司的 PIC单片机)。8位、16位、32位单片机共同发展也是当前单片机技术发展的另一特点。
单片机运算速度越来越快,为提高单片机抗干扰能力和降低噪声,尽量不采用提高时钟频率单一措施,而是通过调整单片机的内部时序、使用琐相环技术或内部倍频技术等技术,在不提高时钟频率的条件下,使运算速度提高了很多。
图10-5 典型单片机系统原理框图
低电压与低功耗是单片机技术的发展的另一个特点。采用最新的集成电路制造技术,全静态设计使时钟频率从直流到数十兆任选,使功耗不断下降。PIC单片机、Motorola的某些单片机等在这方面具有很强的优势。
为提高单片机系统的抗电磁干扰能力,使产品能适应恶劣的工作环境,满足电磁兼容性方面更高标准的要求,各单片机商家尽量采用低噪声与高可靠性技术,在单片机内部电路中采取了一些新的技术措施,如增加了抗EMI电路、增强了WATCHDOG的性能等。
为降低单片机产品的成本,广泛采用掩膜(Mask ROM)、一次编程(OTP-One
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
Time Programmable)和多次编程(MTP-Multi Time Programmable)单片机。过去成熟的单片机产品一般采用掩膜型单片机,由于掩膜需要一定的生产周期,而一次编程型单片机价格不断下降,使得近年来直接使用一次编程完成最终产品制造更为流行。近年来,一次编程型单片机需量大幅度上扬,为适应这种需求许多单片机都采用了在片编程技术(In System Programming)。未编程的一次编程芯片先焊在印刷板上,然后再其进行编程,解决了批量写一次编程芯片时容易出现的芯片与写入器接触不好的问题。编程线与I/O线共用,不增加单片机的额外引脚。而多次编程向一次编程提出了挑战,一些单片机厂商采用FLASH存储器作为程序存储器(如ATMEL 公司的单片机),可多次编程。
1.1.2单片机在电子技术中的应用
单片机的应用领域
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录象机、摄象机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:
1.在智能仪器仪表上的应用
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计,示波器,各种分析仪)。
2.在工业控制中的应用
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
3.在家用电器中的应用
可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。
4.在计算机网络和通信领域中的应用
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
5.单片机在医用设备领域中的应用
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。
此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。
1.1.3课程设计的内容与任务
本课程设计是基于ATMEL公司生产的AT89CS51单片机为主而设计的,本课程设计主要内容和任务是完成单片机最小系统板设计与制作,在此基础上通过编程设计家用多路定时控制器。使其具有正常数字钟功能,包括时间校正,具有至少三路定时开关控制功能,每路定时时间可以任意设置。当然,该定时器依然可以通过编程设计出多种功能,例如:电子日历,交通指示灯等等。
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
第二章 系统电路设计
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
2.2 系统硬件单元电路设计
2.2.1 时钟电路设计
该时钟电路是由晶体振荡器和两个微调电容组成的。在单片机芯片内部有一个高增益反相放大器,其输入端为引脚XTAL1,其输出端为引脚XTAL2。只需要在片外通过XTAL1和XTAL2引脚跨接晶体振荡器或在引脚与地之间加接微调电容,形成反馈电路,振荡器即可工作。由于该晶振使用的是12MHZ的晶体,因此它的时钟周期是0.167us,机器周期为1us。 2.2.2 复位电路设计
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
2. 2.3 按键电路设计
2.3 系统硬件总电路
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
第三章 系统软件设计
3.1 系统软件流程图
说明:程序开始执行,启动定时器0和定时器1,然后执行while语句,但条件一直成立,
因此while语句中的子函数一直在执行。If语句也一直在判断有没有shift键有没有按下,是否进入了调时调分的阶段,一段进入,通过键盘扫描和键值判断,使得按键处理子程序进入新的状态,从而数码管显示新的内容。
3.2 系统程序设计
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
/******************定义管脚**********************/ sbit RELAY=P1^0; sbit LED1=P1^1; sbit LED2=P1^2;
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
sbit LED3=P1^3; sbit LED4=P1^4; sbit LED5=P1^5; sbit LED6=P1^6; sbit LED7=P1^7; sbit Line1=P2^1;
sbit Line2=P2^0;
/******************定义缓冲区及初始化********************/ uchar data TimeTab[6]={0x06,0x5b,0x4f,0x66};
uchar data Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar data TimeTab1[4],TimeTab2[4];
/*****************定义参数及初始化********************/ char hour=12,minute=34,second=0,h=0,m=0,h1=0,m1=0;char second1; char flag=0,flag1=0,flag2=0; uchar Keyno=0;
uchar num=0,count=0;
uchar STATE=0;
/************************************************ 延时子函数 *************************************************/ void Delay( uint x) //自定义延时约0.1ms {
uint t; while(--x) for(t=0;t<120;t++) ; }
/******************************************************************/ /* 刷新缓冲区子程序 */ /******************************************************************/ void RefreshTab(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];
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
}
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];}
/******************************************************************/ /* 按键处理子程序 */ /******************************************************************/ void Key_Process(void) {
switch(STATE) {
case 0: if(Keyno==1){STATE=1;} break;
case 1: if(Keyno==2){hour++;if(hour==24)hour=0;}
if(Keyno==3){hour--;if(hour==-1)hour=23;}
if(Keyno==1){STATE=2;} break;
case 2: 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;
case 3: if(Keyno==2){h++;if(h==24)h=0;} if(Keyno==3){h--;if(h==-1)h=23;} if(Keyno==1){STATE=4;} break;
case 4: 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;
case 5: if(Keyno==1){STATE=6;flag=2;}
break;
if(Keyno==2){h1++;if(h1==24)h1=0;}
if(Keyno==3){h1--;if(h1==-1)h1=23;} if(Keyno==1){STATE=7;} break;
case 6:
case 7: 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;}
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
}
case 8: if(Keyno==4){STATE=9;flag=3;} break;
case 9: if(Keyno==5){STATE=10;second1=20;flag=4;} if(Keyno==1){STATE=0;flag=0;}
break;
case 10:if(Keyno==1){STATE=0;flag=0;} break;
case 11:if(Keyno==1){STATE=0;flag=0;}
break;
case 12:if(Keyno==1){STATE=0;flag=0;} break; default:break;
}
/******************************************************************/ /* 数码管显示子程序 */ /******************************************************************/ void SEG_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];} }
/****************************红绿灯*******************************/ void hlhd(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;} }
/******************************************************************/ /* 比较函数 */
/******************************************************************/
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
void compare(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显示子程序 */ /******************************************************************/ void LED_Display(void) {
switch(STATE) { case 0:
LED2=0;LED3=0;LED4=0;LED5=0;LED6=0;LED7=0;break;
case 1: LED2=1;LED3=0;LED4=0;LED5=0;LED6=0;LED7=0;break; case 2: LED3=1;LED2=0;LED4=0;LED5=0;LED6=0;LED7=0;break; case 3: LED4=1;LED2=0;LED3=0;LED5=0;LED6=0;LED7=0;break; case 4: LED4=1;LED2=0;LED3=0;LED5=0;LED6=0;LED7=0;break; case 6: LED5=1;LED2=0;LED3=0;LED4=0;LED6=0;LED7=0;break; case 7: LED5=1;LED2=0;LED3=0;LED4=0;LED6=0;LED7=0;break; case 8: LED2=1;LED3=1;LED4=1;LED5=0;LED6=0;LED7=0;break; case 9:
LED2=1;LED3=1;LED4=1;LED5=0;LED6=0;LED7=0;break;
case 10: LED2=0;LED3=1;LED4=0;LED5=0;LED6=0;LED7=0;break;
case 11: LED2=1;LED3=0;LED4=0;LED5=0;LED6=0;LED7=0;break; case 12: LED2=0;LED3=0;LED4=1;LED5=0;LED6=0;LED7=0;break; default: break; }
}
/******************************************************************/ /* 主程序 */ /******************************************************************/ void main(void) {
P1=0x00;
EA=1;
TMOD |=0x01;//定时器0计时50ms in 12M crystal TH0=0x3C; //初值 TL0=0xB0; ET0=1;
TR0=1;
TMOD |=0x10; //定时器1用于动态扫描 TH1=0xFa; //初值 TL1=0xF0; ET1=1; TR1=1;
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
while(1) }
{ }
RefreshTab(); LED_Display(); compare(); hlhd();
if(!Line1||!Line2){Delay(200);Key_Process();}
/******************************************************************/ /* 定时器0中断用于计时 */ /******************************************************************/ void Timer0(void) interrupt 1
{TH0=0x3C; //重新赋值50ms溢出 TL0=0xB0; count++;
if(count==10)
LED1=~LED1; if (count==20) { count=0;
//秒加1
second++; if(flag==4)second1++;
if(second==60) {
second=0;
minute++; //分加1
if(minute==60) {
minute=0;
hour++; //时加1 if(hour==24) { hour=0; }
} } }
}
/******************************************************************/ /* 定时器1中断扫描显示+键值判断 */
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
/******************************************************************/ void Timer1(void) interrupt 3
{ TH1=0xFa; //定时2ms显示下一个数码管 }
TL1=0xF0; switch(num) { } num++; num=0;
case 0: P2=0x0f;
if(!Line1)Keyno=1; if(!Line2)Keyno=6; SEG_Display();
break; case 1: P2=0x1f;
if(!Line1)Keyno=4; if(!Line2)Keyno=5; SEG_Display(); break;
case 2: P2=0x2f; if(!Line1)Keyno=3; if(!Line2)Keyno=12;
SEG_Display(); break;
case 3: P2=0x3f; if(!Line1)Keyno=7; if(!Line2)Keyno=8; SEG_Display(); break; case 4: P2=0x4f;
if(!Line1)Keyno=2; if(!Line2)Keyno=9; SEG_Display();
break; case 5: P2=0x5f;
if(!Line1)Keyno=10; if(!Line2)Keyno=11; SEG_Display(); break;
default: break;
if(num==6)
本产品是基于51单片机而设计的一款多功能家用定时器,通过编程可以实现红绿灯,电子日历等诸多用途。
第四章 实验结果和分析
4.1 实验使用的仪器设备
本实验主要用到了电源,电脑,烧程器,电烙铁,元器件若干。
4.2 测试结果分析
通过按shift键来改变电路状态
第一次按下shift键,进入调时状态。 第二次按下shift键,进入调分状态。
第三次按下shift键,进入第一路定时的调时状态。 第四次按下shift键,进入第一路定时的调分状态。 第五次按下shift键,回归时钟状态。
第六次按下shift键,进入第二路定时的调时状态。 第七次按下shift键,进入第二路定时的调分状态。 第八次按下shift键,回归时钟状态。 然后按下1键,进入交通灯提示状态。 按下2键,正式进入交通灯状态。 按下shift键,回归原始时钟状态。
结束语
通过本课程设计,应该来说收获蛮大。首先对单片机的认识进一步加强,更加熟悉运用单片机,同时提升了编程的能力。当然了,设计过程中,还是遇到很多问题,主要是软件方面的,这个需要加强。
另外,本课程设计能够得以完成,要感谢冯老师和郜文华刘杰两位同学。
参考文献
张俊谟.单片机中级教程——原理与应用(第二版).北京:北京航空航天大学出版社,2006.10.
谭浩强.C程序设计.北京:清华大学出版社,2009.