对外部脉冲计数系统的设计计数器课程设计单片机.docx
《对外部脉冲计数系统的设计计数器课程设计单片机.docx》由会员分享,可在线阅读,更多相关《对外部脉冲计数系统的设计计数器课程设计单片机.docx(14页珍藏版)》请在冰豆网上搜索。
对外部脉冲计数系统的设计计数器课程设计单片机
湖南工业大学
课程设计
资料袋
理学学院(系、部)2012~2013学年第1学期
课程名称单片机应用系统指导教师周玉职称副教授
学生姓名张思远专业班级电子科学102学号
题目对外部脉冲计数系统的设计
成绩起止日期2013年01月06日~2013年01月10日
目录清单
序号
材料名称
资料数量
备注
1
课程设计任务书
1
2
课程设计说明书
1
3
课程设计图纸
1
4张
4
5
6
湖南工业大学
课程设计任务书
2012—2013学年第1学期
理学院学院(系、部)电子科学专业102班级
课程名称:
单片机应用系统
设计题目:
对外部脉冲计数系统的设计
完成期限:
自2013年01月06日至2013年01月10日共1周
内
容
及
任
务
1.1外部脉冲自动计数,自动显示。
1.1.1设计一个255计数器:
0-255计数,计满后自动清0,重新计数(在数码管中显示)。
1.1.2设计一个50000计数器:
0-50000计数,计满后自动清0,重新计数(在数码管中显示)。
注:
要求首先采用PROTEUS完成单片机最小系统的硬件电路设计及仿真;程序仿真测试通过后,再下载到单片机实训板上执行。
进
度
安
排
起止日期
工作内容
2013.01.06
讲述设计内容及基本原理
2013.01.07-2013.01.09
进行系统的设计
2013.01.10
进行系统的调试,检查
主
要
参
考
资
料
[1]刘苗生、潘宗预.单片机测控系统设计.中国物质出版社,2006年
[2]欧伟明、何静、凌云、刘剑.单片机原理与应用系统设计.电子工业出版社,2009年
指导教师(签字):
年月日
系(教研室)主任(签字):
年月日
附件三
(单片机应用系统)
设计说明书
(题目)
对外部脉冲计数系统的设计
起止日期:
2013年01月06日至2013年01月10日
学生姓名
张思远
班级
电子科学102
学号
成绩
指导教师(签字)
电气与信息工程学院
2012年12月10日
一、设计任务:
1.1外部脉冲自动计数,自动显示。
1.1.1设计一个255计数器:
0-255计数,计满后自动清0,重新计数(在数码管中显示)。
1.1.2设计一个50000计数器:
0-50000计数,计满后自动清0,重新计数(在数码管中显示)。
注:
要求首先采用PROTEUS完成单片机最小系统的硬件电路设计及仿真;程序仿真测试通过后,再下载到单片机实训板上执行。
二、硬件设计介绍:
※STC89C52单片机;
※6位共阴或者共阴极数码管;
※外部晶振电路;
※ISP下载接口(Insystemprogram,在系统编程);
※DC+5V电源试配器(选配);
※ISP下载线(选配)
※6个PNP(NPN)三极管
※12个碳膜电阻
三、硬件设计思路
方案一:
五个1位7段数码管,无译码器
方案二:
五个1位7段数码管,译码器
方案三:
1个6位7段数码管,译码器
方案四:
1个6位7段数码管,无译码器
考虑实际中外围设备、资金、单片机资源利用率、节省端口数量,可实行性以及连接方便等问题,采用6为数码管(共阳或者共阴极)由于实际中没买到6位的,采用2个三位数码管并接组合一个6位数码管形式;由于实际P口驱动能力有限,故采用6位三极管增大驱动能力,已便足以使得6位数码管亮度明显正常工作,增加6个电阻限流保护数码管不被烧坏。
让数码管a-g7段分别接P1.6—P1.0,
6位位选分别接P2.5—P2.0。
方法一:
共阴极数码管
硬件图1.0所示:
通过npn管放大后,段选高电平有效,位选低电平有效
图1.0共阴极数码管硬件原理图
方法二:
共阳极数码管
原理图如图2.0:
段选低电平有效,位选低电平有效(通过pnp管连接,不再是高电平有效了,由于特意此接法,共阳极共阴极数码管只是差别段选控制,为程序修改提供极大的方便之处,故程序只需要修改段选地址即可,实现共阳极共阴极互换)
图2.0共阳极数码管硬件原理图
三、程序设计思路:
由于设计是255和50000计数器,对于计数器工作模式二,TL最大值为255,可以实现对255计数,但是对于50000得另寻他路,为了建立不限制计数器模型,改进程序的可更改性可移植性可读行,对计数器模式二另TL1=0FFH(以T1为例,下文不再说明),只要来一个脉冲,就跳转中断服务程序执行,而计数不是直接通过TL操作,而是采用多寄存器组合的方式,方便修改,本设计采用R5,R6,R7,三寄存器通过数学上的逻辑组合形成6位数,如R7的低4位记录个位,高4位记录十位,R7本身只记录到99,在进一则归零,向百位进一(R6),而显示是通过对R7/10取余取整(0-9)通过查表指令实现相应的数字显示,位选通过高频扫描,实现“连续显示”无需再进行BCD转换,其他R5R6同理。
极大的方便客户修改计数初值,灵活的实现计数。
对计数范围不限定且可系统模块化。
故对255和50000均适用
图3计数程序流程图(255、50000均适用)
四、硬件实物图
如图4.0
五、汇编程序(255、50000共用)
;对于255,设置R5=00,R6=02,,R7=55
;对于50000,设置R5=05,R6=00,R7=00
5.1对于共阴极数码管:
;----------------------------------------
ORG0000H
AJMPMIAN
ORG000BH
AJMPINTERP
ORG0030H
MIAN:
MOVR5,#00;为十万、万位
MOVR6,#00;千、百位
MOVR7,#00;十、个位
MOVTMOD,#06H
MOVTL0,#0FFH
MOVTH0,#0FFH
SETBTR0
SETBET0
SETBEA
XIANSHI:
MOVR0,#0BFH
MOVA,R7
LCALLCHANGE
MOVA,R6
LCALLCHANGE
MOVA,R5
LCALLCHANGE
SJMPXIANSHI
CHANGE:
MOVR1,A;位选移位,进行扫描。
R1保护操作值,暂存于R1
MOVA,R0
SETBC
RRCA
MOVR0,A
MOVA,R1
MOVB,#10
DIVAB
XCHA,B;组合整数部分余数部分
MOVDPTR,#0100H
MOVCA,@A+DPTR
MOVP2,R0
MOVP1,A
LCALLDELAY
MOVA,B
MOVR1,A
MOVA,R0
SETBC
RRCA
MOVR0,A
MOVA,R1
MOVCA,@A+DPTR;段选查表显示
MOVP2,R0
MOVP1,A
LCALLDELAY;延时10ms
RET
INTERP:
CJNER5,#05,RE1;计数值设置:
万位十万位
CJNER6,#00,RE1;计数值设置:
百位千位
CJNER7,#00,RE1;计数值设置个位十位
MOVR7,#0
MOVR6,#0
MOVR5,#0
RETI
RE1:
CJNER7,#99,LOOP1
MOVR7,#0
CJNER6,#99,LOOP2
MOVR6,#0
CJNER5,#99,LOOP3
MOVR5,#0
LOOP1:
INCR7
RETI
LOOP2:
INCR6
RETI
LOOP3:
INCR5
RETI
DELAY:
MOVR4,#10
DE1:
MOVR3,#50
DE2:
DJNZR3,DE2
DJNZR4,DE1
RET
ORG0100H
DB7EH,30H,6DH,79H,33H
DB5BH,5FH,70H,7FH,7BH
RED
;------------------------------------------------
;----------------------------
5.2对于共阳极数码管
只需将DB7EH,30H,6DH,79H,33H
DB5BH,5FH,70H,7FH,7BH
改成:
DB01H,4FH,12H,06H,4CH
DB24H,20H,0FH,00H,04H
即可
六、C51程序:
//对于255,设置c=00,b=02,,a=55
//对于50000,设置c=05,b=00,a=00
6.1对于共阴极数码管:
#include
#include
#include
//a位个位十位,b位百位千位c位万位十万位
chara,b,c;
//延时
DelayMS(intx)
{
chari;
while(x--)
{
for(i=0;i<100;i++);
}
}
//T1计数中断,工作方式2
Timer1_Interrupt()interrupt3using1
//计数操作模块
//a位个位十位,b位百位千位c位万位十万
{
if(a!
=99)
{
a++;
}
else
{
a=0;
if(b!
=99){
b++;
}
else{
b=0;
if(c!
=99){
c++;
}
else{
c=0;
}
}
}
if(c==0&&b==2&&a==55){//判断是否计数到255(c==5&&b==0&0&a==00)为计数50000
a=0;
b=0;
c=0;
}
}
voidmain()
//段选编码数组
{charcodeDISP[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B};
charR0,R1;
P2=0XBF;//位选初值设置
TMOD=0X60;
TH1=0XFF;
TL1=0XFF;
TR1=1;
ET1=1;
EA=1;
while
(1){
P2=0XBF;//循环移位后,重赋初值
R0=a%10;
R1=a/10;
P2=_cror_(P2,1);//循环右移位选
P1=DISP[R0];//查数组显示
DelayMS(3);//
P2=_cror_(P2,1);
P1=DISP[R1];
DelayMS(3);
//
R0=b%10;
R1=b/10;
P2=_cror_(P2,1);
P1=DISP[R0];
DelayMS(3);//
P2=_cror_(P2,1);
P1=DISP[R1];
DelayMS(3);
R0=c%10;
P2=_cror_(P2,1);
P1=DISP[R0];
DelayMS(3);
}
}
//END
6.2对于共阳极数码管:
程序只需将
CharcodeDISP[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B};
改成:
CharcodeDISP[]={0x01,0x4F,0x12,0x06,0x4C,0x24,0x20,0x0F,0x00,0x04};
即可。
七、PCB图
九、心得体会
在这次实验中,我学到很多东西,加强了我的动手能力,并且培养了我的独立思考能力。
特别是在做实验报告时,因为在做数据处理时出现很多问题,如果不解决的话,将会很难的继续下去。
例如:
数据处理时,遇到要进行数据获取显示,这就要求懂得数码管的工作,怎么个去控制,然后汇编程序怎么去实现数码管各个引脚的控制,对于多位数码管还得扫描显示。
我们做实验绝对不能人云亦云,要有自己的看法,要有自己独特的思路。
这样我们就要有充分的准备,若是做了也不知道是个什么实验,那么做了也是白做。
实验总是与课本知识相关的,在做设计前,首先你先想好最方便最实用最经济的硬件连接电路,然后用软件弥补不足之处,硬件是软件的躯体,而软件是硬件的血液,两者相辅相连,关系极为紧密。
硬件的不足可以适当用软件弥补,同样,良好的程序是建立在好性能的硬件上的。
在编写程序的时候,我觉得思路清晰,结构明确,最好具有模块化,建立模型,使得程序具有方便修改性,易于移植,且不受局限性,这样一来,程序灵活自如,结构明确易于别人看懂且为以后方便修改等。
首先只进行仿真时,接的带译码的数码管,最多也只能驱动6个1位数码管,而如果用1位数码管就浪费了很多资源不说,而给实际电路连接带来麻烦,所以后来考虑6位数码管,那么问题就的进行高频扫描,实现动态显示,先是加了译码器,最后位了节省资源,省去译码器而程序改写进行查表指令代替,省去了很多其他硬件。
仿真无误后,用杜邦线插上数码管等线路,发现数码管亮度微乎及微,因为单片机P口驱动能力有限,驱动一位数码管还可以,但是要驱动2位,3位乃至6位、9位就不行了,必须地扩大其驱动能力,所以,我接了三极管以增大其驱动能力。
买来了所需要的相应的电阻、三极管等,由于板子面子有限只有7cm×5cm,先在草稿上画好版图,布局以确定最佳布局。
焊接完后,激动人心的时候到了,结果接上电,在按下开关那一瞬间,晕了,C、E两端不亮啊,检查了程序,检查硬件有没有段,结果就是检查不出啊,后来看了三极管才发现原因了,有2个三极管和其他4个型号不一样
,我才知道,原来吧两种三极管混放在一起了,当做是同一型号用了,发现源泉后,马上换了2个三极管,问题解决了,可用迎来另外一个问题,虽然看上去没大问题但是,显示的时候有残影效果,通过各种测试,发现了个问题,原来我程序里每个数码管显示时间不够,也就是说延时不够,我扩大了常规显示效果即延时10ms左右,问题成功解决了,而且亮度也平均增强了。
很是cool,虽然弄了一个通宵,但是每个问题都解决了,实在是爽歪歪,有点累却是值得的,很感谢周老师认真心细的指导、对学生及其的负责,教育我们耐心、教诲我们独自思考能力,教会我们创新能力,我想作为周老师的学生很是幸运,是我们的好伙伴,感谢老师!