湖南工业大学课程设计资料袋理学学院(系、部)2012 ~ 2013 学年第 1 学期课程名称单片机应用系统指导教师周玉职称副教授学生姓名张思远专业班级电子科学102 学号10411400223 题目对外部脉冲计数系统的设计成绩起止日期2013 年01 月06 日~2013 年01 月10 日目录清单湖南工业大学课程设计任务书2012 —2013 学年第1 学期理学院学院(系、部)电子科学专业102 班级课程名称:单片机应用系统设计题目:对外部脉冲计数系统的设计完成期限:自2013 年01 月06 日至2013 年01 月10 日共 1 周指导教师(签字):年月日系(教研室)主任(签字):年月日附件三(单片机应用系统)设计说明书(题目)对外部脉冲计数系统的设计起止日期:2013 年01 月06 日至2013 年01 月10 日学生姓名张思远班级电子科学102学号10411400223成绩指导教师(签字)电气与信息工程学院2012年12 月10 日一、设计任务:1.1 外部脉冲自动计数,自动显示。
1.1.1设计一个255计数器:0-255计数,计满后自动清0,重新计数(在数码管中显示)。
1.1.2设计一个50000计数器:0-50000计数,计满后自动清0,重新计数(在数码管中显示)。
注:要求首先采用PROTEUS完成单片机最小系统的硬件电路设计及仿真;程序仿真测试通过后,再下载到单片机实训板上执行。
二、硬件设计介绍:※STC89C52单片机;※6位共阴或者共阴极数码管;※外部晶振电路;※ISP下载接口(In system program,在系统编程);※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转换,其他R5 R6同理。
极大的方便客户修改计数初值,灵活的实现计数。
对计数范围不限定且可系统模块化。
故对255和50000均适用图3计数程序流程图(255、50000均适用)四、硬件实物图如图4.0五、汇编程序(255、50000共用);对于255,设置R5=00,R6=02,,R7=55;对于50000,设置R5=05,R6=00,R7=005.1对于共阴极数码管:;---------------------------------------- ORG 0000HAJMP MIANORG 000BHAJMP INTERPORG 0030HMIAN:MOV R5,#00; 为十万、万位MOV R6,#00;千、百位MOV R7,#00;十、个位MOV TMOD,#06HMOV TL0,#0FFHMOV TH0,#0FFHSETB TR0SETB ET0SETB EAXIANSHI:MOV R0,#0BFHMOV A,R7LCALL CHANGEMOV A,R6LCALL CHANGEMOV A,R5LCALL CHANGESJMP XIANSHICHANGE:MOV R1,A ;位选移位,进行扫描。
R1保护操作值,暂存于R1 MOV A,R0SETB CRRC AMOV R0,AMOV A,R1MOV B,#10DIV ABXCH A,B ;组合整数部分余数部分MOV DPTR,#0100HMOVC A,@A+DPTRMOV P2,R0MOV P1,ALCALL DELAYMOV A,BMOV R1,AMOV A,R0SETB CRRC AMOV R0,AMOV A,R1MOVC A,@A+DPTR ;段选查表显示MOV P2,R0MOV P1,ALCALL DELAY ;延时10msRETINTERP:CJNE R5,#05,RE1 ;计数值设置:万位十万位 CJNE R6,#00,RE1 ;计数值设置:百位千位 CJNE R7,#00,RE1 ;计数值设置个位十位MOV R7,#0MOV R6,#0MOV R5,#0RETIRE1:CJNE R7,#99,LOOP1MOV R7,#0CJNE R6,#99,LOOP2MOV R6,#0CJNE R5,#99,LOOP3MOV R5,#0LOOP1: INC R7RETILOOP2: INC R6RETILOOP3: INC R5RETIDELAY:MOV R4,#10DE1:MOV R3,#50DE2:DJNZ R3,DE2DJNZ R4,DE1RETORG 0100HDB 7EH,30H,6DH,79H,33HDB 5BH,5FH,70H,7FH,7BHRED;------------------------------------------------ ;----------------------------5.2对于共阳极数码管只需将DB 7EH,30H,6DH,79H,33HDB 5BH,5FH,70H,7FH,7BH改成:DB 01H,4FH,12H,06H,4CHDB 24H,20H,0FH,00H,04H即可六、C51程序://对于255,设置c=00,b=02,,a=55//对于50000,设置c=05,b=00,a=006.1对于共阴极数码管:#include<stdio.h>#include<reg51.h>#include<intrins.h>//a位个位十位,b位百位千位c位万位十万位 char a,b,c;//延时DelayMS( int x){char i;while(x--){for(i=0;i<100;i++);}}//T1计数中断,工作方式2Timer1_Interrupt( ) interrupt 3 using 1//计数操作模块//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) 为计数50000a=0;b=0;c=0;}}void main( )//段选编码数组{ char code DISP[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B};char R0,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);}}//END6.2对于共阳极数码管:程序只需将Char code DISP[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B}; 改成:Char code DISP[]={0x01,0x4F,0x12,0x06,0x4C,0x24,0x20,0x0F,0x00,0x04};即可。
七、PCB图九、心得体会在这次实验中,我学到很多东西,加强了我的动手能力,并且培养了我的独立思考能力。
特别是在做实验报告时,因为在做数据处理时出现很多问题,如果不解决的话,将会很难的继续下去。
例如:数据处理时,遇到要进行数据获取显示,这就要求懂得数码管的工作,怎么个去控制,然后汇编程序怎么去实现数码管各个引脚的控制,对于多位数码管还得扫描显示。
我们做实验绝对不能人云亦云,要有自己的看法,要有自己独特的思路。
这样我们就要有充分的准备,若是做了也不知道是个什么实验,那么做了也是白做。
实验总是与课本知识相关的,在做设计前,首先你先想好最方便最实用最经济的硬件连接电路,然后用软件弥补不足之处,硬件是软件的躯体,而软件是硬件的血液,两者相辅相连,关系极为紧密。
硬件的不足可以适当用软件弥补,同样,良好的程序是建立在好性能的硬件上的。
在编写程序的时候,我觉得思路清晰,结构明确,最好具有模块化,建立模型,使得程序具有方便修改性,易于移植,且不受局限性,这样一来,程序灵活自如,结构明确易于别人看懂且为以后方便修改等。