当前位置:文档之家› 单片机课程设计总结报告

单片机课程设计总结报告

单片机课程设计频率计总结报告姓名:陈艺端学号:08292003班级:电气0809所在组:陈艺端白英杰【实验准备】在实验前,我通过上网、上图书馆查找了一些关于频率计的资料,结合单片机所学的中断和定时器的知识,并对电路板各个元器件、接线等的清楚认识,完成了对电路板仿真图的绘制,以及初步的程序,并实现了初步的仿真效果。

【设计内容】设计一个频率计。

【设计要求】分频段(高频、低频),在10k~20kHz范围做切换。

CPU为AT89S51,利用内部T0、T1的定时计数器或外部INT0中断功能来完成对输入的信号进行频率计数或脉宽计时,计数(计时)的频率结果通过6位七段LED数码管显示出来。

数字式频率计原理框图:【设计方案】一、实验原理:1、测频方式利用单片机计数器T0和定时器T1中断。

定时器T1中断产生闸门时间,在闸门时间Ts内,用计数器记录输入脉冲的个数N,从而计算出被测频率Fx =N/Ts。

2、测周方式利用单片机外部中断INT0和定时器T1中断。

定时器T1中断产生时标信号Ts,用外部中断INT0控制定时器T1的计数,计算出在被测信号的一个周期内定时器T1计得的数N,从而计算出被测频率Fx =NTs。

二、电路结构:① NE555构成多谐振荡器,产生频率可调的方波信号;②74HC74里的一个D触发器连成计数器,用来对555产生的方波分频;③74HC14非门做驱动,防止产生的信号不能驱动单片机的I/O口;④方波信号连接在单片机的INT0和T0口上。

⑤单片机的P1口做字位,连接74HC245驱动数码管的共阴端;⑥P0口做字形,连接74HC573锁存器和74HC245驱动数码管的a~dp端。

三、测频测周转换的讨论以及试验参数:1、测频方式和测周方式的转换频率依要求来说在10kHz~20kHz之间做切换。

2、转换频率过程中产生的问题当被测信号频率与转换频率非常接近,并且抖动时,容易产生两种方式一直跳变的现象,进入死循环,可以利用迟滞比较器的原理进行解决。

通常将测频方式和测周方式的转换频率设为程序判断测频还是测周的比较点,但为避免在转换频率附近产生死循环,设置两个比较点,分别为f1和f2,从高频测频方式向低频测周方式变化时,比较点为f1,从低频测周方式向高频测频方式变化时,比较点为f2,使f1<f2,即可避免不停跳变产生死循环的问题。

3、参数设定根据以上讨论,测频方式的闸门周期要大于1/f1,并且越大测量结果越精确,但还要考虑到闸门周期太大会导致测量得到的脉冲数N过大,影响程序大小。

同理,测周方式的时标周期要小于1/f2,并且越小越精确,同样要考虑到程序大小以及程序执行时间。

四、程序流程图⑴测频法:①主程序:②T0中断子程序:②T1中断子程序:⑵测周法:①主程序:②T1五、仿真图可见,改变电阻值或电容值,即改变NE555输入方波的频率,仿真实现的数码管显示值与用频率计测量的理论值相差不大,基本满足设计要求,但还是存在一定的误差,可以加以改进,增加精确度。

说明:由于软件版本问题,没有可调节的滑动变阻器,于是,我用多选开关来代替,通过开关选择不同的电阻来模拟滑动变阻器滑片的移动。

七、总结在去实验室前,我经过多番努力,将电路板上的电路用仿真软件画出,并且确保了每一条连线都包含了,芯片的每一个管脚都清楚的认识到是用来干什么的,怎么连接的,仿真时各个点将会出现什么情况。

尔后,我又进行了初步的编程,将程序模块化,分为了主程序、中断子程序(测频和测周)、显示子程序、十六进制转化为十进制的子程序、延时子程序等,但在十六进制转化为十进制的子程序的编程过程中,我不是很了解怎么实现这个过程,导致未能完成该子程序的编写。

验收当天,我和我的组员在互相讨论了自己的编程思路后,综合了对方的意见,得到了初步的程序,但是在仿真过程中,还是存在诸多问题,我们合力讨论了很久,但还是有点问题,于是我们和另外一组一起商讨,在测频和测周的转换过程方面讨论了很久,还尝试了用双闸门的方法,来代替测频和测周的转换,但是结果还是不理想,尝试了烧程序看看电路板能否实现,但经过了一天的努力,我们还是未能实现所要的结果。

临走前,我们询问老师,老师的意思是我们做得复杂了,想太多了,重心已经偏移了,于是,我们经过一个晚上的修改,初步定型了程序,第二天又到实验室去调试。

调试的时候发现显示出来的总是乱码,后用万用表测数码管,才发现电路板上的数码管接反了,于是我们将数码管重新插了一遍。

