蓝桥杯各个模块总结(参考)

明天就要比赛了,今天总结一份救命模板加深记忆;

1--24c02的操作

//==================24C02单字节写入===================
void Write_24C02(unsigned char addr, unsigned char dat)
{
    IIC_Start();            //起始信号
    IIC_SendByte(0xa0);        //EEPROM的写设备地址
    IIC_WaitAck();            //等待从机应答
    IIC_SendByte(addr);        //内存单元地址
    IIC_WaitAck();            //等待从机应答
    IIC_SendByte(dat);        //内存写入数据
    IIC_WaitAck();            //等待从机应答
    IIC_Stop();                //停止信号
}
//==================24C02单字节读取===================
unsigned char Read_24C02(unsigned char addr)
{
    unsigned char tmp;
    //首先,进行一个伪写操作
    IIC_Start();            //起始信号
    IIC_SendByte(0xa0);        //EEPROM的写设备地址
    IIC_WaitAck();            //等待从机应答
    IIC_SendByte(addr);        //内存单元地址
    IIC_WaitAck();            //等待从机应答
    //然后,开始字节读操作
    IIC_Start();            //起始信号
    IIC_SendByte(0xa1);        //EEPROM的读设备地址
    IIC_WaitAck();            //等待从机应答
    tmp = IIC_RecByte();    //读取内存中的数据
    IIC_SendAck(1);            //产生非应答信号
    IIC_Stop();                //停止信号
    return tmp;
}

2.PCF8591读取通道1光敏电阻rb1,通道3可变电阻rb2的电压 --DAC

unsigned char adc1_value = 0;        //AIN1的采样数据
float adc1_volt = 0;                //AIN1的换算电压
unsigned int smg1_volt = 0;            //AIN1的显示电压
unsigned char adc3_value = 0;        //AIN3的采样数据
float adc3_volt = 0;                //AIN3的换算电压
unsigned int smg3_volt = 0;            //AIN3的显示电压

unsigned char Read_PCF8591_ADC(unsigned char ain)
{
    unsigned char tmp;
    IIC_Start();                    
    IIC_SendByte(0x90);        //PCF8591的写设备地址 
    IIC_WaitAck();                
    if(ain == 1)
    {
        IIC_SendByte(0x01); //通道1,光敏电阻电压
    }
    else if(ain == 3)
    {
        IIC_SendByte(0x03); //通道3,可调电阻电压
    }        
    IIC_WaitAck();                          
    IIC_Stop(); 
    
    DisplaySMG_ADC();            //等待电压转换完成
    
    IIC_Start();                                    
    IIC_SendByte(0x91);     //PCF8591的读设备地址
    IIC_WaitAck();                                 
    tmp = IIC_RecByte();     //读出AD采样数据
    IIC_SendAck(1);                 //产生非应答信号                                 
    IIC_Stop();
    return tmp;
}
//=============采样光敏电阻和可调电阻的电压=============
void Read_AIN1_AIN3()
{
    adc1_value = Read_PCF8591_ADC(1);
    adc1_volt = adc1_value * (5.0 / 255);
    smg1_volt = adc1_volt * 100;
    
    adc3_value = Read_PCF8591_ADC(3);
    adc3_volt = adc3_value * (5.0 / 255);
    smg3_volt = adc3_volt * 100;
}

3.采样PCF8591的阻值 --

ADC


void Read_RD1()
{
    IIC_Start();                                    
    IIC_SendByte(0x90);                 
    IIC_WaitAck();                              
    IIC_SendByte(0x01);                 
    IIC_WaitAck();                              
    IIC_Stop();                                 
    
    DisplaySMG_ADC(1,dat_rd1);
    
    IIC_Start();                                    
    IIC_SendByte(0x91);                     
    IIC_WaitAck();                                 
    dat_rd1 = IIC_RecByte();             
    IIC_Ack(0);                                 
    IIC_Stop();                                     
    DisplaySMG_ADC(1,dat_rd1);
}
 
void Read_RB2()
{
    IIC_Start();                                
    IIC_SendByte(0x90);                     
    IIC_WaitAck();                              
    IIC_SendByte(0x03);                 
    IIC_WaitAck();                          
    IIC_Stop();                                     
    
    DisplaySMG_ADC(3,dat_rb2);
    
    IIC_Start();                                
    IIC_SendByte(0x91);                 
    IIC_WaitAck();                             
    dat_rb2 = IIC_RecByte();             
    IIC_Ack(0);                                     
    IIC_Stop();                                     
    DisplaySMG_ADC(3,dat_rb2);
}

4--DS18B20

