单片机原理及应用课程设计报告
(20##—20##学年 第一学期)
题 目 基于单片机的电子时钟设计
系 别 电子与电气工程系
专 业 通信工程
班 级 1120331
学 号
姓 名
指导教师
完成时间 20##-11-28
评定成绩
目 录
一、 设计的目的. 3
二、 设计的内容与要求. 3
三、 设计方案. 4
四、 硬件、软件设计. 4
五、 设计总结. 4
六、 参考文献. 4
一、 设计的目的
在基本掌握了《单片机原理及应用》课程知识的基础上,完成课程设计项目的设计。通过课程设计环节的训练,包括设计方案的论证、硬件设计、程序编写和设计报告的撰写,掌握单片机应用项目的设计流程和方法,加深对《单片机原理及应用》课程知识的理解和掌握,培养应用系统的设计能力,初步积累单片机系统开发经验,以及分析问题和解决问题的方法,并进一步拓宽专业知识面,培养实践应用技能和创新意识。
二、 设计的内容与要求
根据《单片机原理及应用》课程设计教学大纲、《单片机原理及应用》课程设计指导书,开展课程设计环节。有四个设计项目供选择:步进电机控制、直流电机调速、电子琴或电子时钟。
设计内容与要求:
(1)选择其中一个设计项目,进行设计方案的比较和论证,确定设计思路和方案;
(2)进行硬件设计,画出硬件结构框图,完成电路原理图的设计和元器件选型,必要时应给出重要电路参数的设计和计算过程,以及元器件参数的选型依据;
(3)编写单片机的软件程序,先理清软件设计思路并绘制程序流程图,再编写具体的汇编语言或C语言程序语句,并注释说明。
成绩评定依据:(分值百分比)
(1)确定设计思路和方案——20%;
(2)画出硬件结构框图、原理图的设计、元器件选型,给出电路参数的设计依据——30%;
(3)绘制程序流程图,再编写程序语句,并注释说明——30%;
(4)设计成果的功能完善程度、创新点、演示效果,撰写设计报告的规范性——20%。
三、 设计方案
根据定时中断的原理,数码管显示和键盘扫描电路,以及和MCS51单片机的接口方式,通过软件编程,实现时间初值设置,时钟运行和显示。
可供使用的硬件电路:
1) 七段数码管显示电路;
2) 8155和74LS164“串转并”实现的键盘扫描和数码管控制显示电路;
3) 串并转换数码管显示电路:通过74LS164实现串入并出,控制四个七段数码管的显示。MCS-51单片机有一个全双工的串行通信接口,当工作于方式0时,为同步移位寄存器输入/输出方式,常用于扩展I/O口,这时串行数据通过RxD引脚输入或输出,引脚TxD输出同步移位信号,收/发数据都为8位,低位在前,波特率为振荡频率的1/12。
七段数码管的字型代码表如下表:
四、 硬件和软件设计
1 总原理图
1-1数码管显示部分
1-2按键部分
2 操作步骤
2-1硬件操作
1)LED环境
2)PC环境
与PC联机状态,在keilc软件输入程序。点击图标,设置“输出”项。
点击图标编译文件,编译通过后,点击 图标开始调试,等待下载完成。
3)观察运行结果
点击图标用连续方法运行该程序。此时数码管上实时显示时间值。并按相关按钮对时间进行调整
4) 终止运行
按 “暂停图标”或实验箱上的“RST”按键,使系统无条件退出该程序的运行返回监控状态。
2-2软件仿真操作
1)进入Proteus仿真系统
2)点击File/Open Design,导入设计好的仿真原理图。右击AT89C51芯片,选择“Edit Properties/Program File”载入在keilc软件产生的 .HEX文件,并“OK”。
3)观察仿真结果
点击“Play”, 数码管上实时显示时间值。
3)时间调整
按“暂停/开始”按钮,数码管停止计时。按一次“选择”按钮,选中“秒”,并按“上调”或“下调”按钮调整秒;再按一次“选择”按钮,将选中“分”,按相关按钮对分上调/下调。 调整完后,再按 “暂停/开始”按钮,数码管继续实时计时。
3 程序源代码
/******************************电子时钟********************************/
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit CLK=P1^1;
sbit DIN=P1^2;
sbit k1_up=P1^3;//设置 上调 按钮
sbit k2_down=P1^4;//下调 按钮
sbit k_3=P1^5;//暂停/开始 按钮
sbit k_4=P1^6;//选择 按钮
bit flag=0;
uchar code table1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; /* 共阴极0~9 */
uchar zzq[4]={0};//显示缓存
uchar second,minute;
uchar num_stop=0,us,k_num;
void delay(uint t) //延迟子程序
{
uint j;
while(t--)
for(j=125;j>0;j--);
}
void Write_164(uchar Data)
//写入74LS164芯片
{
uchar i;
CLK =1;
for(i=0;i<8;i++)
{
if((Data>>7)&0x01)
DIN =1;
else
DIN =0;
CLK =0;
CLK =1;
Data <<=1;
}
}
void number_m_s(uchar s,char m)
{
zzq[0]=s%10;
zzq[1]=s/10;
zzq[2]=m%10;
zzq[3]=m/10;
}
void speak_164(void) //164送数
{
Write_164(table1[zzq[0]]);
Write_164(table1[zzq[1]]);
Write_164(table1[zzq[2]]|0x80);
Write_164(table1[zzq[3]]);
}
void t0_1()//T0初始化 子程序
{
TMOD=0x01; //定时器T0工作方式1
TH0=(65535-50000)/256; //50ms
TL0=(65535-50000)%256;
EA=1; //开总中断
ET0=1;
TR0=1;
}
void k_stop()//按键——暂停/开始
{
if(k_3==0)
{
delay(5);
if(k_3==0)
while(!k_3);
flag=!flag;
}
}
void choose_m_s()//按键——选择
{
if(k_4==0)
{
delay(5);
if(k_4==0)
while(!k_4);
k_num++;
if(k_num==3)
k_num=1;
}
}
void key_m_s()//按键---上/下调
{
k_stop();//暂停
while(flag)//只有在暂停状态才能调整
{
TR0=0;//停止计时
choose_m_s();//调用选择按键
if(k_num!=0)//当有按下选择键
{
if(k1_up==0)//上调
{
delay(5);
if(k1_up==0)//去抖
{
while(!k1_up); /*按键弹起有效 */
if(k_num==1) //上调秒
{
second++;
if(second==60)
second= 0;
}
if(k_num==2) //上调分
{
minute++;if(minute==60) minute= 0;
}
}
}
if(k2_down==0)//下调
{
delay(5);
if(k2_down==0)
{
while(!k2_down);
if(k_num==1) //下调秒
{
second--;
if(second==0)
second= 59;
}
if(k_num == 2) //下调分
{
minute--;
if(minute== 0)
minute=59;
}
}
}
number_m_s(second,minute);//更新数据 speak_164();//显示数据
delay(200); }
k_stop();//取消暂停
}
k_num=0;/*保证每次暂停时,都要按“选择键”才能调整*/
TR0=1; //恢复计时
}
void main()
{
t0_1(); // 定时中断
while(1)
{
key_m_s(); //按键扫描
}
}
void time0() interrupt 1 //中断服务子程序
{
TH0=(65535-50000)/256; //重新赋值
TL0=(65535-50000)%256;
us++;
if(us==20) // 1秒钟
{
second++;
if(second==60)//1分钟
{
second=0;
minute++;
if(minute==60)//1小时
minute=0;
}
us=0;
number_m_s(second,minute);/*以1秒为单位更新数据 */
speak_164();//显示数据
}
}
4 效果图
五、 设计总结
通过这几天的单片机的实训,我在理论的基础上更深刻的掌握了单片机的深层内容及实际生活中的应用,让我对这门课有了许多新的了解弥补了在课堂上学习的不足。实训锻炼了自己动手能力和思维能力,还有在软件方面的编程能力,让我受益匪浅,同时也暴露出一些平时学习上的问题,让我深刻反思。这些问题的发现将为我以后的学习和工作找明道路,查漏补缺为进一步学习作好准备。通过实训,让我懂得了如何编写一些简单的程序,学会了如何制作单片机应用程序,并且可以在今后的日常生活中灵活运用。相信这对我们以后的学习和工作都会有很大的帮助。
六、 参考文献
[1]. 单片机原理及接口技术(第二版),李全利,北京:高等教育出版社,20##年。
[2]. 单片机原理及应用(第二版),李建忠,西安:西安电子科技大学出版社,2008。
[3]. 单片机原理及应用,冯文旭等,北京:机械工业出版社,2008。
[4]. 单片机基础(第3版),李广弟等, 北京:北京航空航天大学出版社,2007。
[5]. 单片机高级教程:应用与设计(第2版),何立民,北京:北京航空航天大学出版社,2007。
第二篇:单片机原理及应用课程设计报告
《单片机原理及应用》
课程设计报告
专 业:
班 级:
姓 名:
指导教师:
二0##年十二月二十五日
单片机原理及应用课程设计任务书
一、设计题目:答辩倒计时器
二、设计目的
1、巩固和加深单片机原理课程知识的理解和运用。
2、进一步提高学生单片机应用系统的设计能力。
3、培养学生综合分析问题、发现问题和解决问题的能力。
三、设计要求
设计一个答辩倒计时器,用2位数码管显示剩余分钟,2位数码管显示剩余秒 ,复位后显示10.00表示设定10分钟,并可加减修改,按开始/取消按钮开始倒计时,再次按开始/取消按钮则复位,时间到则蜂鸣音提示。总体要求如下:
1、方案论证,确定总体电路原理图。
2、元器件选择,设计PCB图(或用万能电路实验板搭线)。
3、绘制程序流程图,编写汇编语言源程序(或C语言源程序)。
4、安装调试,实现倒计时器的基本功能。
四、可提供的主要电子元器件
1、AT89S51;7407; (均为DIP封装)
2、LED(4位一体共阴);按键;电阻排;三极管;蜂鸣器
3、石英晶振6M;30pF;0.1uF;10uF电容;电阻若干。
五、实践步骤
1、收集相关资料,完成电路原理图和应用程序流程图。
2、编写汇编语言(或C语言)源程序。
3、根据所设计的原理图,完成电路板的制作安装(可用万能板)。
4、硬件软件综合调试,并完善其设计功能。
六、实践标准
完成电路制作安装,完成程序设计并调试通过,实现其设计要求和功能,装配工艺美观,电路运行稳定、可靠。
七、设计报告总结
1、写出设计方案(包括方案对比,方案确定),给出完整的电路原理图和设计程序流程图。
2、对所设计方案的实现进行全面分析。
3、编程调试方法和程序清单。
4、安装调试过程,出现的各种现象,总结经验和体会。
5、进一步完善的设想。
目 录
一、设计题目:答辩倒计时器......................... 1
二、设计目的..................................... 1
三、设计要求..................................... 1
四、元器件清单及所用仪器设备....................... 1
五、实践步骤..................................... 3
六、实践标准..................................... 3
七、设计报告总结.................................. 3
1、写出设计方案................................ 3
3、编程调试方法................................ 7
4、安装调试过程,出现的各种现象.................. 7
5、总结经验和体会.............................. 8
6、进一步完善的设想............................ 9
参考书目:....................................... 9
附录A:仿真电路原理图............................ 10
附录B:源代码................................... 11
一、设计题目:答辩倒计时器
二、设计目的
1、巩固和加深单片机原理课程知识的理解和运用。
2、进一步提高学生单片机应用系统的设计能力。
3、培养学生综合分析问题、发现问题和解决问题的能力。
三、设计要求
设计一个答辩倒计时器,用2位数码管显示剩余分钟,2位数码管显示剩余秒 ,复位后显示10.00表示设定10分钟,并可加减修改,按开始/取消按钮开始倒计时,再次按开始/取消按钮则复位,时间到则蜂鸣音提示。总体要求如下:1、方案论证,确定总体电路原理图。
2、元器件选择,设计PCB图(或用万能电路实验板搭线)。
3、绘制程序流程图,编写汇编语言源程序(或C语言源程序)。
4、安装调试,实现倒计时器的基本功能。
四、元器件清单及所用仪器设备
表1设备清单
表2 工具清单
表3 元器件清单
五、实践步骤
1、根据实验要求,完成电路原理图和应用程序流程图。(见图1和图3)
2、C语言源程序。(见附录B)
3、根据所设计的原理图,完成电路板的焊接,在进行测试。
4、硬件软件综合调试,如果不能实行,在分析哪里出了问题,纠正问题在去测试,直到测试完成,完善其设计功能。
六、实践标准
1、完成电路的制作,排版与焊接,并进行测量是否能正常的运行;
2、完成程序的设计,并进行程序调试是否出现错误;
3、硬件与软件结合进行调试看是否能达到课程设计目的;
4、最后实现其设计要求和功能,装配工艺美观,电路运行稳定、可 靠。
七、设计报告总结
1、写出设计方案
A、设计方案:
1、根据电路要求,设计硬件电路和软件程序。(见图3)
2、对已设计出的硬件电路进行模拟仿真,确保硬件电路能正常工作。(见附录A)
3、准备好相关电子元件,制作硬件电路。(见图2)
4、将软件程序下载到已经制作好的硬件电路中调试,实现设计要求。
B、电路原理图
图1 原理图
图2 电路版式图(一)
图2 电路版式图(二)
C 硬件流程图
图3硬件流程图
D、设计程序流程图
图4程序流程图
2、对所设计方案的实现进行全面分析
A、 该硬件电路的核心部分为一块AT89S51单片机,对电路进行各方面控制和计算。用一个4位一体的8段共阴数码显示,用7407作为缓冲级,提高输出电路驱动能力,使数码管能正常显示。用一个9013三极管驱动蜂鸣器,当电路上电和计时时间到时响一秒提示时间到。用一个6M石英晶振和2个30pF的电容为AT89S51芯片提供时钟频率,2个30pF电容主要是为了方便晶振起振。K1、K2、K3、3个开关分别用于加时间、减时间、复位和开始。用若干电阻作为上拉电阻,增大电路输出电流。
B、 软件程序全部采用C语言编写。
3、编程调试方法
编程与调试是C语言和Keil C软件相结合的。C语言是一种C语言是国际上广泛流行的、很有发展前途的计算机高级语言。它适合作为系统描述语言,即可用来编写系统软件,也可用来编写应用软件。
Keill软件是一种目前用得比较广泛的一款单片机编程软件,它支持 c 和 汇编的编译,并可生成 HEX 文件,还可进行代码的软硬件仿真软件。
4、安装调试过程,出现的各种现象
硬件:
焊接中易出现虚焊,假焊和多点连接导致短路等故障;
焊接中粗心,导致某些点未焊接直接调试;
软件:
1、数码管有一位不显示。主要原因:有一位输出I/O接错(P2.7)。
2、 按键未设有防抖功能导致按下一次出现多次按下结果;
3、 定时程序,没有考虑到主函数的运行时间引起定时不是很准,稍有延 时;
4、延时函数用法不当,数码管有重影;
5、总结经验和体会
在这次课程设计中,我们运用到了以前所学的专业课知识,如:CAD制图、汇编语言、模拟和数字电路知识等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
另外,这次课程设计让我感到了团队合作的重要性。在团队中,我们互帮互助,对整个课程设计来说,这是至关重要的,缺少每一个人都会对我们的设计产生影响,组长邹威从课题的确定,元器件的分类,电路的焊接等各个方面都尽心尽责,花的心思。还有要感谢指导老师在我们遇到困难时,给予我们的建议与鼓励。
最后,要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
从选题到定稿,从理论到实践,在接近两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机C语言掌握得不好……
课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。 。
6、进一步完善的设想
A、新增一段程序,对硬件的按键进行防抖,使计时器计时更加的精确;
B、对于硬件的导线线路,尽量在线路比较短的地方不使用导线,使用焊锡进行导通,这样就会比较的美观;
C、硬件元器件的排版要进行比较的规律,尽量做到导线排版的时候不会出现重叠的现象;
D、计算每一条语句的时间,提高执行的定时器的精度。
参考书目:
[1] 赵伟军,《Protel99se教程》,北京,人民邮电出版社,1996年
[2] 楼然苗,李光飞.单片机课程设计指导[M].北京:北京航空航天大学出版社, 20##年
[3] 杨居义.单片机课程设计指导(实例教程) [M].北京:清华大学出版社, 20##年
[4] 李华.MCS-51系列单片机实用接口技术[M].北京:北京航空航天大学出版社, 1993年
[5] 唐华光,《电子技术基础》,高等教育出版社,北京,20##年
[6] 谭浩强,《C程序设计教程》,北京,清华大学出版社,20##年
附录A:仿真电路原理图
附录B:源代码
#include
#define uint unsigned int
#define uchar unsigned char
uchar code WEIMA[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar num1;
void BELL();
void Delay(uint z);
void Display(uint M1,uint M2,uint S3,uint S4);
void jishi(uint minute1,uint minute2,uint second1,uint second2);
int minute1,minute2,second1,second2,save1,save2,save3,save4;
sbit BUZZER=P1^0; //定义P1.0为喇叭驱动端
sbit t1=P3^5;//定时器T1
uint t=0;
void main()
{
uint f,w;
num1=0;
BUZZER=0;
P2=0x00;
Delay(228);
minute1=1;
minute2=second1=second2=0;
while(1)
{
EA=1;//开总中断
TCON=0x05;
if(t==15)
{
EX0=1;//开外部中断0
EX1=1;
}
else t=t+1;
t1=1;
f=0;
if(t1==0)
{
num1=0;
save1=minute1;
save2=minute2;
save3=second1;
save4=second2;
t1=1;
w=1;
}
while(w)
{
TMOD=0x01;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET0=1;
TR0=1;
if(num1==10)
{
EX0=0;//关外部中断
EX1=0;
num1=0;
if((second2==0)&&(second1==0)&&(minute2==0))
{
minute1=minute1-1;
minute2=10;
minute2=minute2-1;
second1=6;
second1=second1-1;
second2=10;
}
second2=second2-1;
if((minute1==0)&&(minute2==0)&&(second1==0)&&(second2==0))
{
BELL();
w=0;
Delay(300);
}
}
Display(second2,second1,minute2,minute1);
if(t1==0)
{
minute1=save1;
minute2=save2;
second1=save3;
second2=save4;//复位保存
w=0;
Delay(300);
}
else
f++;
}
Display(second2,second1,minute2,minute1);
}
}
void Display(uint M1,uint M2,uint S3,uint S4)
{
uint i;
for(i=0;i<4;i++)
{
if(i==0)
{
P2=0xf7;
P0=0x00;
Delay(1);
P0=WEIMA[M1];
}
if(i==1)
{
P2=0xfb;
P0=0x00;
Delay(1);
P0=WEIMA[M2];
}
if(i==2)
{
P2=0xfd;
P0=0x80;
Delay(1);
P0=WEIMA[S3];
}
if(i==3)
{
P2=0xfe;
P0=0x00;
Delay(1);
P0=WEIMA[S4];
}
Delay(4);
}
}
void Delay(uint z)
{
int x,j;
for(x=0;x
for(j=0;j<50;j++);
}
void exter0() interrupt 0
{
if(minute2==0)
{
minute1=minute1-1;
minute2=10;
}
minute2=minute2-1;
if(minute1==0)
{
if(minute2==0)
{
minute1=1;
minute2=0;
}
}
EX0=0;//关外部中断
EX1=0;
t=0;
}
void ADD() interrupt 2
{
minute2=minute2+1;
if(minute2==10)
{
minute1=minute1+1;
minute2=0;
if(minute1==10)
{
minute1=0;
minute2=0;
}
}
EX0=0;//关外部中断
EX1=0;
t=0;
}
void time1() interrupt 1
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num1++;
}
uint g=0; //定义一变量,用于控制喇叭响的时间
void delay_500us(void) //500us延迟函数,用于产生1KHZ信号
{
unsigned char a,b;
for(b=71;b>0;b--)
for(a=2;a>0;a--);
}
void delay_250us(void) //250us延迟函数,用于产生2KHZ信号
{
unsigned char a,b;
for(b=19;b>0;b--)
for(a=5;a>0;a--);
}
void BELL() //报警函数
{
uint a,b;
a=1;
b=0;
while(a)
{
for(;b<10;b++)
{
P2=0x00;
P0=WEIMA[0];
while(g<=200) //1KHZ响1S
{
delay_500us(); //延迟500us
BUZZER=~BUZZER;
g++; //取反次数加1
}
g=0; //清时间控制变量
while(g<=400) //2KHZ响1S
{
delay_250us(); //延迟250US
BUZZER=~BUZZER; //喇叭驱动位取反
g++; //取反次数加1
}
g=0; //清时间控制变量
}
P2=0x00;
BUZZER=0;
if(t1==0)
{
minute1=save1;
minute2=save2;
second1=save3;
second2=save4;
a=0;
}
}
}