蓝桥杯单片机设计与开发第十二届省赛(满分代码)

各模块详细分析

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_ALLDisplaySMG_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_StartIIC_StopIIC_SendAckIIC_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.cmain.c中的初始化函数调用。
  • Nixie.c实现了数码管的显示功能,被main.cKeys.cDS18B20.c中的函数调用,用于更新显示信息。
  • Keys.c实现了按键扫描功能,被main.c调用,根据按键操作更新系统状态并调用Nixie.c中的函数更新显示。
  • DS18B20.c实现了对 DS18B20 温度传感器的读取功能,被main.cPCF8591.c调用,读取温度数据并调用Nixie.c中的函数更新显示。
  • onewire.c实现了单总线通信协议,为DS18B20.c提供与 DS18B20 通信的底层支持。
  • iic.c实现了 I2C 总线通信协议,为PCF8591.c提供与 PCF8591 通信的底层支持。
  • PCF8591.c实现了对 PCF8591 芯片的控制功能,被main.c调用,根据温度数据和工作模式控制 DAC 输出。

通过以上模块的配合,系统实现了温度采集、数码管显示、按键扫描、DAC 输出控制等功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值