编程时的值都是理论计算得到的值,调试时发现测得的频率和实际频率总有点差别,原因是忽略了程序中其他语句执行所需要的时间,而且一开始由于为将某些语句在等待中断的时间完成,导致仿真结果是一段时间显示一次,时延较长,细微修改定时器定时,并修改程序结果后,减小了测得值和实际值的差别,显示结果也较稳定。

在烧程序的过程中出现了很多的问题,比如,接线的问题,芯片的问题等,我们第一天没能将课设验收完成,但我们不断地检查电路板和我们的程序,以及仿真图,不断地寻找问题所在,最终成功地将设计在电路板上实现出来。

六、实验程序①测频法:ORG 0000HAJMP STARTORG 000BH ;T0中断入口AJMP T0INTORG 001BH ;T1中断入口AJMP T1INTORG 0030HSTART: MOV SP,#70HMOV IE,#8AH ;10001010B,开放T0、T1中断MOV TMOD,#15H ;00010101,T1定时,T0计数,允许T0溢出中断MOV TH1,#0ECHMOV TL1,#78H ;定时10msMOV 20H,#100 ;100*10ms=1sMOV TH0,#00HMOV TL0,#00HMOV 21H,#0MOV 22H,#0MOV 23H,#0 ;存放采集到的频率SETB TR1 ;开始计数SETB TR0WAIT:AJMP WAIT ;等待中断T0INT:INC 23H ;T0计数器溢出则23H单元自增1RETIT1INT: ;定时10ms产生中断MOV R2,#06 ;显示初始化MOV R4,#0FEHMOV R1,#60H ;显示缓冲区起始地址SETB P3.0LOOP: MOV A,R4MOV P1,A ;字位MOV A,@R1MOV P0,A ;字形LCALL DELAYINC R1MOV A,R4RL A ;字位左移MOV R4,ADJNZ R2,LOOP ;判断6个数码管是否显示完DJNZ 20H,NEXT1 ;判断1s定时CLR TR1 ;停止计数CLR TR0MOV 20H,#100MOV 22H,TH0 ;1s时间到则采集数据MOV 21H,TL0LCALL DISPLAYMOV TH0,#00H ;计数初值置0MOV TL0,#00HNEXT1: MOV TH1,#0ECH ;继续定时MOV TL1,#78HSETB TR1SETB TR0EXIT: RETIDISPLAY:MOV R0,#60HMOV R1,#06H ;对60H-65H单元清零NEXT2: MOV @R0,#0INC R0DJNZ R1,NEXT2ZHUANHUAN: ;进制转换MOV A,23HMOV B,#0AHDIV ABMOV 24H,A ;存储第一位商MOV A,BMOV 30H,22HANL 30H,#0F0HADD A,30HSWAP AMOV B,#0AHDIV ABMOV 25H,A ;存储第二位商MOV A,BSWAP AANL 22H,#0FHADD A,22HMOV B,#0AHDIV ABMOV 26H,A ;存储第三位商MOV A,BMOV 30H,21HANL 30H,#0F0HADD A,30HSWAP AMOV B,#0AHDIV ABMOV 27H,A ;存储第四位商SWAP AANL 21H,#0FHADD A,21HMOV B,#0AHDIV ABMOV 28H,A ;存储第五位商MOV 50H,B ;存储十进制数个位MOV A,24HSWAP AADD A,25HMOV B,#0AHDIV ABMOV 24H,A ;存储第一位商MOV A,BSWAP AADD A,26HMOV B,#0AHDIV ABMOV 25H,A ;存储第二位商MOV A,BSWAP AADD A,27HMOV B,#0AHDIV ABMOV 26H,A ;存储第三位商MOV A,BSWAP AADD A,28HMOV B,#0AHDIV ABMOV 27H,A ;存储第四位商MOV 51H,B ;存储十进制数十位MOV A,24HSWAP AADD A,25HMOV B,#0AHDIV ABMOV 24H,A ;存储第一位商MOV A,BSWAP AADD A,26HMOV B,#0AHMOV 25H,A ;存储第二位商MOV A,BSWAP AADD A,27HMOV B,#0AHDIV ABMOV 26H,A ;存储第三位商MOV 52H,B ;存储十进制数百位MOV A,24HSWAP AADD A,25HMOV B,#0AHDIV ABMOV 24H,A ;存储第一位商MOV A,BSWAP AADD A,26HMOV B,#0AHDIV ABMOV 25H,A ;存储第二位商MOV 53H,B ;存储十进制数千位MOV A,24HSWAP AADD A,25HMOV B,#0AHDIV ABMOV 54H,B ;存储十进制数万位MOV 55H,A ;存储十进制数十万位MOV R2,#06MOV R0,#50HMOV R1,#5FHMOV DPTR,#TABNEXT3: MOV A,@R0MOVC A,@A+DPTR ;查表,字形INC R0INC R1MOV @R1,ADJNZ R2,NEXT3RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH DB 77H,7CH,39H,5EH,79H,71HDELAY: MOV 40H,#250LP0: NOPDJNZ 40H,LP0RETEND②测周法:ORG 0000HLJMP MAINORG 0100HMAIN: MOV DPTR, #0000HSETB CMOV P3.4, CMOV 23H, #00HF1: MOV C, P3.4JC F1F2: MOV C, P3.4JNC F2F3: MOV 22H, DPHMOV 21H, DPLMOV A, #0FFHCJNE A, 22H, JIACJNE A, 21H, JIAINC 23HJIA: INC DPTRMOV C, P3.4JC F3F4: MOV 22H, DPHMOV 21H, DPLMOV A, #0FFHCJNE A, 22H, JIA1CJNE A, 21H, JIA1INC 23HJIA1: INC DPTRMOV C, P3.4JNC F4MOV 22H, DPHMOV 21H, DPLACALL DISPLAYMOV 21H, #0MOV 22H, #0MOV 23H, #0LJMP MAINDISPLAY: MOV R0, #60HMOV R1, #06H ;对60H-65H单元清零NEXT2: MOV @R0, #0INC R0DJNZ R1, NEXT2ZHUANHUAN: ;进制转换MOV A, 23HMOV B, #0AHDIV ABMOV 24H, A ;存储第一位商MOV A, BMOV 30H, 22HANL 30H, #0F0HADD A, 30HSWAP AMOV B, #0AHDIV ABMOV 25H, A ;存储第二位商MOV A, BSWAP AANL 22H, #0FHADD A, 22HMOV B, #0AHDIV ABMOV 26H, A ;存储第三位商MOV A, BMOV 30H, 21HANL 30H, #0F0HADD A, 30HSWAP AMOV B, #0AHDIV ABMOV 27H, A ;存储第四位商MOV A, BSWAP AANL 21H, #0FHADD A, 21HMOV B, #0AHDIV ABMOV 28H, A ;存储第五位商MOV 50H, B ;存储十进制数个位MOV A, 24HSWAP AADD A, 25HMOV B, #0AHDIV ABMOV 24H, A ;存储第一位商MOV A, BSWAP AMOV B, #0AHDIV ABMOV 25H, A ;存储第二位商MOV A, BSWAP AADD A, 27HMOV B, #0AHDIV ABMOV 26H, A ;存储第三位商MOV A, BSWAP AADD A, 28HMOV B, #0AHDIV ABMOV 27H, A ;存储第四位商MOV 51H, B ;存储十进制数十位MOV A, 24HSWAP AADD A, 25HMOV B, #0AHDIV ABMOV 24H, A ;存储第一位商MOV A, BSWAP AADD A, 26HMOV B, #0AHDIV ABMOV 25H, A ;存储第二位商MOV A, BSWAP AADD A, 27HMOV B, #0AHDIV ABMOV 26H, A ;存储第三位商MOV 52H, B ;存储十进制数百位MOV A, 24HSWAP AADD A, 25HMOV B, #0AHDIV ABMOV 24H, A ;存储第一位商SWAP AADD A, 26HMOV B, #0AHDIV ABMOV 25H, A ;存储第二位商MOV 53H, B ;存储十进制数千位MOV A, 24HSWAP AADD A, 25HMOV B, #0AHDIV ABMOV 54H, B ;存储十进制数万位MOV 55H, A ;存储十进制数十万位MOV R2, #06MOV R0, #50HMOV R1, #5FHMOV DPTR, #TABNEXT3: MOV A, @R0MOVC A, @A+DPTRINC R0INC R1MOV @R1, ADJNZ R2, NEXT3MOV R2, #06MOV R4, #0FEHMOV R1, #60HSETB P3.0LOOP: MOV A, R4MOV P1, AMOV A, @R1MOV P0, ALCALL DELAYINC R1MOV A, R4RL AMOV R4, ADJNZ R2, LOOPRETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH DB 77H,7CH,39H,5EH,79H,71HDELAY: MOV 40H, #250LP0: NOPDJNZ 40H, LP0RETEND十六进制转化为十进制的方法:第一步将最高位的高半字节提出来,除以10,把商存储起来,余数与最高位的低半字节组合成一个字节,再除以10,再存储商,余数以此类推,直到最后一次计算得到的余数即为十进制数的个位;第二步把第一步存储的商组合成一个字节,依次除以10,仍然把每次得到的商存储起来,以此类推最后一次得到的余数即为十进制数的十位;以后也是以此类推得到十进制数的百位、千位……以上算法必须要注意的一个问题是,每次得到的余数与低位的半字节组合成一个字节时,余数必须放在该字节的高半字节,否则计算错误。

相关主题