1、 单片机课程设计报告 基于AT89C51的数字频率计 学院名称: 电气信息工程学院 专 业: 班 级: 姓 名: 学 号: 指导老师: 设计时间: 2014年3月
2、 一 .数字频率计简介....................................1 二 .设计要求..........................................1 2.1技术要求 2.2 LED数码显示 三 .数字频率计设原理...................................2 3.1 功能指标 3.2 硬件电路设计 3.3 软件程序设计 四 .单片机的硬件连接图.................................7 五 .程序设计......
3、9 5.1流程图 5.2子程序 六.总程序设计 ........................................12 七.系统调试及结果分析..................................16 7.1 硬件调试 7.2 软件调试 7.3结果分析 八.注意事项.............................................17 九.心得体会...................
4、18 十.参考文献.............................................18 附录:元件清单 概述: 单片微型计算机简称单片机,20世纪中期发展起来的一种面向控制的大规模集成电路模块,具有功能强、体积小、可靠性高、价格低廉等特点,在工业控制、数据采集、智能仪表、机电一体化、家用电器等领域得到了广泛的应用,极大的提高了这些领域的技术水平和自动化程度,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功
5、能的芯片,而是把一个计算机系统集成到一个芯片上。单片机由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。它最早是被用在工业控制领域。 AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K
6、字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 本次试验通过AT89C51单片机为核心来设计一个驱动四位数码管的数字频率计。 关键词:数字频率计;AT89C51单片机;信号;编码 一.数字频率计简介 (本实验用仿真头替代AT89C51实现功能
7、 数字频率计是采用数字电路制做成的能实现对周期性变化信号频率测量的仪器。频率计主要用于测量正弦波、矩形波、三角波和尖脉冲等周期信号的频率值。其扩展功能可以测量信号的周期和脉冲宽度。通常说的,数字频率计是电子计数指式频率计。 二.数字频率计的设计 1.技术要求 (1)输入脉冲幅度:0-5V (2)频率测量范围:100-10000HZ (3)测量精度:±1% (4)显示方式:四位数字显示2数字频率软件设计 2.采用动态扫描法实现LED数码管显示。 共阴7段LED显示器显示原理: 引脚 数字显示 .P0.7 h P0.6 g P0.5 f
8、P0.4 e P0.3 d P0.2 c P0.1 b P0.0 a 数码显示 0 0 0 1 1 1 1 1 1 3EH 1 0 0 0 0 0 1 1 0 06H 2 0 1 0 1 1 0 1 1 5BH 3 0 1 0 0 1 1 1 1 4FH 4 0 1 1 0 0 1 1 0 66H 5 0 1 1 0 1 1 0 1 6DH 6 0 1 1 0 1 1 0 1 7DH 7 0 0 0 0 0 1 1 1
9、 07H 8 0 1 1 1 1 1 1 1 7FH 9 0 1 1 0 1 1 1 1 6FH 该电路采用AT89C51单片机最小化应用,采用共阴7段LED数码管显示器,P3.4口引入脉冲信号,P2.0至p2.3口作为列扫描输出,P0口输出段码数据,采用12Mhz晶振,可提高计数的精确度。 三.频率计设计原理 对一秒钟内的输入脉冲进行计数,计数的个数即为频率。 可设置T1为定时器工作方式,定时时间为1秒。开中断。而将T0设为计数器工作方式,待测输入脉冲从P3.4输入。起计数初值清零,即TH0TL0=0000H。 在一秒定时到时,在T1的中
10、断服务程序中,读取TH0TL0中的计数值到内存中的频率单元。并随后清零TH0TL0,以便下次读数。 读到的计数值即为频率值,经二——十进制转换子程序为十进制,并拆为非压缩BCD码后送显示缓冲区显示。 信号源 89C51 单片机控制器 4位数码管显示 振荡电路 7407 列驱动 复位电路 设计框图 3.1 功能指标 (1)输入脉冲幅度:0-5V (2)频率测量范围:100-10000HZ (3)测量精度:±1% (4)显示方式:四位数字显示
11、对一秒钟内的输入脉冲进行计数,计数的个数即为频率。 3.2 硬件电路设计 上网查找关于51单片机的引脚图,以及74LS07的引脚图,共阴极数码管的显示方式。 a.单片机引脚图 1. VCC ——运行时加+5V 2. GND ——接地 3. XTAL1 ——振荡器反相放大器及内部时钟发生器的输入端 4. XTAL2 ——振荡器反相放大器的输出端 自激振荡器 5. RST ——复位输入,高电平有效,在晶振工作时,在RST引脚上作用2个机器周期以上的高电平,
12、将使单片机复位。WDT溢出将使该引脚输出高电平,设置SFT AUXR的DISRTO位(地址8EH)可打开或关闭该功能。DISRTO位缺省为RESET输出高电平打开状态。 6. P端口 ——P1、P2、P3口是一组带内部上拉电阻的8位双向I/O口。P0口没有内接上拉电阻,故需要外部接上一排阻充当P0口的上拉电阻。可以用P口接按键来实现外加功能。 (P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进
13、行校验时,P0输出原码,此时P0外部必须接上拉电阻。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储
14、器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示: 口管脚 备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /I
15、NT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(计时器0外部输入) P3.5 T1(计时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。) b.74LS07驱动器 六驱动器(OC高压输出) 74LS07 74LS07具有稳压驱动作用,可以通过74LS07驱动器来驱动四位数码管。 c.七段数码管 所使用的数码管为共阴极,使用时将四个数码管的公共端通过74LS07连接到单片机对应的P2口,从而用P2口来点亮相应的数码管,即
16、P2口输出为低电平时,对应的数码管点亮;将其他段选信号脚接到P0口,当P0口部分端输出为高电平时,则点亮相应的字段。 3.3 软件程序设计 对于定时器服务子程序,设置TH1=0F0H TL1=60H,从而产生5ms的脉冲,循环200次,实现定时1秒的目的。 MOV SP,#60H ;设置堆栈指针 MOV TMOD,#15H ;定时器T1工作在方式1定时模式,计数器T0工作在方式1计数模式 MOV TH1,#0ECH ;T1置计数初值,定时5mS
17、 MOV TL1,#78H SETB EA ;CPU开中断 SETB ET1 ;允许定时器/计数器T1中断 MOV TH0,#0 MOV TL0,#0 ;给计数器T0赋初值0 MOV 30H,#200 ;循环200次 200*5=1S定时1S
18、 MOV 33H,#0 ;用于判断显示数码管哪一位 SETB TR1 ;启动定时器1 SETB TR0 ;启动计数器0 字库的选择,根据端选引脚(abcdefg)与P0口连接情况进行汇编,若hcdegfab依次与P0.7—-P0.0相连,则0可表示为:77H。为了焊接的方便,现将引脚连接如下: P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2
19、 P2.3 a b c d e f g h 1 2 3 4 可以得到相应的字库为(加h位): 0 1 2 3 4 5 6 7 8 9 0BFH 86H 0DBH 0CFH 0E6H 0EDH 0FDH 87H 0FFH 0EFH 四.单片机的硬件连接图 (1) 电路原理图如下 电路连接原理图 (2)硬件安装图如下 五.流程图 a.主程序流程图 ORG 0000H ;程序复位入口地址 AJMP
20、 MAIN ;转移到主程序 ORG 001BH ;定时器T1的中断入口 AJMP PFRO ;跳转到中断程序中 ORG 0022H ;主程序入口地址 MAIN:MOV SP,#60H ;设置堆栈指针 初始化 将测量值转 换为十进数 拆为非压 缩BCD数 调用显示 子程序 MOV TMOD,#15H ;定时器T1工作在方式1定时模式,计数器T0工作在方式1计数模式 MOV TH1,#0ECH
21、 ;T1置计数初值,定时5mS MOV TL1,#78H SETB EA ;CPU开中断 SETB ET1 ;允许定时器/计数器T1中断 MOV TH0,#0 MOV TL0,#0 ;给计数器T0赋初值0 MOV 30H,#200
22、 ;循环200次 200*5=1S定时1S MOV 33H,#0 ;用于判断显示数码管哪一位 SETB TR1 ;启动定时器1 SETB TR0 ;启动计数器0 LOOP:ACALL BCD ;将二进制数转换为压缩BCD码 ACALL NBCD ;将压缩BCD码转换为非压缩BCD码 AJMP LOOP ;循环处理计数器T0采集得到的数据 PFRO:MO
23、V TH1,#0ECH ;中断程序 b.定时器1中断服务程序 MOV TL1,#78H ;给定时器T1重新赋值 INC 33H ;数码管判断位加1 MOV A,40H ;非压缩BCD码最高位 重 设 TH1,TL1 1秒 到 否 读TH0,TL0到 频率单元 清 零 TH0 ,TL0
24、返回 CJNE A,#0,WANW ;判断40H单元是否为零,若为0继续往下执行,若不为0,则跳转到子程序WANW中 MOV A,33H ;每5ms显示一位,从最高位开始,到最低位时,返回高位 CJNE A,#1,LOP1 ;判断40H单元是否为1,若为 1继续往下执行,若不为1,则跳转到子程序LOP1中 ACALL QIAW ;千位 AJMP DSHI LOP1: CJNE A,#2,LOP2 ACALL
25、 BAIW ;百位 AJMP DSHI LOP2: CJNE A,#3,LOP3 ACALL SHIW ;十位 AJMP DSHI LOP3: ACALL GEEW ;个位 MOV 33H,#0 AJMP DSHI DSHI: DJNZ 30H,FHUI ;判断是否到1S MOV 20H,TH0 MOV 21H,TL0 ;将计数器T0中的
26、数转移到20H,21H中 MOV TH0,#0 MOV TL0,#0 ;将计数器T0重新赋0 MOV 30H,#200 FHUI:RETI c.二进制转换为压缩BCD码 BCD: MOV R2,20H ;将计数得到的值存入R2和R3中 MOV R3,21H CLR A MOV R4,#0 ;将R4、R5、R6清零 MOV R5,#0 MOV R6,#0 MOV R7,#16
27、 LOP: CLR C ; 将16位二进制数逐位左移一位 ,移得的数据放入进位C中 调用转换 子程序 20H R2 21H R3 0 R4R5R6 16 R7 R2R3左移一位 (R4R5R6)*2+C R7-1*N>0 MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,R6
28、 DA A MOV R6,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ R7,LOP RET 将R5R6中的内容与A进行半字节交换 R5R6中的内容高低字节交换 交换结果即为显示的值 d.压缩BCD码转换为非压缩BCD码 NBCD:MOV A,R5 ;将压缩BCD码R4R5R6转换为非压缩BCD码 ,
29、从高到低依次放于40H、41H、42H、43H、44H ANL A,#0F0H SWAP A MOV 41H,A MOV A,R5 ANL A,#0FH MOV 42H,A MOV A,R6 ANL A,#0F0H SWAP A MOV 43H,A MOV A,R6 ANL A,#0FH MOV 44H,A MOV 40H,R4 RET A 41H 查表将结果送到A中 A P
30、0 把位选给P2 数码管驱动显示 e.显示子程序(以10K位为例) WANW:MOV A,33H ;10KHZ CJNE A,#1,LOOP1 ACALL QIAW1 AJMP DSHI LOOP1: CJNE A,#2,LOOP2 ACALL BAIW1 AJMP DSHI LOOP2: CJNE A,#3,LOOP3 ACALL SHIW1 AJMP DSHI LOOP3: ACALL GEEW1
31、 MOV 33H,#0 AJMP DSHI 六.总程序设计 ORG 0000H ;程序复位入口地址 AJMP MAIN ;转移到主程序 ORG 001BH ;定时器T1的中断入口 AJMP PFRO ;跳转到中断程序中 ORG 0022H ;主程序入口地址 MAIN:MOV SP,#60H ;设置堆栈指针 MOV TMOD,#15H ;定时器T1工作在方式1定
32、时模式,计数器T0工作在方式1计数模式 MOV TH1,#0ECH ;T1置计数初值,定时5mS MOV TL1,#78H SETB EA ;CPU开中断 SETB ET1 ;允许定时器/计数器T1中断 MOV TH0,#0 MOV TL0,#0
33、 ;给计数器T0赋初值0 MOV 30H,#200 ;循环200次 200*5=1S定时1S MOV 33H,#0 ;用于判断显示数码管哪一位 SETB TR1 ;启动定时器1 SETB TR0 ;启动计数器0 LOOP:ACALL BCD ;将二进制数转换为压缩BCD码 ACALL NBCD ;将压缩BCD码转换为非压缩BCD码
34、 AJMP LOOP ;循环处理计数器T0采集得到的数据 PFRO:MOV TH1,#0ECH ;中断程序 MOV TL1,#78H ;给定时器T1重新赋值 INC 33H ;数码管判断位加1 MOV A,40H ;非压缩BCD码最高位 CJNE A,#0,WAN
35、W ;判断40H单元是否为零,若为0继续往下执行,若不为0,则跳转到子程序WANW中 MOV A,33H ;每5ms显示一位,从最高位开始,到最低位时,返回高位 CJNE A,#1,LOP1 ;判断40H单元是否为1,若为1继续往下执行,若不为1,则跳转到子程序LOP1中 ACALL QIAW ;千位 AJMP DSHI LOP1: CJNE A,#2,LOP2 ACALL BAIW ;百位
36、 AJMP DSHI LOP2: CJNE A,#3,LOP3 ACALL SHIW ;十位 AJMP DSHI LOP3: ACALL GEEW ;个位 MOV 33H,#0 AJMP DSHI WANW:MOV A,33H ;10KHZ CJNE A,#1,LOOP1 ACALL QIAW1 AJMP DSHI LOOP1: CJNE A,#2,LOOP
37、2 ACALL BAIW1 AJMP DSHI LOOP2: CJNE A,#3,LOOP3 ACALL SHIW1 AJMP DSHI LOOP3: ACALL GEEW1 MOV 33H,#0 AJMP DSHI DSHI: DJNZ 30H,FHUI ;判断是否到1S MOV 20H,TH0 MOV 21H,TL0 ;将计数器T0中的数转移到20H,21H中 MOV TH0,#0
38、 MOV TL0,#0 ;将计数器T0重新赋0 MOV 30H,#200 FHUI:RETI BCD: MOV R2,20H ;将计数得到的值存入R2和R3中 MOV R3,21H CLR A MOV R4,#0 ;将R4、R5、R6清零 MOV R5,#0 MOV R6,#0 MOV R7,#16 LOP: CLR C
39、 ; 将16位二进制数逐位左移一位 ,移得的数据放入进位C中 MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,R6 DA A MOV R6,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A
40、 MOV R4,A DJNZ R7,LOP RET NBCD:MOV A,R5 ;将压缩BCD码R4R5R6转换为非压缩BCD码 ,从高到低依次放于40H、41H、42H、43H、44H ANL A,#0F0H SWAP A MOV 41H,A MOV A,R5 ANL A,#0FH MOV 42H,A MOV A,R6 ANL A,#0F0H SWAP A MOV 43H,A MOV A,R6 A
41、NL A,#0FH MOV 44H,A MOV 40H,R4 RET QIAW:MOV A,41H ;频率不超过10KHZ时,以HZ为单位,四位显示,最高位为千位,以此类推 MOV DPTR,#TAB2 ;千位上显示41H单元中的内容 MOVC A,@A+DPTR MOV P0,A MOV P2,#0F7H RET BAIW:MOV A,42H ;百位上显示42H单元中的内容 MOV DPTR,#TAB
42、1 MOVC A,@A+DPTR MOV P0,A MOV P2,#0FBH RET SHIW:MOV A,43H ;十位上显示43H单元中的内容 MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV P0,A MOV P2,#0FDH RET GEEW:MOV A,44H ;个位上显示44H单元中的内容,显示小数点,表示可测量频率小于10KHZ MOV
43、 DPTR,#TAB1 MOVC A,@A+DPTR MOV P0,A MOV P2,#0FEH RET QIAW1:MOV A,40H ;频率大于10KHZ时,小数点放千位,以KHZ为单位 MOV DPTR,#TAB1 ;千位上显示40H单元中的内容 MOVC A,@A+DPTR MOV P0,A MOV P2,#0EFH RET BAIW1:MOV A,41H ;百位上显示41H单元中的内容和显示小数点
44、 MOV DPTR,#TAB2 MOVC A,@A+DPTR MOV P0,A MOV P2,#0F7H RET SHIW1:MOV A,42H ;十位上显示42H单元中的内容 MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV P0,A MOV P2,#0FBH RET GEEW1:MOV A,43H ;个位上显示43H单元中的内容 MOV DPTR,#TAB1 MOVC A,@A
45、DPTR MOV P0,A MOV P2,#0FDH RET TAB1:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;GFEDCBA TAB2:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH ;HGFEDCBA END 七.系统调试及结果分析 7.1 硬件调试 硬件电路板焊接好以后,先用万用表测试电路中有无虚焊短接之处,将所有的电源及地线测量一下,看有无遗漏。测试无误后,将板子通电,用万用表检测电源和地线之间是否是5V电压,测量无误后,进行静
46、态调试。 取两根线一端接地,另一端接P2.0~P2.3口中的一个口,若对应数码管亮,再用另一根导线,其中一端接地,另一端与P0.0~P0.7依次接触,看数码管各段的亮灭情况,从而判断每个数码管各段的好坏及电路的是否正确。若有异常显示,则需查找对应接线。 通电后,将示波器一端接地,另一端接P3.4口,看波形是否为方波。(周期T大约为6.7ms) 7.2 软件调试 将编好的子程序进行编译仿真,并进行调试。若有错误显示,则需一一改正后,再进行调试。将所有子程序仿真完毕后,在调试总程序,进行仿真,通过仿真头连接到电路板上进行调试。 7.3结果分析 1.故障分析: 问题1:无方波显示 解
47、决办法:查看是否是连接的到T0(14管教),如连接正常,则查看电路是否有漏焊或虚焊。 问题2:数码管不亮 解决办法:查看硬件电路发现数码管的公共端没有接,用电烙铁全部连起来 问题3:用程序驱动数码管发现出现乱码 解决办法:先查看程序是否编码错误,若无错误,查找焊接。由于焊接电路时,数码管7段显示没有按照顺序接,P2口也没按顺序接,然后调整程序和电路板。 2.误差分析 由原理图可知频率的理论值f=1/(2.2RC)=189.6HZ,由示波器读出来的值为149.1HZ。有数码管读出来的值148到153之间变化。由于单片机的计数的速率限制会存在误差,测得是瞬时频率,所以数码管或跳动。可能
48、是产生信号源的电路所产生的脉冲不稳定,导致结果有误差。还有可能硬件电路焊接的问题,焊锡的多少,导线的长短有关。还有误差来源有可能来自振荡电路,12MHZ的晶振准确度不够。从而引起结果误差。 八.注意事项 1. 在焊接电路板之前,先画好硬件原理图,在电路板上面排版,使得元器件都合理分布,芯片朝一个方向,同时使仿真头不会挡住数码管。 2.焊接器件时,应遵循由小及大,由埃及高的原则排列,同时焊的时候焊管座,不要插芯片。 3.焊接完一个模块都要用万用表检测电路是否出现短接,如果出现短路,需要检测出现短路的地方。 4. 电路板及访真机接电源操作时,要注意正负极,不要带电操作,以免造成元器
49、件和仿真机的损坏。(本实验黑为正极,红为负极) 5. 在使用仿真头的时候,应把所有的引脚全部对齐后再均匀用力按下,不要压断或者压弯引脚,取下仿真头是应用起子或者镊子,从两边撬开,待引脚连接松动后,两边同时用力,轻轻拔出,并给仿真头安上保护套。 九.心得体会 虽然这门课修过公选,但时隔一年本就不大熟的知识更加淡漠,完成整体设计颇费周折。在这过程中书到用时方恨少,天下还是好人多——同学和老师的帮助给了我莫大的动力。,我相信这过程必然对我今后的学习和工作产生积极的影响。 硬件的设计跟焊接都要我们自己动手去焊,软件的编程也要我们不断的调试,最终一个能完成课程设计的劳动成果出来了,很高兴它能按
50、着设计的思想与要求运动起来,那便我的辛劳的结晶。当然本次选择设计的定时数字频率计,因为受材料和个人知识水平的限制只能满足满足一般的测量要求,且电路在测试复杂信号时存在一定的问题,频率只能稳定在一定范围内,虽可以通过选取特定的频段来排除频率变化较复杂区段的干扰,但这样针对不同的信号源都要重新调整程序,过于复杂。而更精确的频率计设计,现有水平还不能达到,所以本次就未深入涉及。 当然,这其中也有很多问题,第一,不够细心比如由于粗心大意焊错了线,由于对课本理论的不熟悉导致编程出现错误。第二,在做人上,我认识到,无论做什么,只要你坚强,有足够的毅力决心,就一定会成功。 一分耕耘,一分收获;一次实验,