void Read_DS18B20_temp()
{
    unsigned char LSB,MSB;
    
   init_ds18b20(); //初始化操作
    Write_DS18B20(0xcc);  //跳过ROM操作
    Write_DS18B20(0x44);  //转换温度
    Delay(1000);
    
    init_ds18b20(); //初始化操作
    Write_DS18B20(0xcc);  //跳过ROM操作
    Write_DS18B20(0xbe);  //开始读取暂存器中的温度
    
    LSB = Read_DS18B20();
    MSB = Read_DS18B20();
    
    temp = MSB;
    temp = (temp <<= 8) | LSB;
    
    temp >>= 4; //右移四位相当于去掉了小数部分
    /*
    if((temp & 0xf800) == 0x0000)     //判断温度正负,高五位为符号位
    {
        temp >>= 4;  //相当于*0.0625
        temp = temp *10;
        temp = temp +(LSB & 0x0f) * 0.625;
    }
    
    */
}
 

5--NE555测频率


unsigned int count_f = 0;
unsigned int dat_f = 0;
unsigned char count_t = 0;
 
void Init_Timer() 
{
    //定时器0用作计数,8位重装方式
    TH0 = 0xff;
    TL0 = 0xff;
    
    //定时器1用作定时,定时时间50ms
    
    TH1 = (65535 - 50000 + 1) / 256;
    TL1 = (65535 - 50000 + 1) % 256;
    
    TMOD = 0x16;  // 0001 0110
    
    ET0 = 1;
    ET1 = 1;
    EA = 1;
    
    TR0 = 1;
    TR1 = 1;    
}
 
void Service_T0() interrupt 1
{
    count_f++;
    
}
 
void Service_T1() interrupt 3
{
    TH1 = (65535 - 50000 + 1) / 256;
    TL1 = (65535 - 50000 + 1) % 256;
    
    count_t++;
     if(count_t == 20)
     {
         dat_f = count_f;
         count_f = 0;
         count_t = 0;
         
     }  //测量频率完成
}
 
void DisPlaySMG_F()
{
    DisPlaySMG_Bit(0,0x8e);  // 1000 1110 f的段码
    DelaySMG(100);
    
    DisPlaySMG_Bit(1,0xff);  
    DelaySMG(100);
    
    DisPlaySMG_Bit(2,0xff); 
    DelaySMG(100);
    
    if(dat_f > 9999)  //显示五位数的最高位
    {
        DisPlaySMG_Bit(3,SMGNoDot_CA[dat_f / 10000]); 
      DelaySMG(100);
    }
    if(dat_f > 999)
    {
        DisPlaySMG_Bit(4,SMGNoDot_CA[(dat_f / 1000) % 10]); 
      DelaySMG(100);
    }
    if(dat_f > 99)
    {
        DisPlaySMG_Bit(5,SMGNoDot_CA[(dat_f / 100) % 10]); 
      DelaySMG(100);
    }
    if(dat_f > 9)
    {
        DisPlaySMG_Bit(6,SMGNoDot_CA[(dat_f / 10) % 10]); 
      DelaySMG(100);
    }
    
        DisPlaySMG_Bit(7,SMGNoDot_CA[(dat_f / 1) % 10]); 
      DelaySMG(100);
    
    DisPlay_All(0xff);
 
}

6.PWM波控制


unsigned char count=0;
unsigned char pwm_duty=0; //占空比设置为可变
void InitTimer0()
{
    TMOD = 0x01;
    TH0 = (65535 - 100) / 256;
    TL0 = (65535 - 100) % 256;
    
    ET0 = 1;
    EA = 1;
    
}
 
void ServiceTimer() interrupt 1
{
    TH0 = (65535 - 100) / 256;       //10 ms = 10000us  定时中断100us,则100次中断达到一个周期
    TL0 = (65535 - 100) % 256;       //    将一个脉冲划分为100份,若占空比10%,则计数10次高电平后计数90次低电平后置零完成
    
    count++;
    if(count == pwm_duty)
    {
        L1 = 1 ;
    }
    
    
    else if(count == 100)
    {
        L1 = 0;
        count = 0;
    }
    
    
}

unsigned char stat=0;
void ScanKey()
{
    if(S7 == 0)
    {
        Delay(500);
        if(S7 == 0)
        {
             //多状态时使用状态机的跳转
            switch(stat)
            {
                case 0 : L1 = 0; 
                                TR0 = 1;
                                pwm_duty = 10;
                                stat = 1;
                break;
                
                case 1 : 
                                pwm_duty = 50;
                                stat = 2;
                break;
                
                case 2 : 
                                pwm_duty = 90;
                                stat = 3;
                break;    
                
                    case 3 : 
                                L1 = 1;
                         TR0 = 0;
                                stat=0;
                break;
            }
            while (S7 == 0); //防止出现误判误操作
        }
    
    }
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值