1 前言
单片微型计算机简称单片机,又称微控制器(MCU),它的出现是计算机发展史上的一个重要的里程碑,它以体积小、功能全、性价比高等诸多优点独具特色,在工业控制、尖端武器、通信设备、信息处理、家用电器等嵌入式应用领域中独占鳌头。
本次课设采用的STC89C51单片机是51系列单片机的一种代表,目前51系列单片机是国内目前应用最广泛的一种单片机之一。单片机以其系统硬件构架完整、价格低廉、学生能动手等特点,成为工科学生硬件设计的基础课。
2 单片机系统板的介绍
本次课设所使用的单片机最小系统板包括以下器件:电源端子(DC +5V),可以USB供电,也可独立电源供电。通用异步串口,采用MAX232做电平转换。STC89C51单片机,支持串口下载和单步调试 ZLG7290管理芯片,是IIC总线通信的键盘扫描和数码管显示芯片,自带8M晶振,最多可扫描64个键盘和8个数码管。各种颜色的LED发光二极管共9个,其中8个接于P1口做LED显示,还有一个做电源灯显示。TLC549,8位串行AD。TLC5615,10位串行DA。还有其他电阻电容若干,系统板一个,大按键开关两个,用于中断控制和通信开关。
利用STC51系列特有的ISP在线编程,方便我们初学者的二次开发,省去大量芯片烧写时间。USB电源线供电和外接供电并存,方便学生在寝室使用。电源保护电路,有效防止电源接反对CPU造成的损害。增加专门的键盘扫描和数码管显示芯片,只占用2个I/O口和一个外部中断就能完成8个数码管显示和最多64个键盘扫描。增加了I/O口键盘扫描,2种扫描方式可通过跳线由用户自己选择。所有I/O口均用引脚引出,方便用户扩展。外部中断0和外部脉冲记数按键复用,通过跳线,用户即可以进行外部中断实验,也可以进行外部T0记数实验。增加了串行的AD和DA芯片,可直接在开发板上进行AD和DA的实验。
3 有效值测量程序流程图
本次课设的任务是利用自己亲手做的单片机最小系统,通过编程和调试,实现正弦波的有效值测量,并用数码管将测量的有效值显示出来。其过程是先通过A/D采样取出最大值,然后根据定义计算出有效值,通过进制转换将16进制转换称10进制BCD码,把查表得到的码形值通过STC89C51单片机的IIC总线方式写到ZLG7290中用数码管显示,流程图如图3.1所示。
图3.1 有效值测量程序流程图
4 A/D转换部分
本次课设的任务是实现正弦波有效值的测量,一般有效值的测量主要有平均值法峰值法,真有效值转换芯片测量等方法。本次课程设计采用TI公司的串行A/D转换芯片TLC549测量交流信号,再根据有效值的定义式求得其有效值。
4.1 TLC549功能简介
TLC549 是以8 位开关电容逐次逼近A/D 转换器为基础而构造的CMOS A/D 转换器。它设计成能通过3 态数据输出和模拟输入与微处理器或外围设备串行接口。TLC549 仅用输入/输出时 钟 (I/O CLOCK )和芯片选择 (CS )输入作数据控制。TLC549 的I/O CLOCK 输入频率最高可达 1.1MHz。转换结果有DOUT脚读出。其外围管脚如图4.1所示。
图4.1 TLC549的外围管脚图
当输入的模拟电压大于REF+端电压时,TCL549输出为FFH,当输入的模拟电压小于REF-端电压时,TCL549输出00H。使用时通常将REF-端与GND相连。TCL549的工作时序如图4.2所示。
图4.2 TCL549的工作时序图
![]() |
图4.3 AD转换原理框图
若定义STC89C51单片机的P1.2口为片选信号控制,P1.3口为A/D转换后输出结果读取端,P1.4口为TLC549的时钟输入端,则TCL549与单片机的硬件连接如图4.4所示。
图4.4 TCL549与单片机的硬件连接
4.2 A/D转换的驱动程序
AD:MOV R2,#08H ;第一次采样CLOCK的8个脉冲
CLR P1.2 ;CS变为低电平
NOP
NOP
NOP
L 3:MOV C,P1.3 ;对模拟输入采样,读出结果OUT
MOV A,20H
RLC A
MOV 20H,A
LCALL PULSE ;调用产生CLK时钟脉冲子程序
DJNZ R2,L3
MOV R2,#24H ;A/D转换的36个时钟周期
SETB P1.2 ;CS变为高电平,开始保持和转换
L 4:LCALL PULSE
DJNZ R2,L4
RET
PULSE:SETB P1.4 ;p1.4输出高电平,CLOCK时钟
NOP
NOP
NOP
CLR P1.4
RET
5 有效值的计算
![]() |
图5.1 有效值计算的流程图
按照上面介绍的有效值近似计算方法和结果进制转换的过程,可以编写出计算有效值的实验程序如下:
MOV A,21H ;A/D转换的结果存于21H中
MOV B,#0CH
MUL AB
MOV 39H,B ;得到的新的16进制数高字节放39H中,低字节放40H中
MOV 40H,A
HUAN:MOV A,39H ;将存放于39H单元中待转换的16进制数高字节存于A
MOV B,#0AH
DIV AB
MOV 41H,A ;商送41H单元暂存
MOV A,B ;余数送回A
MOV 42H,40H ;待变换16进制数的低字节送42H单元暂存
ANL 42H,#0F0H ;屏蔽低半字节
ADD A,42H ;高字节除#0AH后余数与低字节的前半字节相加,
;后半字节换位使上次除法余数仍在高位
SWAP A
MOV B,#0AH
DIV AB
MOV 43H,A ;商送43H单元暂存
MOV A,B ;余数送到A
SWAP A ;使余数处在高半字节位数
ANL 40H,#0FH ;屏蔽待转换数低字节的高半字节
ADD A,40H
MOV B,#0AH
DIV AB
MOV 7FH,B ;得到待转换的最低位的BCD码值
MOV 44H,A ;商送44H单元暂存
MOV A,41H
SWAP A
ADD A,43H
MOV B,#0AH
DIV AB
MOV 41H,A
MOV A,B
SWAP A
ADD A,44H
MOV B,#0AH
DIV AB
MOV 42H,A ;以上是将前面计算所得到的商再除以#0AH,
;以得到倒数第二位的BCD码值
MOV 7EH,B
MOV A,41H
SWAP A
ADD A,42H
MOV B,#0EH
DIV AB
MOV 7DH,B
MOV 7CH,A
RET
6 显示部分
6.1 ZLG7290介绍
本次课程设计的单片机系统板采用ZLG7290管理芯片来控制键盘和LED数码管,ZLG7290芯片负责LED显示及键盘扫描,它与单片机采用IIC总线方式进行通信。ZLG7290的IIC接口传输速率可达32kbit/s, 容易与处理器接口,并提供键盘中断信号,提高主处理器时间效率.ZLG7290的从地址(slave address)为70H(01110000B).
ZLG7290 内可通过IIC总线访问的寄存器地址范围为 00H到17H,任一寄存器都可按字节直接读写,也可以通过命令接口间接读写或按位读写。它的控制和状态查询全部都是通过读/写寄存器实现的,用户只需像读24C02内的单元一样,即可实现对ZLG7290 的控制。ZLG7290与数码管的连接如图6.1所示。其中ZLG7290的引脚SCL和SDA分别与STC89C51单片机的P1.0和P1.1相连,实现IIC总线方式通信。
![]() |
图6.1 ZLG7290与数码管的连接图
6.2 IIC通信的原理
![]() |
图6.2
6.3 ZLG7290的驱动程序
ZLG7290与单片机是通过IIC总线方式通信的,所以只需要一根数据线和一根时钟线即可完成通信。而在通信之前和之后需要编写满足起始和停止条件的程序,为保证数据成功传输,要有发送应答位和非应答位子程序。实验程序如下:
多个字节数据发送子程序:
WRNBYT: PUSH PSW
WRNBYT1: SETB RS0
SETB RS1
CALL STA
MOV A,SLA
CALL WRB
CALL CACK
JB F0,WRNBYT
MOV R0,#MTD
MOV R5,NUMBYT
WRDA: MOV A,@R0
LCALL WRB
LCALL CACK
JB F0,WRNBYT1
INC R0
DJNZ R5,WRDA
LCALL STOP
POP PSW
RET
发送一个字节子程序:
WRB: MOV R7,#8
WLP: RLC A
JC WR1
CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R7,WLP
RET
WR1: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
DJNZ R7,WLP
RET
应答位检查子程序:
CACK: SETB SDA
SETB SCL
NOP
NOP
MOV C,SDA
MOV F0,C
CLR SCL
NOP
NOP
RET
发送起始位子程序:
STA: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
发送停止位子程序:
STOP: CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
7 刷新频率的计算
刷新频率即数据更新一次所需要的时间,也就是一个完整的抽样周期。在一个抽样周期内完成很多个A/D转换的抽样取值,抽样的次数由R3和R4确定,程序中R3为#0AH,R4等于#0C8H,所以抽样次数为2000次,即每进行2000次A/D转换之后取出最大值,并且计算出有效值加以显示,然后进行下一轮抽样,也是取2000次/AD转换的最大值,并且计算出有效值加以显示(这样显示的数据就得到了更新)。
而这2000次的A/D转换中每两次A/D转换的之间的间隔时间由定时器决定,由于TH0为#0FFH,TL0为#0A4H,所以每次AD抽样间隔约为100us,这样每一轮AD转换之后取最大值计算出有效值并显示的时间间隔约为200ms。
8 误差分析
通过单片机测量有效值的方法有多种,如利用有效值的定义式
式中
经过反复实验采集数据分析,得到误差分析如表1所示。
表1 测量差误分析
单 位:V | 一组 | 二组 | 三组 | 四组 | 五组 | 六组 | 七组 | 八组 | 九组 | 十组 |
输入电压 | 0.36 | 0.76 | 1.32 | 1.56 | 1.88 | 2.28 | 2.6 | 3.0 | 3.32 | 3.72 |
实际有效值 | 0.27 | 0.54 | 0.9 | 1.12 | 1.41 | 1.69 | 1.94 | 2.24 | 2.51 | 2.81 |
测量有效值 | 0.28 | 0.56 | 0.94 | 1.18 | 1.47 | 1.70 | 1.96 | 2.23 | 2.52 | 2.96 |
误 差 | 3.6% | 3.6% | 4.3% | 5.1% | 4.1% | 0.6% | 1.0% | 0.4% | 0.4% | 5.1% |
本次实验的AD转换芯片输入的基准电压约为4.2V,测量的正弦波信号的最大值不得超过4V,由实验结果可知,当输入的信号的最大值越接近基准电压,其测量结果误差越大。
9 小结与体会
通过这次单片机课程设计,使我的编程能力得到了很大的提高,在大脑里面形成了初步的体系结构,以致于在编程时能够灵活的运用和变更。回顾整个设计过程,从硬件焊接到软件编程,从小程序的编写调试到整个单片机功能的了解,从分析到实际运用,都经过了许多思考过程。
刚开始对整个系统板不是很熟悉,有很多芯片的用法都了解,以至于编程调试时遇到了很多的困难,失败了很多次。后来上网查资料和一些技术文献,在图书馆借了很多有关单片机的书,慢慢分析调试,最后问题都一一解决了。总结下来,这三周学会了很多东西,例如知道了在编写大程序的时候要把握一些原则,要不然很容易出错,而且很难查出错在哪里,还学会了ZLG7290键盘和数码管管理芯片的使用,以及A/D转换芯片TLC549的使用和驱动程序的编写,觉得自己的专业知识又得到了丰富。
参考文献
[1] 李群芳主编.单片微型计算机与接口技术.北京:电子工业出版社,2005
[2] 宋 浩主编.单片机原理及应用.北京:清华大学出版社,2005
[3] 凌玉华编著.单片机原理及应用系统设计.北京:中南大学出版社,2006
[4] 蒋力培编著.单片微机系统实用教程.北京:机械工业出版社,2004
[5] 潘 昊编著.单片机十六进制数与BCD码转换新探讨(摘要),1997
[6] 佟为明主编. TLC549在交流有效值测量中的应用(摘要),2006
附录一 设计总体电路图
附录二 设计总程序
NUMBYT EQU 5DH ;发送的个数,包括第一位地址
SLA EQU 5EH ;控制字或7290的地址
MTD EQU 5FH ;7290存“显示的数字”的寄存器的地址10H
SCL EQU P1.0 ;时钟脉冲
SDA EQU P1.1 ;发送数据
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:MOV SP,#30H
MOV 21H,#0
MOV R3,#0AH
MOV R4,#0C8H
LCALL AD
MOV TMOD,#01H
MOV TH0,#0FFH
MOV TL0,#0A4H
SETB EA
SETB ET0
SS: SETB TR0
JNB TF0,$
CLR TF0
LCALL AD
MOV A,21H
CJNE A,20H,SS2
JMP SS3
SS2: JNC SS3
XCH A,20H
MOV 21H,A
SS3: MOV TH0,#0FFH
MOV TL0,#0A4H
DJNZ R4,SS
MOV R4,#0C8H
DJNZ R3,SS
MOV A,21H
MOV B,#0CH
MUL AB
MOV 39H,B
MOV 40H,A
LCALL HUAN
LCALL MA
LCALL XIAN
MOV TH0,#0FFH
MOV TL0,#0A4H
MOV 21H,#0
MOV R3,#0AH
MOV R4,#0C8H
SJMP SS
查表程序
MA: MOV DPTR,#TAB
MOV R0,#7FH
MOV A,@R0
MOVC A,@A+DPTR
MOV 60H,A
DEC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV 61H,A
DEC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV 62H,A
MOV DPTR,#TAB1
DEC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV 63H,A
RET
TAB:DB
0FCH,60H,0DAH,0F2H,66H,
0B6H,0BEH,0E0H,0FEH,0E6H
TAB1:DB 0FDH,61H,0DBH,0F3H,67H,0B7H,
0BFH,0E1H,0FFH,0E7H
进制转换程序
HUAN:MOV A,39H
MOV B,#0AH
DIV AB
MOV 41H,A
MOV A,B
MOV 42H,40H
ANL 42H,#0F0H
ADD A,42H
SWAP A
MOV B,#0AH
DIV AB
MOV 43H,A
MOV A,B
SWAP A
ANL 40H,#0FH
ADD A,40H
MOV B,#0AH
DIV AB
MOV 7FH,B
MOV 44H,A
MOV A,41H
SWAP A
ADD A,43H
MOV B,#0AH
DIV AB
MOV 41H,A
MOV A,B
SWAP A
ADD A,44H
MOV B,#0AH
DIV AB
MOV 42H,A
MOV 7EH,B
MOV A,41H
SWAP A
ADD A,42H
MOV B,#0AH
DIV AB
MOV 7DH,B
MOV 7CH,A
RET
单片机读A/D转换结果
AD: MOV R2,#08H
CLR P1.2
NOP
NOP
NOP
L3:MOV C,P1.3
MOV A,20H
RLC A
MOV 20H,A
LCALL PULSE
DJNZ R2,L3
MOV R2,#24H
SETB P1.2
L4: LCALL PULSE
DJNZ R2,L4
RET
PULSE: SETB P1.4
NOP
NOP
NOP
CLR P1.4
RET
显示子程序
XIAN:: MOV MTD,#10H
MOV NUMBYT,#05H
MOV SLA,#70H
LCALL WRNBYT
RET
WRNBYT: PUSH PSW
WRNBYT1:SETB RS0
SETB RS1
CALL STA
MOV A,SLA
CALL WRB
CALL CACK
JB F0,WRNBYT
MOV R0,#MTD
MOV R5,NUMBYT
WRDA: MOV A,@R0
LCALL WRB
LCALL CACK
JB F0,WRNBYT1
INC R0
DJNZ R5,WRDA
LCALL STOP
POP PSW
RET
WRB: MOV R7,#8
WLP: RLC A
JC WR1
CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R7,WLP
RET
WR1: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
DJNZ R7,WLP
RET
CACK:SETB SDA
SETB SCL
NOP
NOP
MOV C,SDA
MOV F0,C
CLR SCL
NOP
NOP
RET
STA: SETB SDA 发送起始位
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
STOP:CLR SDA 发送停止位
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
END
联系客服