1、 课程设计实验报告 1.1 实验目的 在理论课程的基础上,重点培养动手能力,通过电路设计,理论计算,实际编程,调试,测试,分析查找故障,解决在实际设计中的问题,使设计好的电路能正常工作。通过proteus软件的使用,能够较全面的了解单片机的原理和结构组成,单片机系统的扩展应用,较好的掌握单片机的汇编语言程序设计和硬件结构设计,通过实验了解单片机系统研制中的软件,硬件设计和系统程序调试等的全过程,掌握应用单片机系统设计解决实际问题的方式和方法。巩固单片机的课堂所学。1.2 实验课题和基本要求课题:基于单片的8LED显示电子码表设计基本要求: 1 设计秒表功能,精度为0.01秒。2 可同时记录和存
2、储10个秒表数据。(连续记录并显示已存储记录数)3 秒表记录数据查询和清除功能(能分辨次和时间对应关系)。4 按键声音提示功能发挥部分:1 外部脉冲数据记录(一信道,快速脉冲信号)。2 外部记录触发信号输入(二信道,慢速存储信号)3 自动存储和手动回放。动态显示格式: 自定 1.3 实验设备:硬件:微机(Windows XP)软件:Proteus 7.5 sp3 ,Keil uVersion3 1.4 .1 设计思路: 根据实验给出的要求,我们选择了8LED进行动态显示。并通过按键切换不同的功能,来达到分别显示各种要求的动态效果。 同时,对于按键我们在每次按键按下时判断是否由于抖动还是真的按下
3、。而抬起时,还要判断是否按键抬起,来正确的实现功能。 显示部分LED显示的数据由显示缓冲区单元中的数据决定,每按下按键保存数据,待计数完成后,按下按键可现示每次的数据。因为延时是用软件做的,所以精度通过选择适当的晶振来实现。 声音提示功能通过按钮和蜂鸣器连接,每按一次响一次。原理图:(1)AT89C52为8 位通用微处理器,采用工业标 PDIP封装的AT89C52引脚图准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及
4、与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中P3控制位选,P2控制段选,P10控制开始计数、P11控制记录成绩。(2) LED数码管显示说明由于系统要显示的内容比较简单,显示量不多,所以选用数码管既方便又经济。LED有共阴极和共阳极两种。如图所示。二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极
5、管的阳极连接在一起,接入+5V的电压。一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)ag,另一个小数点为dp发光二极管。当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。为了保护各段LED不被损坏,需外加限流电阻。 f eddpcbage d com c dp g f com a b 本设计采用8LED 7SEG-MPX8-CA-BLUE,是共阳极各段码位的对应关系段码位D7 D6 D5 D4 D3 D2 D1 D0显示段dpgfedcba1.4.2 流程图: 开始初始化外部K启动计时,n=1 K1保存数据,save+ Save10 显示FU
6、LL,回放数据 NO Save=10 每按一次K1显示数据 按K清零再按K重新计数1.4.3发挥部分: (1)外部脉冲数据记录(一信道,快速脉冲信号)外部记录触发信号输入(二信道,慢速存储信号)可以利用单片机的定时器可以工作在外部脉冲信号的计数方式,比如我们可以用定时器来测试外部输入的脉冲信号的脉冲宽度,例如输入一个数字信号01110111。该数字信号接入T0Pin,即可编程测试出该3个1来。;外部脉冲宽度(在5到250ms)之间,测量存放在R0。程序如下。 #include reg51.h#include #define uchar unsigned char#define uint uns
7、igned int uchar code DispTab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x0f8,0x80,0x90,;void delay(uchar ms) uchar t; while(ms-); for(t=1;t=120;t+); void inter0() interrupt 0 TH0 = 0; TL0 = 0; void main() long int n; long int gw,sw,bw,qw,ww,qww; EA=1; EX0=1; IT0=1; TMOD = 0X05; TH0 = 0; TL0 = 0; TR0 = 1; w
8、hile(1) n=TH0*256+TL0; gw=n%10; sw=n%100/10; bw=n%1000/100; qw=n%10000/1000; ww=n%100000/10000; qww=n%1000000/100000; P2=0x80; P0=DispTabgw; delay(5); P2=0x40; P0=DispTabsw; delay(5); P2=0x20; P0=DispTabbw; delay(5); P2=0x10; P0=DispTabqw; delay(5); 将两个程序结合在一起。(2) 结合基于单片的显示电子琴设计,将提示声音改为电子琴声音。1.5 实验电
9、路图操作使用说明: 按K开始计时,再按一次暂停,如果想重新计时第三次按K清零,第四次按K重新计时。正常计时时每按一次K1存储一个数,存满10个后若想再存数据,根据题目要求计10个数,再按K1则显示FULL并自动显示第一个成绩,显示结束后按K清零后可重新计时。1.6 部分结果图:从左到右,第一二位表示分,三四位表示秒,五六位计数,七八位表示存储数。按下K开始跑表:第一次计数:第八次计数:第十次计数:闪动显示存满:FULL回放数据:第一个数据:第二个数据:第十个数据:再次按K数据清零:测脉冲宽度:开始测宽度:按清零键后:1.7 C语言编程(将两个程序结合在一起实现码表和测外部脉冲宽度功能)/*功能
10、说明:99马表,可实现记录10人成绩,和记录外部脉冲数接线说明:P0控制位选123(通过排阻),P2控制段选abc,P14启动计数功能,P10控制开始计数、P11控制记录成绩 ;P12启动测脉冲功能,P32脉冲数清零。*/#include#include #define S P3sbit k=P10;sbit k1=P11;sbit k2=P14;sbit k3=P12;sbit k4=P32;unsigned int n,i,j;unsigned int hour=0;unsigned int min=0;unsigned int second=0;unsigned int save=0;u
11、nsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char table1103=0,0,0,0,0,0; /储存成绩/-延时-/void delay(unsigned int delaytime) while(delaytime-);/-数码管显示-/void display() S=0x01;delay(5);P2=tablehour/10; delay(500); S=0x02;delay(5);P2=tablehour%10&0x7f;delay(500); S=0x04;
12、delay(5);P2=tablemin/10; delay(500); S=0x08;delay(5);P2=tablemin%10&0x7f;delay(500);S=0x10;delay(5);P2=tablesecond/10; delay(500); S=0x20;delay(5);P2=tablesecond%10; delay(500); S=0x80;delay(5);P2=tablesave%10; delay(500);S=0x40;delay(5);P2=tablesave/10; delay(500); /-初始化-/void t0nit()TMOD=0x01; /00
13、000001,16位定时模式TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1; /-中断-/void timer0() interrupt 1 if(n=1)/按下按键k,开始计时 second+;if(second=100) min+; second=0; if(min=60) hour+; min=0; if(hour=60) hour=0; min=0; second=0; if(k1=1&i10) /按下按键k1,记录成绩 delay(500); /确保按键处于高电平状态 if(k1=1) table1i0=hou
14、r;table1i1=min;table1i2=second;i+; save+;while(k1=1); /检验按键释放 TH0=(65536-10000)/256;TL0=(65536-10000)%256; void main() if(k2=0) t0nit(); while(1) if(k=0) delay(500); if(k=0) n+;while(k=0); if(n3&j10) n+; S=0x01;delay(5);P2=0x8e;delay(500000000); S=0x02;delay(5);P2=0xc1;delay(500000000); S=0x04;delay
15、(5);P2=0xc7;delay(500000000); S=0x08;delay(5);P2=0xc7;delay(500000000); while ( save10) save=save%10;while(k1=1); if(n=3) /第3次按下k,归 零 second=0;min=0;hour=0;save=0;for(i=0;i10;i+) table1i0=0;table1i1=0;table1i2=0; i=0;j=0; if(n=4) /第4次按下k,计数 n=1; TH0=(65536-10000)/256; TL0=(65536-10000)%256; display(
16、); if(k3=0) long int m; long int gw,sw,bw,qw,ww,qww; EA=1; EX0=1; IT0=1; TMOD = 0X05; TH0 = 0; TL0 = 0; TR0 = 1; while(1) m=TH0*256+TL0; gw=m%10; sw=m%100/10; bw=m%1000/100; qw=m%10000/1000; ww=m%100000/10000; qww=m%1000000/100000;P3=0x80; P2=tablegw; delay(500); P3=0x40; P2=tablesw; delay(500); P3=
17、0x20; P2=tablebw; delay(500); P3=0x10; P2=tableqw; delay(500); if(k4=0) TH0 = 0; TL0 = 0; 1.8 实验小结 初学单片机,对所学知识掌握不够全面,这次的系统设计有点粗糙,正所谓困难重重,刚好有个电子钟的课程设计,就按照它的设计过程的思想作为参考,本想把所学知识全应用起来,做一个带创新的思路的系统设计,但是还是没有头绪。结合老师上课所讲的,就决定做这个窄带脉冲宽度检测,因为这个对我来说比较容易理解,设计思路比较清晰。虽然这个设计没有经过实物器件的调试,但是我体会到了,单片机设计的个过程。它需要系统整体设计,硬件设计,软件设计,和调试测试等等步骤。软件设计要 和硬件设计相结合,他们是有相互联系的。在本系统中,难免有些错误,希望老师批评指正。通过本次课程设计,加深了对51单片机的了解,同时学会了使用Proteus仿真软件和KEIL软件。在完成设计题目的过程中,经历了设计整体思路,编写程序。调试,锻炼了实际的动手能力,达到了本次实验的要求。在本次课程设计中,我收获很多。最后感谢单片机老师在这次实验给予我们的帮助,提高了我的积极性,加深我对单片机的理解!