基于单片机数字频率计设计汇编语言程序的设计思路 200
一、设计目的——掌握数字量数据采集系统的设计方法。二、技术指标1.测量范围:0~200K2.测量信号:方波3.测量信号电压:3~5V4.闸门时间:10mS、0.1S、1S...
一、 设计目的
——掌握数字量数据采集系统的设计方法。
二、技术指标
1.测量范围:0~200K
2.测量信号:方波
3.测量信号电压:3~5V
4.闸门时间:10mS、0.1S、1S
5.显示位数:6位
三、设计方案
根据技术要求,可确定出该数字频率计应由测量电路(包括量程标定电路和ADC)、单片机、键盘及显示电路几个组成部分,各部分采用的电路形式及主要器件确定如下:
(1)单片机部分
选用89C51单片机作为主机,同时要设计89C51单片机的晶振电路和复位电路,具体电路略。
(2)测量电路部分
直接利用单片机内部的定时/计数器实现频率的测量。
(3)键盘、显示部分
本机需配置具有3个按键的键盘和6位数字LED的显示器。具体电路参见实验箱电路图4、5。
测量频率范围:1-1000HZ 闸门时间1S,单位(HZ)
1K-10K 闸门时间0.1S (计数值×10),单位(KHZ)
10k-200k 闸门时间10mS(计数值×100)单位(KHZ)
用按键选择测量范围。
图4 显示器电路连接图
图5 键盘电路连接图
图6 等精度测量数字频率计电路图 展开
——掌握数字量数据采集系统的设计方法。
二、技术指标
1.测量范围:0~200K
2.测量信号:方波
3.测量信号电压:3~5V
4.闸门时间:10mS、0.1S、1S
5.显示位数:6位
三、设计方案
根据技术要求,可确定出该数字频率计应由测量电路(包括量程标定电路和ADC)、单片机、键盘及显示电路几个组成部分,各部分采用的电路形式及主要器件确定如下:
(1)单片机部分
选用89C51单片机作为主机,同时要设计89C51单片机的晶振电路和复位电路,具体电路略。
(2)测量电路部分
直接利用单片机内部的定时/计数器实现频率的测量。
(3)键盘、显示部分
本机需配置具有3个按键的键盘和6位数字LED的显示器。具体电路参见实验箱电路图4、5。
测量频率范围:1-1000HZ 闸门时间1S,单位(HZ)
1K-10K 闸门时间0.1S (计数值×10),单位(KHZ)
10k-200k 闸门时间10mS(计数值×100)单位(KHZ)
用按键选择测量范围。
图4 显示器电路连接图
图5 键盘电路连接图
图6 等精度测量数字频率计电路图 展开
3个回答
展开全部
大学实验课吧?但是图呢?图呢????发图啊~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
补充的一条:
ADD要注意的是在实现数字频率设计是A/D模数转换:
;程序实现A/D转换功能,A/D采用中断方式。该程序通过单片机的RA2模拟通道送入
;一直流电压,当送入的直流电压大于2.5V时,8个LED闪动,当直流电压恢复到2.5V以下
;时,LED停止闪动。为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结
;果用间接寻址的方式存取。
LIST P=18F458
INCLUDE "P18F458.INC"
TIMES EQU 0X20
DEY EQU TIMES+1
ACCALO EQU TIMES+2 ;ACCA为双精度加数寄存器
ACCAHI EQU TIMES+3
ACCBLO EQU TIMES+4 ;ACCB为双精度加法的结果寄存器
ACCBHI EQU TIMES+5
FLAG EQU TIMES+6
DEYH EQU TIMES+7
DEYL EQU TIMES+9
BEGFSR EQU 0X30 ;间接寻址FSR的起始值(宏定义方式给出)
ORG 0X0000
GOTO MAIN
ORG 0X0008
GOTO INTSERVE ;转向中断服务子程序
ORG 0X30
;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB***
D_SUB
CALL NEG_A ;求ACCA的补码
;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
D_ADD
MOVF ACCALO,0 ;ACCB和ACCA低半字节相加
ADDWF ACCBLO
BTFSC STATUS,C ;有进位否?
INCF ACCBHI ;有,ACCB高字节加1,再加ACCAHI
MOVF ACCAHI,0 ;ACCA、ACCB高半字节相加
ADDWF ACCBHI
RETURN ;子程序返回
;************** ACCA取补子程序*****************
NEG_A
COMF ACCALO ;ACCALO取反加1
INCF ACCALO
BTFSC STATUS,Z ;低8位有进位吗?
DECF ACCAHI ;有,ACCAHI减1,再取反
COMF ACCAHI ;否则ACCAHI直接取反
RETURN ;子程序返回
;*********初始化子程序***************
INITIAL
CLRF INTCON ;禁止总中断和外围中断
MOVLW 0X51
MOVWF ADCON0 ;选择AD通道为RA2,且打开A/D转换器
;在工作状态,且使AD转换时钟为8Tosc
MOVLW 0X80
MOVWF ADCON1 ;转换结果右移,即ADRESH寄存器的高6
;位为"0",且把RA2口设置为模拟量输入式
;(注意后面要把RA5改成数据I/O方式,以
;输出显示琐存信号)
BCF PIR1,ADIF ;清除A/D转换标志
BSF PIE1,ADIE ;A/D转换中断允许
BSF INTCON,PEIE ;外围中断允许
BSF IPR1,ADIP ;B口变位中断高优先级
BSF RCON,7 ;使能中断优先级
BSF TRISA,2 ;设置RA2为输入方式
BCF TRISA,5 ;置RA5为输出方式,以输出锁存信号
BCF TRISC,5
BCF TRISC,3 ;设置SCK与SDO为输出方式
MOVLW 0XC0
MOVWF SSPSTAT ;设置SSPSTAT寄存器
MOVLW 0X30
MOVWF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并
;且时钟下降沿发送,与"74HC595当其
;SCLK从低到高电平跳变时,串行输入数据
;(DI)移入寄存器"的特点相应
CLRF FLAG
RETURN
;*********软件延时子程序****************
DELAY
MOVLW 0XFF
MOVWF DEYH
AGAIN1 MOVLW 0XFF
MOVWF DEYL
AGAIN2 NOP
DECFSZ DEYL
GOTO AGAIN2
DECFSZ DEYH
GOTO AGAIN1
RETURN
;*************** A/D中断服务子程序*****************
INTSERVE
BCF PIR1,ADIF ;清除A/D转换标志
MOVF ADRESH,W
MOVWF INDF0 ;读取并存储A/D转换结果的高两位
INCF FSR0L
MOVF ADRESL,W
MOVWF INDF0
INCF FSR0L ;读取并存储A/D转换结果的低8位
DECF TIMES,1 ;A/D转换次数减1
MOVLW 0X02
MOVWF DEY
LOOP13 DECFSZ DEY,1
GOTO LOOP13 ;给予一定的延时,保证两次A/D转换期间
;2Tad的间隔时间和电容的采样时间
BSF ADCON0,2 ;启动下一次A/D转换
RETFIE ;中断返回
;********** LED闪烁报警子程序*************
ALARM
MOVLW 0X01
XORWF FLAG,1
BTFSS FLAG,0
CALL DISPLAY0 ;调用显“0”子程序
NOP
BTFSC FLAG,0
CALL DISPDARK ;调用显“DARK”子程序
RETURN
;**********显全0子程序*************
DISPLAY0
TRANSMIT ;SPI发送显示子模块
CLRF PORTA ;LACK送低电平,为锁存做准备
MOVLW 0X08
MOVWF TIMES
LOOP80 MOVLW 0XC0 ;显示值为0,C0H为0的段码
MOVWF SSPBUF ;启动发送
WAIT
BTFSS PIR1,SSPIF
GOTO WAIT ;等待发送结束
BCF PIR1,SSPIF ;清除中断标志
DECFSZ TIMES
GOTO LOOP80 ;一次要发送完8个数据
BSF PORTA,5 ;最后给一个锁存信号,代表一次显示任务完成
RETURN
;**********显示全DARK子程序*************
DISPDARK
TRANSMIT1 ;SPI发送显示子模块
CLRF PORTA ;LACK送低电平,为锁存做准备
MOVLW 0X08
MOVWF TIMES
LOOP8D MOVLW 0XFF ;显示值为0,FFH为DARK的段码
MOVWF SSPBUF ;启动发送
WAIT1
BTFSS PIR1,SSPIF
GOTO WAIT1 ;等待发送结束
BCF PIR1,SSPIF ;清除中断标志
DECFSZ TIMES
GOTO LOOP8D ;一次要发送完8个数据
BSF PORTA,5 ;最后给一个锁存信号,代表一次显示任务完成
RETURN
;***************主程序******************
MAIN NOP
CALL INITIAL ;初始化
LOOP
MOVLW 0X80 ;转换结果右移,及ADRESH寄存器的高6位为"0"
;且把RA2口设置为模拟量输入式(注意后面要把
; RA5改成数据I/O方式,以输出显示琐存信号)
MOVWF ADCON1
MOVLW BEGFSR
MOVWF FSR0L ;给出间接寻址时FSR的初值
MOVLW 0X0A
MOVWF TIMES ;每一轮A/D连续采样10次
BSF INTCON,GIE ;总中断打开,及可以进行A/D转换中断
BSF ADCON0,2 ;启动A/D转换
LOOP1 MOVF TIMES,W
BTFSS STATUS,Z
GOTO LOOP1 ;等待A/D转换中断
BCF INTCON,GIE ;A/D转换次数到10次,关闭中断
NOP
CLRF ACCBHI
CLRF ACCBLO ;双精度加法的结果寄存器清0,为后面准备
MOVLW 0X0A
MOVWF TIMES
MOVLW BEGFSR
MOVWF FSR0L
LOOP15 MOVF INDF0,W
MOVWF ACCAHI
INCF FSR0L
MOVF INDF0,W
MOVWF ACCALO
INCF FSR0L
CALL D_ADD
DECFSZ TIMES
GOTO LOOP15
NOP ;计算得到10次A/D转换的和
MOVLW 0X84
MOVWF ADCON1 ;把RA5设成数字I/O,以输出显示锁存信号
MOVLW 0X14
MOVWF ACCAHI
CLRF ACCALO
CALL D_SUB ;通过双精度减判断模拟量是否达到报警限
;度(1400H=200H*0AH,200H与2.5V对应)
BTFSS ACCBHI,7
CALL ALARM ;若ACCBHI的最高位为1,则证明减法结
;果为负,即直流电压值超过2.5V,则报警
NOP
BTFSC ACCBHI,7
CALL DISPLAY0 ;若没有超过2.5V,则不报警,8个LED
;同时显示0
CALL DELAY ;软件延时,使电压检测不要过于频繁
GOTO LOOP ;重复检测输入的直流电压值
END
ADD要注意的是在实现数字频率设计是A/D模数转换:
;程序实现A/D转换功能,A/D采用中断方式。该程序通过单片机的RA2模拟通道送入
;一直流电压,当送入的直流电压大于2.5V时,8个LED闪动,当直流电压恢复到2.5V以下
;时,LED停止闪动。为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结
;果用间接寻址的方式存取。
LIST P=18F458
INCLUDE "P18F458.INC"
TIMES EQU 0X20
DEY EQU TIMES+1
ACCALO EQU TIMES+2 ;ACCA为双精度加数寄存器
ACCAHI EQU TIMES+3
ACCBLO EQU TIMES+4 ;ACCB为双精度加法的结果寄存器
ACCBHI EQU TIMES+5
FLAG EQU TIMES+6
DEYH EQU TIMES+7
DEYL EQU TIMES+9
BEGFSR EQU 0X30 ;间接寻址FSR的起始值(宏定义方式给出)
ORG 0X0000
GOTO MAIN
ORG 0X0008
GOTO INTSERVE ;转向中断服务子程序
ORG 0X30
;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB***
D_SUB
CALL NEG_A ;求ACCA的补码
;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
D_ADD
MOVF ACCALO,0 ;ACCB和ACCA低半字节相加
ADDWF ACCBLO
BTFSC STATUS,C ;有进位否?
INCF ACCBHI ;有,ACCB高字节加1,再加ACCAHI
MOVF ACCAHI,0 ;ACCA、ACCB高半字节相加
ADDWF ACCBHI
RETURN ;子程序返回
;************** ACCA取补子程序*****************
NEG_A
COMF ACCALO ;ACCALO取反加1
INCF ACCALO
BTFSC STATUS,Z ;低8位有进位吗?
DECF ACCAHI ;有,ACCAHI减1,再取反
COMF ACCAHI ;否则ACCAHI直接取反
RETURN ;子程序返回
;*********初始化子程序***************
INITIAL
CLRF INTCON ;禁止总中断和外围中断
MOVLW 0X51
MOVWF ADCON0 ;选择AD通道为RA2,且打开A/D转换器
;在工作状态,且使AD转换时钟为8Tosc
MOVLW 0X80
MOVWF ADCON1 ;转换结果右移,即ADRESH寄存器的高6
;位为"0",且把RA2口设置为模拟量输入式
;(注意后面要把RA5改成数据I/O方式,以
;输出显示琐存信号)
BCF PIR1,ADIF ;清除A/D转换标志
BSF PIE1,ADIE ;A/D转换中断允许
BSF INTCON,PEIE ;外围中断允许
BSF IPR1,ADIP ;B口变位中断高优先级
BSF RCON,7 ;使能中断优先级
BSF TRISA,2 ;设置RA2为输入方式
BCF TRISA,5 ;置RA5为输出方式,以输出锁存信号
BCF TRISC,5
BCF TRISC,3 ;设置SCK与SDO为输出方式
MOVLW 0XC0
MOVWF SSPSTAT ;设置SSPSTAT寄存器
MOVLW 0X30
MOVWF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并
;且时钟下降沿发送,与"74HC595当其
;SCLK从低到高电平跳变时,串行输入数据
;(DI)移入寄存器"的特点相应
CLRF FLAG
RETURN
;*********软件延时子程序****************
DELAY
MOVLW 0XFF
MOVWF DEYH
AGAIN1 MOVLW 0XFF
MOVWF DEYL
AGAIN2 NOP
DECFSZ DEYL
GOTO AGAIN2
DECFSZ DEYH
GOTO AGAIN1
RETURN
;*************** A/D中断服务子程序*****************
INTSERVE
BCF PIR1,ADIF ;清除A/D转换标志
MOVF ADRESH,W
MOVWF INDF0 ;读取并存储A/D转换结果的高两位
INCF FSR0L
MOVF ADRESL,W
MOVWF INDF0
INCF FSR0L ;读取并存储A/D转换结果的低8位
DECF TIMES,1 ;A/D转换次数减1
MOVLW 0X02
MOVWF DEY
LOOP13 DECFSZ DEY,1
GOTO LOOP13 ;给予一定的延时,保证两次A/D转换期间
;2Tad的间隔时间和电容的采样时间
BSF ADCON0,2 ;启动下一次A/D转换
RETFIE ;中断返回
;********** LED闪烁报警子程序*************
ALARM
MOVLW 0X01
XORWF FLAG,1
BTFSS FLAG,0
CALL DISPLAY0 ;调用显“0”子程序
NOP
BTFSC FLAG,0
CALL DISPDARK ;调用显“DARK”子程序
RETURN
;**********显全0子程序*************
DISPLAY0
TRANSMIT ;SPI发送显示子模块
CLRF PORTA ;LACK送低电平,为锁存做准备
MOVLW 0X08
MOVWF TIMES
LOOP80 MOVLW 0XC0 ;显示值为0,C0H为0的段码
MOVWF SSPBUF ;启动发送
WAIT
BTFSS PIR1,SSPIF
GOTO WAIT ;等待发送结束
BCF PIR1,SSPIF ;清除中断标志
DECFSZ TIMES
GOTO LOOP80 ;一次要发送完8个数据
BSF PORTA,5 ;最后给一个锁存信号,代表一次显示任务完成
RETURN
;**********显示全DARK子程序*************
DISPDARK
TRANSMIT1 ;SPI发送显示子模块
CLRF PORTA ;LACK送低电平,为锁存做准备
MOVLW 0X08
MOVWF TIMES
LOOP8D MOVLW 0XFF ;显示值为0,FFH为DARK的段码
MOVWF SSPBUF ;启动发送
WAIT1
BTFSS PIR1,SSPIF
GOTO WAIT1 ;等待发送结束
BCF PIR1,SSPIF ;清除中断标志
DECFSZ TIMES
GOTO LOOP8D ;一次要发送完8个数据
BSF PORTA,5 ;最后给一个锁存信号,代表一次显示任务完成
RETURN
;***************主程序******************
MAIN NOP
CALL INITIAL ;初始化
LOOP
MOVLW 0X80 ;转换结果右移,及ADRESH寄存器的高6位为"0"
;且把RA2口设置为模拟量输入式(注意后面要把
; RA5改成数据I/O方式,以输出显示琐存信号)
MOVWF ADCON1
MOVLW BEGFSR
MOVWF FSR0L ;给出间接寻址时FSR的初值
MOVLW 0X0A
MOVWF TIMES ;每一轮A/D连续采样10次
BSF INTCON,GIE ;总中断打开,及可以进行A/D转换中断
BSF ADCON0,2 ;启动A/D转换
LOOP1 MOVF TIMES,W
BTFSS STATUS,Z
GOTO LOOP1 ;等待A/D转换中断
BCF INTCON,GIE ;A/D转换次数到10次,关闭中断
NOP
CLRF ACCBHI
CLRF ACCBLO ;双精度加法的结果寄存器清0,为后面准备
MOVLW 0X0A
MOVWF TIMES
MOVLW BEGFSR
MOVWF FSR0L
LOOP15 MOVF INDF0,W
MOVWF ACCAHI
INCF FSR0L
MOVF INDF0,W
MOVWF ACCALO
INCF FSR0L
CALL D_ADD
DECFSZ TIMES
GOTO LOOP15
NOP ;计算得到10次A/D转换的和
MOVLW 0X84
MOVWF ADCON1 ;把RA5设成数字I/O,以输出显示锁存信号
MOVLW 0X14
MOVWF ACCAHI
CLRF ACCALO
CALL D_SUB ;通过双精度减判断模拟量是否达到报警限
;度(1400H=200H*0AH,200H与2.5V对应)
BTFSS ACCBHI,7
CALL ALARM ;若ACCBHI的最高位为1,则证明减法结
;果为负,即直流电压值超过2.5V,则报警
NOP
BTFSC ACCBHI,7
CALL DISPLAY0 ;若没有超过2.5V,则不报警,8个LED
;同时显示0
CALL DELAY ;软件延时,使电压检测不要过于频繁
GOTO LOOP ;重复检测输入的直流电压值
END
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-06-07
展开全部
流程图呢??
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询