各模块详细分析
1. main.c
- 作用:程序的入口文件,负责系统的初始化和主循环的运行。在初始化阶段,调用
Init_System
函数对系统进行初始化,包括关闭无关外设、点亮特定 LED、读取一次温度数据等操作。在主循环中,不断调用DisplaySMG_Info
函数显示信息、Running_Mode
函数执行工作模式逻辑、DS18B20_Read
函数读取温度数据、Scan_Keys
函数扫描按键。 - 与其他模块的配合:
- 调用
Init_System
函数进行系统初始化,该函数在main.c
文件中定义。 - 调用
DisplaySMG_Info
函数显示信息,该函数在Nixie.c
文件中定义。 - 调用
Running_Mode
函数执行工作模式逻辑,该函数在PCF8591.c
文件中定义。 - 调用
DS18B20_Read
函数读取温度数据,该函数在DS18B20.c
文件中定义。 - 调用
Scan_Keys
函数扫描按键,该函数在Keys.c
文件中定义。
- 调用
void main()
{
Init_System();
while(1)
{
DisplaySMG_Info();
Running_Mode();
DS18B20_Read();
Scan_Keys();
}
}
2. HC573.c
和 HC573.h
- 作用:这两个文件主要实现了对 74HC573 锁存器的控制。
Select_HC573
函数根据传入的通道号和数据,通过设置 P2 口的状态来选择不同的锁存器通道,并将数据写入 P0 口。 - 与其他模块的配合:
- 在
Nixie.c
文件中,DisplaySMG_ALL
和DisplaySMG_Bit
函数调用Select_HC573
函数来控制数码管的显示。 - 在
main.c
文件的Init_System
函数中,调用Select_HC573
函数来初始化 LED 和其他外设。
- 在
void Select_HC573(unsigned char channel,unsigned char dat)
{
P2=(P2&0x1f)|0x00;
P0=dat;
switch(channel)
{
case 4:
P2=(P2&0x1f)|0x80;
break;
case 5:
P2=(P2&0x1f)|0xa0;
break;
case 6:
P2=(P2&0x1f)|0xc0;
break;
case 7:
P2=(P2&0x1f)|0xe0;
break;
case 0:
P2=(P2&0x1f)|0x00;
break;
}
P2=(P2&0x1f)|0x00;
}
3. Nixie.c
和 Nixie.h
- 作用:这两个文件主要实现了数码管的显示功能。
DisplaySMG_ALL
函数用于同时点亮所有数码管,DisplaySMG_Bit
函数用于点亮指定位置的数码管,DisplaySMG_Info
函数根据不同的工作模式显示不同的信息,如温度、温度阈值、电压等。 - 与其他模块的配合:
- 在
main.c
文件的主循环中,调用DisplaySMG_Info
函数显示信息。 - 在
Keys.c
文件的按键扫描函数中,当按键按下时,调用DisplaySMG_Info
函数更新显示。 - 在
DS18B20.c
文件的DS18B20_Read
函数中,读取温度数据后调用DisplaySMG_Info
函数更新显示。
- 在
void DisplaySMG_Info()
{
switch(mode)
{
case 1:
DisplaySMG_Bit(7,SMG_NoDot[smg_temp % 10]);
DisplaySMG_Bit(6,SMG_NoDot[(smg_temp / 10) % 10]);
DisplaySMG_Bit(5,SMG_Dot[(smg_temp / 100) % 10]);
DisplaySMG_Bit(4,SMG_NoDot[smg_temp / 1000]);
DisplaySMG_Bit(0,0xc6);
break;
case 2:
DisplaySMG_Bit(7,SMG_NoDot[s_temp % 10]);
DisplaySMG_Bit(6,SMG_NoDot[s_temp / 10]);
DisplaySMG_Bit(0,0x8c);
break;
case 3:
DisplaySMG_Bit(7,SMG_NoDot[smg_volt % 10]);
DisplaySMG_Bit(6,SMG_NoDot[(smg_volt / 10)%10]);
DisplaySMG_Bit(5,SMG_Dot[smg_volt / 100]);
DisplaySMG_Bit(0,0x88);
break;
}
}
4. Keys.c
和 Keys.h
- 作用:这两个文件主要实现了按键扫描功能。
Scan_Keys
函数通过逐行扫描的方式检测按键是否按下,并根据不同的按键和工作模式执行相应的操作,如切换工作模式、调整温度阈值等。 - 与其他模块的配合:
- 在
main.c
文件的主循环中,调用Scan_Keys
函数扫描按键。 - 在按键处理过程中,调用
DisplaySMG_Info
函数更新显示。
- 在
void Scan_Keys()
{
C1=1; C2=1;
R1=1; R2=0;
if(C1==0)//S4
{
Delay_ms(5);
if(C1==0)
{
while(C1==0)
{
DisplaySMG_Info();
}
if(mode ==1)
{
mode =2;
stat_led |= 0x02;
Select_HC573(4,stat_led);
stat_led &= ~0x04;
Select_HC573(4,stat_led);
}
else if (mode ==2)
{
mode =3;
stat_led |= 0x04;
Select_HC573(4,stat_led);
stat_led &= ~0x08;
Select_HC573(4,stat_led);
}
else
{
mode =1;
stat_led |= 0x08;
Select_HC573(4,stat_led);
stat_led &= ~0x02;
Select_HC573(4,stat_led);
}
}
}
// 其他按键处理代码...
}
5. DS18B20.c
和 DS18B20.h
- 作用:这两个文件主要实现了对 DS18B20 温度传感器的读取功能。
DS18B20_Read
函数通过调用onewire.c
文件中的函数,向 DS18B20 发送命令,读取温度数据,并将温度数据转换为浮点数和整数形式,最后调用DisplaySMG_Info
函数更新显示。 - 与其他模块的配合:
- 在
main.c
文件的主循环中,调用DS18B20_Read
函数读取温度数据。 - 在
PCF8591.c
文件的Running_Mode
函数中,调用DS18B20_Read
函数读取温度数据,用于判断工作模式。
- 在
void DS18B20_Read()
{
unsigned char LSB,MSB;
temp=0;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
temp=MSB;
temp = (temp <<8 ) | LSB ;
if((temp & 0xf800) == 0x0000)
{
f_temp = temp * 0.0625;
}
smg_temp = f_temp * 100;
DisplaySMG_Info();
}
6. onewire.c
和 onewire.h
- 作用:这两个文件主要实现了单总线通信协议,用于与 DS18B20 温度传感器进行通信。
Delay_OneWire
函数用于产生单总线通信所需的延时,Write_DS18B20
函数用于向 DS18B20 写入数据,Read_DS18B20
函数用于从 DS18B20 读取数据,Init_DS18B20
函数用于初始化 DS18B20。 - 与其他模块的配合:
- 在
DS18B20.c
文件的DS18B20_Read
函数中,调用onewire.c
文件中的函数与 DS18B20 进行通信。
- 在
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
7. iic.c
和 iic.h
- 作用:这两个文件主要实现了 I2C 总线通信协议,用于与 PCF8591 芯片进行通信。
IIC_SendByte
函数用于向 I2C 总线发送一个字节的数据,IIC_RecByte
函数用于从 I2C 总线接收一个字节的数据,IIC_Start
、IIC_Stop
、IIC_SendAck
、IIC_WaitAck
等函数用于控制 I2C 总线的起始、停止、应答等操作。 - 与其他模块的配合:
- 在
PCF8591.c
文件的PCF8591_DAC
函数中,调用iic.c
文件中的函数与 PCF8591 进行通信,实现 DAC 输出控制。
- 在
//I2C发送一个字节数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDa = 1;
else SDa = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//I2C接收一个字节数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDa) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
8. PCF8591.c
和 PCF8591.h
- 作用:这两个文件主要实现了对 PCF8591 芯片的控制,包括 DAC 输出功能。
PCF8591_DAC
函数通过调用iic.c
文件中的函数,向 PCF8591 发送命令和数据,实现 DAC 输出。Running_Mode
函数根据不同的工作模式和温度数据,控制 PCF8591 的 DAC 输出。 - 与其他模块的配合:
- 在
main.c
文件的主循环中,调用Running_Mode
函数执行工作模式逻辑。 - 在
Running_Mode
函数中,调用DS18B20_Read
函数读取温度数据,调用PCF8591_DAC
函数控制 DAC 输出。
- 在
void PCF8591_DAC(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
void Running_Mode()
{
DS18B20_Read();
switch(s5_mode)
{
case 1:
if(smg_temp < (s_temp*100))
{
PCF8591_DAC(0);
smg_volt = 0;
}
else
{
PCF8591_DAC(255);
smg_volt = 500;
}
break;
case 2 :
if(smg_temp<2000)
{
PCF8591_DAC(51);
smg_volt = 100;
}
else if(smg_temp<4000)
{
adc_volt = 0.15*(smg_temp-2000)+100;
smg_volt = adc_volt;
PCF8591_DAC((adc_volt*0.51));
}
else
{
PCF8591_DAC(204);
smg_volt = 400;
}
break ;
}
}
模块间配合总结
main.c
作为程序的入口,负责系统的初始化和主循环的运行,调用其他模块的函数实现系统的各项功能。HC573.c
提供了对 74HC573 锁存器的控制功能,被Nixie.c
和main.c
中的初始化函数调用。Nixie.c
实现了数码管的显示功能,被main.c
、Keys.c
和DS18B20.c
中的函数调用,用于更新显示信息。Keys.c
实现了按键扫描功能,被main.c
调用,根据按键操作更新系统状态并调用Nixie.c
中的函数更新显示。DS18B20.c
实现了对 DS18B20 温度传感器的读取功能,被main.c
和PCF8591.c
调用,读取温度数据并调用Nixie.c
中的函数更新显示。onewire.c
实现了单总线通信协议,为DS18B20.c
提供与 DS18B20 通信的底层支持。iic.c
实现了 I2C 总线通信协议,为PCF8591.c
提供与 PCF8591 通信的底层支持。PCF8591.c
实现了对 PCF8591 芯片的控制功能,被main.c
调用,根据温度数据和工作模式控制 DAC 输出。
通过以上模块的配合,系统实现了温度采集、数码管显示、按键扫描、DAC 输出控制等功能。