基于c语言单片机倒数计时器课程设计.docx
《基于c语言单片机倒数计时器课程设计.docx》由会员分享,可在线阅读,更多相关《基于c语言单片机倒数计时器课程设计.docx(15页珍藏版)》请在冰点文库上搜索。
基于c语言单片机倒数计时器课程设计
课程设计报告
课程名称:
单片机
报告题目:
倒数计数器
学生姓名:
所在学院:
专业班级:
学生学号:
14
指导教师:
2013年12月25日
课程设计任务书
报告题目
倒数计数器
完成时间
12,25
学生姓名
专业班级
指导教师
职称
讲师
总体设计要求和技术要点
1.任务
利用AT89C51单片机设计一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。
做一小段时间倒计数,当倒计数为0时,则发出声响,通知倒计数终了。
2.要求
(1)显示格式为“分分:
秒秒”。
(2)用4个按键操作来设置当前想要倒计数的时间。
一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声。
(3)程序执行后工作指示灯LED闪动,表示程序开始执行,按下操作键K1~K4动作如下。
⏹K1—可调整倒计数的时间1~60分钟。
⏹K2—设置倒计数的时间为5分钟,显示“0500”。
⏹K3—设置倒计数的时间为10分钟,显示“1000”。
⏹K4—设置倒计数的时间为20分钟,显示“2000”。
工作内容及时间进度安排
17周-18周周一到周五,上午8:
00-11:
40,下午2:
00-5:
40。
(1)17周周一:
学生选题,明确任务,指导教师对课题进行讲解,资料检索,。
(2)17周周二:
硬件设计
(3)17周周三:
硬件仿真
(4)17周周四:
软件设计
(5)17周周五:
软件设计
(6)18周周一:
软件设计
(7)18周周二:
综合调试
(8)18周周三:
书写课程设计报告
(9)18周周四:
书写课程设计报告
(10)18周周五:
答辩评分
课程设计成果
1.与设计内容对应的软件程序
2.课程设计总结报告
摘要
本设计是基于AT89C51单片机的倒数计数器,根据单片机技术原理,主要通过软件设计,制作出的倒数计数器能稳定运行,并当计数完成时能发出声音.本设计主要用到数码管,LED灯,键盘,蜂鸣器,定时器/计数器等学习单片机中所必须掌握的部分.利用KeiluVision4作为编程软件进行源程序设计及调试。
同时利用STC-ISP-V483作为程序下载器,将源程序烧入单片机中。
关键词:
单片机键盘计数器蜂鸣器LED灯数码管
目录
一、概述…………………………………………………………………………1
二、设计方案………………………………………………………………2
1方案总体思路…………………………………………………………………2
2.程序流程图……………………………………………………………………2
三、程序…………………………………………………………3
四、总原理图及元器件清单……………………………………………………4
五、结论与心得………………………………………………………………………6
六、参考文献……………………………………………………………………6
一、概述
单片机是20世纪中期发展起来的一种面向控制的大规模集成电路模块,具有功能强、体积小、可靠性高、价格低廉等特点,在工业控制、数据采集、智能仪表、机电一体化、家用电器等领域得到了广泛的应用,极大的提高了这些领域的技术水平和自动化程度。
AT89C51是一种低功耗、高性能CMOS8位微控制器,具有8K在线系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
本例利用AT89C51单片机设计一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。
做一小段时间倒计数,当倒计数为0时,则发出声响,通知倒计数终了。
二、设计方案
1.方案总体思路
用8051单片机控制程序执行,通过LED动态扫描来显示倒计时。
买次执行中断时判断计时是否继续倒计时,同时通过按键扫描的方式来判断是否有输入更改倒计时的控制信息。
通过单片机的处理来达到对倒计时的更新,当倒计时结束时来驱动蜂鸣器发出响声。
2.程序流程图
v
三、程序
C语言比汇编语言简洁紧凑,灵活方便,语法限制不太严格,自由度大,本例采用C语言进行程序编写。
#include
#defineucharunsignedchar
#defineuintunsignedint
voiddiyi();//函数声明
voidxianshi();//函数声明
voidpanduan();//函数声明
voiddelay(ucharz);//函数声明
uchart=10,m=0,a,temp,b;//定义相关变量
ucharcodeat[]={0xe0,0xd0,0xb0,0x70};
ucharcodeas[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
ucharcodebs[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//数组定义
voidmain()//主函数
{
diyi();//调用定义函数
EA=0;//关闭中断
while
(1)
{
panduan();//调用判断函数
if(b==1)
xianshi();//调用显示函数
}
}
voiddiyi()//定义定义子函数
{
P2=0xbf;P0=0xbf;P2=0x9f;P0=0xff;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidexer1()interrupt1//定义定时器/计数器子函数
{
uchart1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t1++;
if(t1==10)
{P2=0x9f;P0=0x00;}
if(t1==20)
{
P2=0x9f;P0=0xff;//LED灯闪烁
t1=0;
if(t==0)
{
if((m==0))
{
P2=0xbf;P0=0xff;P2=0x9f;P0=0xff;//定时时间到了打开蜂鸣器关闭LED灯
P2=0xdf;P0=bs[4];P2=0x1f;P0=0xff;P2=0xff;P0=0xff;P2=0x1f;P0=0x00;
b=0;
EA=0;
}
if(m!
=0)
{
t=60;m--;
}
}
t--;
}
}
voidxianshi()//定义显示子函数
{
P2=0xdf;P0=bs[0];P2=0x1f;P0=0xff;P2=0xff;P0=as[t%10];P2=0x1f;P0=0x00;delay(3);
P2=0xdf;P0=bs[1];P2=0x1f;P0=0xff;P2=0xff;P0=as[(t/10)%10];P2=0x1f;P0=0x00;delay(3);
P2=0xdf;P0=bs[2];P2=0x1f;P0=0xff;P2=0xff;P0=0xbf;P2=0x1f;P0=0x00;delay(3);
P2=0xdf;P0=bs[3];P2=0x1f;P0=0xff;P2=0xff;P0=as[m%10];P2=0x1f;P0=0x00;delay(3);
P2=0xdf;P0=bs[4];P2=0x1f;P0=0xff;P2=0xff;P0=as[(m/10)%10];P2=0x1f;P0=0x00;delay(3);
}
voiddelay(ucharz)//延时子函数
{
uchari,j;
for(i=0;ifor(j=0;j<110;j++);
}
voidpanduan()//判断子函数
{
P3=0xfd;
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
if(temp!
=0xfd)
{
P2=0xc0;P0=bs[4];P2=0x00;P0=0xff;P2=0xe0;P0=0xff;P2=0x00;P0=0x00;delay(3);
while(P3!
=0xfd);//判断是否有键按下及格键功能
if(temp==at[0])
{a=1;EA=0;m++;if(m==60)m=0;t=0;P2=0x9f;P0=0xff;P2=0xbf;P0=0xbf;b=1;}
if(temp==at[1])
{
if(a==1)
{EA=1;a=0;m=5;t=0;P2=0x9f;P0=0xff;}
}
if(temp==at[2])
{
if(a==1)
{EA=1;a=0;m=10;t=0;P2=0x9f;P0=0xff;}
}
}
}
P3=0xfe;
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
if(temp!
=0xfe)
{
P2=0xc0;P0=bs[4];P2=0x00;P0=0xff;P2=0xe0;P0=0xff;P2=0x00;P0=0x00;delay(3);
while(P3!
=0xfe);//判断是否有键按下及格键功能
if(temp==at[0])
{
if(a==1)
{EA=1;a=0;m=20;t=0;P2=0x9f;P0=0xff;}
}
P2=0xc0;P0=bs[4];P2=0x00;P0=0xff;P2=0xe0;P0=0xff;P2=0x00;P0=0x00;delay(3);
}
}
}
1.总原理图
1,单片机电路
2,按键电路
3,LED灯及数码管电路
五、结论与心得
在此次单片机项目设计的过程中,我进一步认识到全面专业知识以及逻辑思考方式对研究问题的重要性,以及成功最重要的一块敲门砖是不妥协,不放弃!
在这过程中书到用时方恨少,天下还是好人多——同学和老师的帮助给了我莫大的动力。
在这两周周中,有时一天中翻专业书的次数比前三周理论学习时合起来翻的次数都多,对理论联系实际的重要性有了更新的领悟。
通过请教他人加上自己的理解,并与所学的知识紧密相结合,我相信这过程必然对我今后的学习和工作产生积极的影响。
除了获取新的知识,深感巩固旧的学问也很重要,尤其是结合了这几年学的相关的专业知识,对各门课都做一个全面的温习,才不用带着书柜跑。
这不仅对我现在的学习乃至今后的工作都会有很大的帮助。
通过此次多功能数字计数器的设计制作,我们将从书本上学到的知识应用于实践,再次巩固了我的单片机知识。
虽然设计过程中遇到了很多困难,但是在解决这些问题的过程无疑是对自身专业素质的提高。
当最终调试成功的时候也是对自己的一种肯定。
此次的设计不仅增强了自己在专业设计方面的信息,鼓舞了自己,更是一次兴趣的培养,为以后的学习方向明确了重点。
另外在这次设计中我们遇到了不少的问题,针对不同的问题我们采取不同的解决方法,最终一一解决了。
在我们遇到不懂得问题时,利用课本上、参考书上的知识,以及网上的资料最终解决问题。
和队友之间相互讨论,明白了团队合作的重要性。
本次项目设计还存在很多不足,比如,计数功能也不够详细等。
以后争取完善这个设计,以提高我们的单片机设计能力。
这里很感谢李晓艳老师给我们的指导和教育,感谢她给我们提供了良好的学习设计环境,也很感谢可爱的伙伴们,让我觉得团队的力量很伟大。
希望老师给以评点和支持,我将在今后朝着这些方向学习奋斗。
六、参考文献
【3】张毅刚,彭喜元,彭宇.单片机原理及应用.高等教育出版社.2012,11
【2】谭浩强.C程序设计教程.清华大学出版社2011,08
【3】张永瑞.电子测量技术基础[M].西安:
西安电子科技大学出版社,2002.
【4】李春.数字频率计设计[D].北京:
邵阳电子厂,2011,02:
4页到7页;
【5】张杰,杨艳丽,马莉莉,张立倩.基于单片机C语言的数字频率计设计.
内蒙古农业大学学报,第28卷,第二期,2007年6月。
教师评语及设计成绩
教师评语:
(指导教师手写)
课程设计成绩:
指导教师:
(签名)
日期:
年月日