基于STC89S52单片机开发板的功能设计与应用.docx
- 文档编号:30419392
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:19
- 大小:253.88KB
基于STC89S52单片机开发板的功能设计与应用.docx
《基于STC89S52单片机开发板的功能设计与应用.docx》由会员分享,可在线阅读,更多相关《基于STC89S52单片机开发板的功能设计与应用.docx(19页珍藏版)》请在冰豆网上搜索。
基于STC89S52单片机开发板的功能设计与应用
广西大学行健文理学院
单片机应用综合实验报告
题目:
基于STC89S52单片机开发板的功能设计与应用
学部:
理工学部
班级:
电气092班
姓名:
学号:
0938170214
指导教师:
撰写日期:
2012年4月
目录
第一章课程设计要求及功能说明1
1.1课程设计要求1
1.2课程设计电路及功能说明2
第二章程序设计及结果分析3
2.1程序设计思想3
2.2调试析及问题解答3
单片机综合应用实验设计总结6
第一章课程设计要求及功能说明
1.1课程设计要求
用四位数码管实现分计时,显示分秒,可以任意设置时间。
1.2课程设计电路及功能说明
1.2.1设计电路
(见下图)
1.2.2功能说明
本作品四位数码管显示分计时,显示分秒;四位数码管显示分倒计时,显示分秒。
四个独立按键(S1、S2、S3、S4)进行功能控制。
S1为功能转换按键,按下一次为倒计时功能,按下两次为计时功能。
S2、S3为计时与倒计时设置时间按键,S2每按下一次秒加1,S3每按下一次秒减一,S4为计时与倒计时开始于暂停按键。
另有蜂鸣器报警,设置时间时,每按下一次功能按键,蜂鸣器响一次;倒计时功能下,当计时少于10秒时,蜂鸣器报警。
电路原理图:
第二章程序设计及结果分析
2.1程序设计思想
计时器的基本功能是计时与倒计时,由按键控制计时与倒计时功能的切换以及计时、倒计时的计数初值,数码管予以显示。
通过程序把按键输入的命令给程序中修改时间函数,函数对按键做出反应并判断,进行功能的转换,计数初值的修改以及启停,利用中断进行高精度计时与倒计时,。
当按键输入不正确时,函数不做任何反应,保持计时倒计时的正常进行以及保证功能的稳定性。
2.2调试结果分析及问题解答
由于是利用开发板进行的程序设计,没有涉及到硬件的制作,所以在此测试硬件不在赘述。
程序的编辑在KeiluVision4中进行,当编辑好后,我们可以运行链接一下,有错误必须修改,如程序格式错误、语法错误、括号不匹配等,一般的语法错误还是很容易排除的,关键难的是找出逻辑错误,我们可以进入软件提供的DEBUG选项来调试,可以单步运行也可以设置中断点,由此我们可以看出程序运行的步骤和过程,也可以看到左边框的REGISTER选项有个寄存器在运行中值得变化情况,以便我们分析程序运行的具体情况,一般调试没错误我们就可以把程序编译生成16进制文件,由下载软件下载到单片机中验证,如没有得到想到的结果,继续修改程序,继续下载,直到调试到正确的结果为止。
程序编译结果图如下:
程序流程图如下:
N
在程序编译测试完成且正确后,我们将开发板连接到电脑上,运用STC_ISP_V3.1进行程序的下载烧写。
整个程序的精髓在中断服务函数的应用。
中断是CPU与外设交换信息的一种方式。
CPU在执行正常程序的过程中,当某些随机的异常事件或者某种外部请求产生时,CPU将暂时中断正在执行的正常程序,而转去执行对异常事件或者某种外部请求的处理操作,当处理完毕后,CPU再回到暂时中断的程序,接着往下继续执行。
中断处理过程示意图:
主程序
中断请求
中断服务程序
中断响应
中断返回
MCS-52系列单片机的中断系统它是由中断源、中断标志、中断允许控制、中断优先级控制、中断查询硬件以及相应的特殊功能寄存器组成。
相应的特殊功能寄存器TCON和SCON用来存储来自中断源的请求标志,IE为中断允许寄存器、IP为中断优先级控制寄存器。
单片机综合应用实验设计总结
虽然上述程序能实现计时与倒计时的基本功能,但不算完善,并未考虑各种异常情况的出现,比如在计时与倒计时的过程中,数码管已经显示其功能,而在按下设置初值按键的时候仍修改在运行中的数字的值,从而造成计时与倒计时的计数错误。
又比如计时功能清零的功能处理不好,在计时完成后的清零需要通过其功能转换清零,或者复位清零。
给使用带来许多麻烦。
在按键的功能控制处理上不是最优,功能拓展受到极大的限制以及资源的浪费。
如果增加硬件,那么就会增加成本,这是不符合设计要求的。
不过在实际应用中可以根据实际情况进行完善。
如果充分理解了上述程序,那么在原有的硬件及其软件基础上设计更好的程序在单片机上使其具有更强大,更完善的功能是完全可以的。
两周的单片机综合应用实验设计结束了,我由理论再次走向了实践。
在自己动手的过程中,再次学习了单片机开发的基本流程及其PROTEL绘制原理图的过程,加深了印象。
由于程序设计是基于开发板上的,所以我没能再次体会到硬件调试的痛苦,只有软件调试的纠结。
从这次设计使我又一次感受到了设计开发的痛苦,在这个设计上,软件的编写实现其功能对我来说是个不小的挑战,由于在软件设计方面,由于我大量采用AVR单片机程序设计语言,在Keil程序设计中,程序略显复杂、繁赘,程序中的许多问题从简单变复杂化,逻辑操作大量使用,实际局部增加了程序的可读性,加大了程序修改的难度,段声明处理不得当,导致程序编译后出现警告,在中断处理方面不成熟,导致程序跳不出中断等等。
不过再解决问题后,得出一点成果之后还是很有成就感和满足感的,从这次的编程过程学会了在写程序的时候很多地方自己要标注清楚,方便在以后使用,同时也提高了程序的可读性,觉得自己最大的收获是自己把AVR和51、52系列单片机部分编程语言结合起来,实现了部分通用,这让我这今后的学习开发中得到极大的便利,也使得在两者之间的程序移植方便,处理起来更为得心应手。
回顾这次课程设计的过程,自己还是学到了相当多的知识,对发光二极管的点亮与熄灭,数码管的静态显示和动态显示以及对其段选和位选的操作,矩阵按键的扫描和独立按键的运用,更重要的是对单片机中断的理解以及应用等等。
这些都为以后更好的设计开发新作品打下了良好的基础。
此次课程设计由浅入深,由易向难,曾经许多被遗忘得知识被再次得以巩固,这是值得高兴的,不过不能仅仅满足于此,因为这只是些51、52系列单片机的入门操作而已,还有许多知识等待着我只掌握和运用。
比如:
1602液晶的操作,外部存储器的扩展,串行接口的应用,中断的嵌套使用等等,我只是学会了一些皮毛。
像“看门狗”,之类的我至今没有接触到,所以在今后的学习开发中还要下更大的力气去学习掌握,不能满足于一点点成就和满足而停滞不前。
我是电气工程及其自动化专业学生,学好自动化是应该也是必须的。
自动化学科有着光荣的历史和重要的地位,20世纪50年代我国政府就十分重视自动化学科的发展和自动化人才的培养,五十多年来,自动化科学技术在众多领域发挥了重大的作用,如航空、航天等,“两弹一星”的伟大工程就包含了许多自动化科学技术的成果。
不论是石油化工、电力、钢铁,还是轻工、建材、医药领域都要用到自动化手段,在国防工业中自动化的作用更是巨大的。
现在世界上有很多非常活跃的领域都离不开自动化技术,比如机器人、月球车等。
此外,自动化学科对一些交叉学科的发展同样起到了积极的促进作用,例如网络控制、量子控制、流媒体控制、生物信息学、系统生物学等等学科就是在系统论、控制论、信息论的影响下得到不断的发展。
在整个世界已经进入信息时代的背景下,作为一名电气工程及其自动化专业的学生务必要学好自动化学科。
同时作为一名当代大学生,要努力学好自己的专业知识,为成为一名有用的自动化专业人才而努力奋斗。
至此,该学期课程设计已经结束,回顾这次课设的过程,得到很多同学的支持,感谢他们帮我指正设计制作中的错误及在程序编写的时候出显的语法错误,及我向他们请教他们给我的准确回答,使我顺利了完成了程序的编写调试。
感谢同学为我们发放开发板。
在这里我要向唐琳老师和赵玲峰老师表示真挚的感谢,感谢老师们授予我知识,以及为我的程序错误做耐心的解答并提出解决方法,正是得到了这么多帮助使我成功的完成了此次课程设计。
总结人:
2012.4.22
程序源码:
/***************************************************************
计时与倒计时功能转换设置秒初值4位数码管显示
***************************************************************/
#include
#include
/***********程序头文件***********/
#defineucharunsignedchar
#defineuintunsignedint
#defineBIT(x)(1<<(x))//定义位操作
/***********宏定义***********/
voidDelayms(uintms);
voidInit_system(void);
voidEnable_Time0_Init(void);
voidDisplay(void);
ucharkey_press();
unsignedcharkey_scan();
voidTIME1_OVF_ISR(void);
voidchange_time(void);
/***********函数声明***********/
ucharcodeSMG[10]={0X3F,/*0*///数码管字符表
0X06,/*1*/
0X5B,/*2*/
0X4F,/*3*/
0X66,/*4*/
0X6D,/*5*/
0X7D,/*6*/
0X07,/*7*/
0X7F,/*8*/
0X6F,/*9*/};
ucharminute,second,set,jishi,stop,num,time[3];//分秒时变量定义
voidDelayms(uintms)//毫秒级延时函数
{
uinti,j;
for(i=0;i for(j=0;j<110;j++); } voidInit_system(void)//系统初始化 { P0=0XFF; P3=0XF0; jishi=0; } voidEnable_Time0_Init(void)//定时器0初始化 { TR0=~TR0; } voidTime0_Init() { TMOD=0X01;//工作模式选择 TH0=0X3C; TL0=0XB0; IE=0X82; } voidDisplay(void)//显示正常状态 { uinti,dx[4]; time[0]=minute/10; time[1]=minute%10; time[2]=second/10; time[3]=second%10; for(i=0;i<4;i++) dx[i]=SMG[time[i]]; P0=dx[0]; P2|=BIT(6);//开段选 P2&=~BIT(6); P2|=BIT(7);//开位选 P0=0XFE;//11111110 P2&=~BIT(7); Delayms(5); P0=dx[1]; P2|=BIT(6);//开段选 P2&=~BIT(6); P2|=BIT(7);//开位选 P0=0XFD;//11111101 P2&=~BIT(7); Delayms(5); P0=dx[2]; P2|=BIT(6);//开段选 P2&=~BIT(6); P2|=BIT(7);//开位选 P0=0XFB;//11111011 P2&=~BIT(7); Delayms(5); P0=dx[3]; P2|=BIT(6);//开段选 P2&=~BIT(6); P2|=BIT(7);//开位选 P0=0XF7;//11110111 P2&=~BIT(7); Delayms(5); } ucharkey_press()//检查是否按键按下 { ucharj; P3=0XF0; j=P3; j=j&0XF0; if(j! =0XF0) { Delayms(10);//消抖 } if(j! =0XF0) { return1; } else { return0; } } unsignedcharkey_scan()//扫描按键的值 { unsignedcharkey; Delayms(10);//延时消抖 if(key_press()) { key=P3; key&=0XF0; switch(key) { case0XE0: key=1; break; case0XD0: key=2; break; case0XB0: key=3; break; case0X70: key=4; break; default: key=16; } while(key_press());//等待按键释放 } else { key=16; } returnkey; } voidchange_time(void)//修改时间函数 { ucharKEY; KEY=key_scan(); if(KEY==1) { second=0; minute=0; jishi=0; P2|=BIT(3); TR0=0; set++; if(set>1) set=0; } if(set==0)//1键按下一次后,进入倒计时模式 { if(KEY==2)//2键按下秒加1 { second++; } if(KEY==3)//3键按下秒减1 { if(second>0) second--; } if(KEY==4) { jishi=1; Enable_Time0_Init();//开始暂停 } } if(set==1)//1按键按下两次后,进入计时模式 { if(KEY==2)//设置计时起始数值 second++; if(KEY==3) { if(second>0) second--; } if(KEY==4) { jishi=2; Enable_Time0_Init();//开始暂停 } } } voidmain()//主函数 { Init_system();//初始化端口 Time0_Init(); while (1) { Display();//正常显示 if(key_press())//如果有按键按下 { change_time();//修改时间函数 } } } voidTIME1_OVF_ISR(void)interrupt1//定时计数器0溢出服务程序 { TH0=0X3C; TL0=0XB0; if(++num==20) { num=0; if(jishi==2)//计时 { if(++second>=60) { second=0; if(++minute>=60) { minute=0; second=0; } } } if((jishi==1)&&(second>0||minute>0))//倒计时 { if(second>0) second--; elseif(second==0||minute>0) { second=59; minute--; } if(second==0&&minute==0) { TR0=0; P2|=BIT(3); jishi=0; } } if((jishi==1)&&(minute==0)&&(second<=10))//报警 { P2&=~BIT(3); } else { P2|=BIT(3); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89S52 单片机 开发 功能设计 应用