湖南人文科技学院课程设计报告课程名称:单片机原理及应用课程设计设计题目:简易自动打铃系统系别:通信与控制工程系专业:电子信息工程班级:学生姓名:学号:起止日期:2011年12月19日~2011年12月30日指导教师:教研室主任:摘要随着科学技术的飞速发展,单片机应用的范围越来越广,本设计正是基于STC89C52型单片机为核心,加上适当的外围部件,设计而成的简易自动打铃系统。
简易自动打铃系统的设计以STC89C52单片机芯片和8255芯片的拓展I/0引脚为核心部件,用中断系统进行时间设置,数码管显示当前时间并辅以必要的电路,构成了本系统。
根据设计要求,该简易自动打铃系统可以进行计时和显示,设置当前时间,实现定点打铃等功能。
该设计简单、实用、操作便捷。
关键字:打铃功能、定时器、中断、芯片目录设计要求 (1)1方案论证与对比 (1)1.1方案一 (1)1.2方案二 (1)1.3方案比较 (2)2单元电路设计与论证 (2)2.1中断和复位电路设计 (2)2.2电源电路设计 (3)2.3单片机、I/O拓展 (3)2.4打铃电路设计 (5)2.5数码管电路设计 (5)3系统软件工作流程图 (6)3.1主程序工作流程 (6)3.2定时器中断显示子程序 (6)3.3中断服务子程序 (7)3.4时间设定子程序 (8)4系统功能实际测试 (8)4.1程序实际编译测试 (8)4.2软件调试步骤 (9)4.3子程序调试步骤 (9)4.4调试结果 (10)4.5系统误差及性能分析 (10)5详细仪器清单 (11)6设计总结 (12)参考文献 (12)附录一:程序 (13)附录二:整体电路图 (18)简易自动打铃系统设计要求1、基本计时和显示功能(12小时制)。
可设置当前时间(包括上下午标志,时、分的数字显示)。
2、能实现基本打铃功能,规定:上午7:45早自习打铃3秒、停1秒、再打铃3秒。
下午10:00熄灯打铃3秒、停1秒、再打铃3秒。
1方案论证与对比1.1方案一采用时钟芯片和键盘实现功能,原理框图如图1-1所示:图1-1 采用时钟芯片和键盘实现功能该系统采用DS1302对时、分、秒计时和设置打铃时间,采用三线串行数据传输接口与STC89C52进行同步通信,用矩阵键盘来设置时间值,并通过8255芯片读入设置值,最后通过89C52单片机综合控制,把当前时间送到数码管显示,到点把信号送入蜂鸣器,实现打铃。
1.2方案二采用中断定时实现功能,原理框图如图1-2所示:图1-2 采用中断定时实现功能该系统以STC89C52单片机为核心控制部件。
用8255做I/O扩展芯片,数码管接8255的PA、PB引脚,用动态扫描的方式显示当前时间。
蜂鸣器与单片机的P2.0口相连,当到打铃时间时,由STC89C52发出打铃指令,以外部INT0和INT1中断按钮实现调时功能。
1.3方案比较本设计要求能实现基本计时和打铃功能。
计时和打铃时间设计,方案一中用到了DS1302时钟芯片计时和打铃时间设置;方案二中采用定时器中断计时并结合软件设置打铃时间。
上述两种方案中:方案一的外围电路硬件设计复杂,而且时钟芯片没有得到充分利用,而方案二的软件计时具有硬件开销小,成本低,外围电路设计简单等优点。
对于调时设计,方案一中用矩阵键盘实现调时功能;方案二中采用外部中断0和外部中断1的两个按钮来实现调时。
上述两种方案中:方案一的软件设计比方案二难度系数大,使程序易读性弱。
综合对计时的精密程度要求不高的本系统,本设计采用方案二来实现其功能。
2单元电路设计与论证2.1中断和复位电路设计利用按键实现中断电路如图2-1所示:图 2-1 中断和复位电路图2.2电源电路设计利用USB接口供电,电路图如2-2所示:图 2-2 电源电路图2.3单片机、I/O拓展STC89C52RC是一个低功耗,高性能CMOS 8位单片机,片内含8k BytesISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51(单片微型计算机)指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash 存储单元,功能强大的微型计算机的STC89C52可为许多嵌入式控制应用系统提供高性价比的解决方案。
STC89C52具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时/计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
主要特性如下:●与MCS-51 兼容●8k可反复擦写(>1000次)Flash ROM●全静态工作:0Hz~24MHz●三级程序存储器锁定●256*8位内部RAM●32可编程I/O线●2个16位可编程定时/计数器●5个中断源●可编程串行通道●低功耗的空闲和掉电模式I/O拓展采用8255芯片,晶振采用12M,单片机用STC89C52,电路如图2-3所示:图 2-3 主控电路图2.4打铃电路设计图2-4打铃电路图2.5数码管电路设计8255的PA口控制数码管的位选,低电平有效,PB口做为段选输出,接1K欧姆的限流电阻。
如图2-5所示:图 2-5 数码管电路图3系统软件工作流程图3.1主程序工作流程主程序首先设置8255的模式,并打开外部中断0,设置其为边沿触发模式;其次在while()循环中执行读秒显示子程序,当定时器满一秒时,在显示缓冲区中加一,等待送入数码管显示;再次按键扫描子程序,如果有外部中断0或外部中断1按钮被按下时,则转入相应功能的子程序中;最后如果当前显示时间满足预设打铃条件,通过打铃判断子程序跳入对应的打铃方式中执行。
详细主程序见附录二,主程序流程图如图3-1.:图3-1 主程序流程图3.2定时器中断显示子程序此子程序为本设计的核心之一,首先初始化定时器T0,设置T0为工作方式1,其初始值为3CB0H(既每次溢出定时50ms),并对其循环20次,然后把时间加一秒,并送入显示缓冲区等待显示。
显示时,先取出内在地址中的数据,然后查得对应的显示用段码从PB口输出,PA口将对应的数码管选中供电,就能显示缓冲区中的数据值。
为了显示秒位和上下午标志在数码管显示上特加了“—”、“A”、“P”这三个特殊字符字。
程序流程图如图3-2:图3-2 定时器中断显示子程序流程图3.3中断服务子程序此子程序是为调时服务的,首先初始化定时器T1,设置T1为工作方式1,其初始值为3CB0H(既每次溢出为50ms),并对其循环8次,然后使数码管被选中的调时位闪烁,子程序流程图如图3-3所示:图3-3 T1中断服务流程图3.4时间设定子程序时间设定模块的设计要点是按键的去抖动处理与“一键多态”的处理。
即只涉及2个键完成了6位时间参数的设定。
“一键多态”即多种功能的实现是根据按键时刻的系统状态,来决定按键采取何种功能。
图3-4 键盘扫描子程序流程图4系统功能实际测试4.1程序实际编译测试在Keil C51编译环境下编译过程中所产生的误差主要是在重装初值的过程中大约需要8个机器周期,本设计采用在程序开始时对定时器赋初值多加8个机器周期来消除此误差。
最后在Keil C51编译环境下编译通过,0警告,0错误。
实际效果图如下图4-1所示:图4-1 实际效果图4.2软件调试步骤1、打开软件后,在Project菜单中选择New Project命令,打开一个新项目。
保存此项目,输入工程文件名后,并保存工程文件的目录。
2、为项目文件选择一个目标器件,即选择8051的类型。
在Data base列表杠框中选择“ATMEL 89C52”,然后确定。
3、上述设置好后,创建源程序文件并输入程序代码。
输入代码后点击“文件/保存”。
4、把源文件添加到项目中,用鼠标指在目标工作区的目标1,点击右键在弹出的菜单中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到项目中的文件。
5、开始编译,对项目文件进行编译。
若没有错误后进行硬件测试。
4.3子程序调试步骤子程序高度应一个模块一个模块地进行,首先单独高度各功能子程序,检查程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来进行总调试。
故调试步骤如下:1、蜂鸣器的调试:调试方法:先把打铃程序下载到单片机,让峰鸣器发声,看是否在正确的时间内实现打铃。
2、数码管程序调试:正确的的显示时间是整个程序的关键之一。
调试方法:先把程序调试到单片机,让数码管显示,是否正确的显示时间的变化。
3、键盘调时程序:正确的显示所调的时间是整个程序的关键之一。
调试方法:先把键盘程序和显示程序下载到单片机,让数码管显示,是否正确的所调的时间的变化。
4.4调试结果实现计时和显示功能(12小时制),可设置当前时间(包括上下午标志,时、分的数字显示),能在上午7:45和下午10:00定点打铃,且每次打铃均为响铃3秒,停1秒,再响3秒。
4.5系统误差及性能分析经测试此简易自动打铃系统在一天内会出现时间误差,该误差主要是于由晶振自身的误差所造成的。
另外在中断的过程中,只会在第一次计时时产生时间的偏移,而它所产生累积误差很小,可以忽略。
5详细仪器清单6设计总结通过这次课程设计,我们得到了很多收获和体会,懂得了团队合作的重要性和必要性,以及工程设计的大体过程。
第一,巩固和加深了对单片机基本知识的理解,提高了综合应用所学知识的能力。
第二,增强了根据课程需要选修参考资料,查阅手册,图表和文献资料的自学能力。
通过独立思考,深入研究有关问题,学会了自己分析解决问题的方法。
第三,通过实际方案的分析比较,设计计算,安装调试等环节,初步掌握了简单使用电路的分析方法和工程设计方法。
第四,在这次课程设计过程中,光有理论知识是不够的,还必须懂一些实践中的知识,所以在课程设计的实践中,我们应将实验课和课堂教学结合起来,锻炼自己的理论联系实际的能力与实际动手能力。
第五,掌握了比较常用的实验仪器的使用方法,提高了动手能力。
第六,培养了严谨的工作作风和科学态度。
总之这次课程设计,培养了我们综合应用单片机原理及应用的理论知识和理论联系实际的能力;在设计的过程中,还培养了我们的团队精神,同学共同合作,一齐商量讨论,解决了许多实际问题。
这一切都令我们受益匪浅,在今后的学习工作中我们会一如既往,不断努力,提高自己的实际动手能力。
参考文献[1] 张鑫.单片机原理及应用[M].北京:电子工业出版社,2005.8.[2] 邱关源、罗先觉.电路[M].北京:高等教育出版社,2006.5.[3] 康光华.电子技术基础.数字部分[M].北京:高等教育出版社,2006.1.[4] 康光华.电子技术基础.模拟部分[M].北京:高等教育出版社,2006.1.[5] 祁伟, 杨亭. 单片机C51程序设计教程与实验[M].北京:北京航空航天大学出版社,2006.[6] 楼然苗.李光飞.单片机课程设计指导[M].北京:北京航空航天大学出版社,2007.4[7] 单片机学习网附录一:程序#include "reg52.h"#include<ABSACC.H>#define PA XBYTE[0xD1FF] /*PA口地址*/#define PB XBYTE[0xD2FF] /*PB口地址*/#define PC XBYTE[0xD5FF] /*PC口地址*/#define CON XBYTE[0xD7FF] /*控制字地址*/#define uchar unsigned charCode char dis_7[14]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xBA,0x20,0x28,0xff,0x7f,0x30,0x7 0};/* 共阳LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" "A" "P"*/code char scan_con[8]={0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xBF,0x7f}; // 列扫描控制字data char disdata[8]={0x00,0x05,0x04,0x04,0x0b,0x07,0x00,0x0c};//计时单元数据初值,共6个data char dis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00};//显示单元数据,共6个数据data char con1s=0x00,con04s=0x00,con=0x00,con05s=0x00,d=0x00;//1秒定时用sbit key0=P3^2; //移位键sbit key1=P3^3; // 加一sbit BEEP=P2^0; //蜂鸣器接口/****************///1毫秒延时程序///***************/delay1ms(int t){int i,j;for(i=0;i<t;i++)for(j=0;j<120;j++);}/***********///扫描程序///**********/scan(){char k;for(k=0;k<6;k++){CON=0X89;PB=dis_7[dis[k]];PA=scan_con[k];delay1ms(1);PA=0xff;}/*****************///键盘调时程序///******************/keyscan(){EA=0;if(key0==0){delay1ms(10);while(key0==0);if(dis[con]==10){dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];} con++;TR0=0;ET0=0;TR1=1;ET1=1;if(con>=6){con=0;TR1=0;ET1=0;TR0=1;ET0=1;}}if(con>=0){if(key1==0){delay1ms(10);while(key1==0);d=con+2;disdata[d]++;if(disdata[d]>=14){disdata[d]=0;}dis[con]=disdata[d];dis[6]=0x0a;}}EA=1;}/************/// 打铃程序//*************/Play1(){uchar i,t;for(i=0;i<100;i++){BEEP=~BEEP;delay1ms(t);}BEEP=1;Play2(){ BEEP=1; }bell(){if((disdata[0]==0x00||disdata[0]==0x01||disdata[0]==0x02)&&disdata[1]==0x00&&disdata[2]==0x05&&disdata[3]==0x04&&disdata[5]==0x07&& disdata[6]==0x00&&disdata[7]==0x0c||(disdata[0]==0x00||disdata[0]==0x01||disdata[0]==0x02)&&disdata[1]==0x00&&disdata[2]==0x00&&disdata[3]==0x00&&di sdata[5]==0x00&&disdata[6]==0x01&&disdata[7]==0x0d){ Play1();}if((disdata[0]==0x03||disdata[0]==0x04)&&disdata[1]==0x00&&disdata[2]==0x05&&dis data[3]==0x04&&disdata[5]==0x07&&disdata[6]==0x00&&disdata[7]==0x0c||(disdata[0]==0x03||disdata[0]==0x04)&&disdata[1]==0x00&&disdata[2]==0x00&&disd ata[3]==0x00&&disdata[5]==0x00&&disdata[6]==0x01&&disdata[7]==0x0d) {Play2();}if((disdata[0]==0x05||disdata[0]==0x06||disdata[0]==0x07)&&disdata[1]==0x00&&disdata[2]==0x05&&disdata[3]==0x04&&disdata[5]==0x07&&disdata[6]==0x00&& disdata[7]==0x0c||(disdata[0]==0x05||disdata[0]==0x06||disdata[0]==0x07)&&disdata[1]= =0x00&&disdata[2]==0x00&&disdata[3]==0x00&&disdata[5]==0x00&&disdata[6]==0x01&& disdata[7]==0x0d){Play1();}}/************///初始化程序///*************/clearmen(){int i;for(i=0;i<6;i++){dis[i]=disdata[i];}TH0=0x3C;TL0=0xB0;// ;50MS定时初值(T0计时用)TH1=0x3C;TL1=0xB0;// ;50MS定时初值(T1计时用)TMOD=0X01;ET0=1;ET1=1;TR1=0;TR0=1;EA=1;}/**********///主程序///*********/main(){clearmen();while(1){scan();keyscan();bell() ;}}/********************///1秒中断处理程序///*******************/void time_intt0(void) interrupt 1{ET0=0;TR0=0;TH0=0x3C;TL0=0xB0;TR0=1;con1s++;con05s=con1s%10;if(con05s==0){disdata[4]--;if( disdata[4]==9){disdata[4]=11;}if(con1s==20){con1s=0x00;disdata[0]++;if(disdata[0]>=10){disdata[0]=0;disdata[1]++;if(disdata[1]>=6){disdata[1]=0;disdata[2]++;if(disdata[2]>=10){disdata[2]=0;disdata[3]++;if(disdata[3]>=6){disdata[3]=0;disdata[5]++;if(disdata[5]>=10){disdata[5]=0;disdata[6]++;}if(disdata[6]==1 ){if(disdata[5]==2){disdata[5]=0;disdata[6]=0;disdata[7]++;if(disdata[7]==14){ disdata[7]=12;}}}}}}}}dis[0]=disdata[2];dis[1]=disdata[3];dis[3]=disdata[5];dis[4]=disdata[6];dis[2]=disdata[4];dis[5]=disdata[7];}ET0=1;}/********************///0.4秒闪烁中断程序///*******************/void time_intt1(void) interrupt 3{EA=0;TR1=0;TH1=0x3C;TL1=0xB0;TR1=1;con04s++;if(con04s==8){con04s=0x00;dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];}EA=1;}附录二:整体电路图。