单片机电压和电流的检测系统设计
虽然操作平台上通过MC14433进行A/D转换的结果已经显示出来了,但还要由单片机去测电压或测电流,并且还要将测量结果读到单片机存储器中,以便计算功率参数。
控制选择电压和电流检测的通道由下面两条指令决定的(是基于图S2-3)。
选择电压进行A/D转换:
CLR P3.7;选择电压
选择电流进行A/D转换:
SETB P3.7;选择电流
A/D转换程序:
置定时器T0初值为0FFH,并置定时器T0为外部计数,启动定时器T0,并允许定时器T0中断,则只要MC14433进行一次AD转换,转换结束时其EOC引脚便为由高向低变化,满足定时器T0的计数条件,计时器计这一次就溢出,引起定时器T0进入中断服务程序,可分四次(个、十、百、千位)读取转换结果。这是利用一个定时器/计数器扩展了一个外部中断源的典型实例。
需要注意的是每次进行A/D转换要进行两次定时器T0中断,第一次的中断为由于临时切换电压或电流通道,其切换之前就已经转换一部分时间了,所以第一次定时器T0中断时的转换结果不一定正确。其转换过程如图S4-1所示。
程序如下:
MOV TH0,#0FFH;定时器初值H
MOV TL0,#0FFH;定时器初值L
CLR 01H;标志第二次A/D转换有效
SETB ET0;允许定时器T0中断
CLR P3.7;选择电压通道进行A/D转换
MOV TMOD,#00000110B;定时器T0工作方式2(重装初值),外部计数
SETB TR0;启动定时器
RET;返回等待定时器T0中断
定时器T0中断服务程序
JB 01H,DI_ER;如果=1表示第二次定时器T0中断
;否则如果=0为第一次定时器T0中断
CPL 01H;第二次A/D转换有效标志取反
RETI
DI_ER:第二次定时器T0中断
CPL 01H;第二次A/D转换有效标志取反
读取有效结果,并整合成16进制数,暂存到71H、70H中
JNB P1.4,$;等待个位数有效
MOV A,P1;取A/D转换结果到累加器中
ANL A,#0FH;屏蔽掉高四位
MOV 70H,A;暂存到数据缓冲区
JNB P1.5,$;等待十位数有效
MOV A,P1;取A/D转换结果到累加器中
ANL A,#0FH;屏蔽掉高四位
MOV B,#10;十位数要乘以10
MUL AB
ADD A,70H;加到个位数
MOV 70H,A;在次暂存到数据缓冲区
JNB P1.6,$;等待百位数有效
MOV A,P1;取A/D转换结果到累加器中
ANL A,#0FH;屏蔽掉高四位
MOV 71H,A;暂毕业论文http://www.751com.cn存到数据缓冲区
JNB P1.7,$ ;等待百位数有效
MOV A,P1;取A/D转换结果到累加器中
ANL A,#0FH;屏蔽掉高四位
MOV B,#10;虽然是千位数,暂时先乘以10,后续再乘以100为1000
MUL AB
ADD A,71H;暂存到累加器,不存到数据缓冲区
MOV B,#100; 乘以100
MUL AB
ADD A,70H;再加上个、十位数
MOV 70H,A;保存到数据缓冲区70H
CLR A
ADDC A,B
MOV 71H,A;保存到数据缓冲区71H
CLR TR0
CLR ET0
RETI
读取得结果已经在程序中转换为16进制数并保存在了71H70H中了。
电流通道的测量和电压通道相同,这里省略。不过暂约定为要求将电流参数保存到73H、72H中。这样,71H、70H为电压参数,73H、72H为电流参数。1389