第4章 系统软件设计
#include \extern u8 ADCResult;
void INT0ISR(void) interrupt 0 //外部中断0服务函数 {
ADCResult = ADC0804ReadADResult(); // 取得ADC转换 结果 }
void INT0Initial(void) {
IT0 = 1; //指定外部中断0下降沿触发 EX0 = 1; //使能外部中断 }
4.3.3 初始化MCU程序
根据系统要求,单片机要有外部中断、定时器计数,因此初始化单片机时要初始化外部中断以及定时器来实现上述功能。
初始化MCU程序如下: #include \ void MCUInitial(void) {
GlobalInterruptDisable(); // 禁止全局中断 INT0Initial(); // 初始化外部中断 Timer0Initial(); // 初始化Tmer0
GlobalInterruptEnable(); // 允许全局中断 }
4.3.4 ADC0804启动、读取转换程序
ADC0804的启动:ADC0804中的A/D转换转换器在满足一定条件是开始一个转换过程,这个条件就是:在实现片选WR=0的前提下,引脚上出现一个上升沿。
实现A/D转换的时序如图8,实现WR=0后,使用一个上升沿信号就可以启动转换过程。图中TR2是时间延迟,时间TR3是转换时间。ADC0804转换结果的读取:在A/D转换结束以后,ADC0804的RD引脚将给出一个低脉冲,如果把这个引脚直接连接到单片机的外部中断引脚,这个低脉冲将引起单片机中断,单片机可以在中断处理程序中读取ADC0804的转换结果。
-15-
东北电力大学自动化工程学院学士学位论文
图4.2 ADC0804的时序转换
图4.3 ADC0804转换器的工作时序
ADC0804启动、读取程序如下: #include \ void ADC0804Start(void) {
iADC0804WR = 0;
iADC0804WR = 1; // 上升沿启动ADC0804转换 }
void ADC0804Initial(void) {
iADC0804WR = 1;
-16-
第4章 系统软件设计
iADC0804RD = 1; // 初始状态为WR,RD均为高电平 }
u8 ADC0804ReadADResult(void) {
u8 ADTemp;
iADC0804RD = 0; // 低电平为读数状态 ADTemp = iADC0804DATA; // 读取数据口 iADC0804RD = 1;
return ADTemp; // 返回ADC转换结果 }
4.3.5霍尔传感器ACS712的计算函数程序
查找ACS712数据手册可得到计算函数为如下 #include \
float ACS712ReadCurrent(u8 ADCValue) {
return (float)30*(ADCValue-127) / 101; }[9]
4.3.6七段数码管显示程序
系统选用4个共阴极数码管来分别显示检测电流的十位、个位、小数点后一位、小数点后俩位,再将计算结果转换成BCD码并在数码管中显示出来。
7段数码管显示程序: #include \ u8 DisplayBCD[4];
u8 code SelectTable[]={0x70,0xB0,0xD0,0xE0}; void HEXTOBCD(u16 Hex) {
DisplayBCD[3] = Hex/1000; // 千位 DisplayBCD[2] = Hex00/100; // 百位 DisplayBCD[1] = Hex0/10; // 十位 DisplayBCD[0] = Hex; // 个位
-17-
东北电力大学自动化工程学院学士学位论文
}
void DisplaySevenSegment(u16 DisplayData) {
static u8 Sel; u8 P0Temp;
HEXTOBCD(DisplayData); // 转换成BCD码 P0Temp = P0; P0Temp &= 0xF0;
P0Temp |= DisplayBCD[Sel]; // 要显示的BCD码 P0Temp &= 0x0F;
P0Temp |= SelectTable[Sel]; // 选中一只数码管 P0 = P0Temp;
if (++Sel > 3) // 四个数码管轮流显示 { Sel = 0; } }
4.3.7主程序
主程序用来调用上述子程序,包括初始化单片机、初始化ADC0804等等 #include \ u8 ADCResult; float Current; u16 CurInt;
void PowerOnInitial(void) {
ADC0804Initial(); // 初始化ADC0804 }
void main(void) {
MCUInitial(); // 初始化MCU
PowerOnInitial(); // 初始化上电默认状态 while(1)
-18-
第4章 系统软件设计
{
Current = ACS712ReadCurrent(ADCResult); // 根据ADC的转换结果计算出电流值
CurInt = Current*100; // 电流值*100以便显示 DisplaySevenSegment(CurInt); // 显示电流值 } -19-
}