1. 程式人生 > >藍橋杯單片機知識匯總(更新中)

藍橋杯單片機知識匯總(更新中)

藍橋杯 del 轉換 art oat 進制 ecb 序列 數碼

藍橋杯知識匯總

1.數碼管

  • 段碼顯示
    uchar code display[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xbf, 0xff};
  • 打開或關閉數碼管
    P2 = (P2 & 0x1f) | 0xc0;
    P0 = order[cnt];
    P2 &= 0x1f;
    
    P2 = (P2 & 0x1f) | 0xe0;
    P0 = display[disbuf[cnt]];
    P2 &= 0x1f;

2.LED顯示

P2 = (P2 & 0x1f) | 0x80;
P0 = 0xfe;
P2 &= 0x1f;

3.系統初始化

  • 關閉外設
    P2 = ((P2 & 0x1f) | 0xa0);      //關閉全部外設
    P0 = 0x00;
    P2 &= 0x1f;
    
    P2 = (P2 & 0x1f) | 0xe0;        //數碼管都不顯示
    P0 = 0xff;
    P2 &= 0x1f;
  • 定時器設置
    TMOD = 0x01;                   //計時器0,采用方式1
    TH0 = (65536 - 2000) / 256;    //定時2ms
    TL0 = (65536 - 2000) % 256;
    
    EA = 1;                        //打開總中斷
    ET0 = 1;                       //定時器中斷0打開
    TR0 = 1;                       //開始計數
  • 串口通信設置
    SCON = 0x50;    //工作方式1
    AUXR = 0x40;
    TMOD = 0x20;
    
    TH1 = 256 - (11059200 / 2400 / 32);    //波特率為2400
    TL1 = 256 - (11059200 / 2400 / 32);
    
    EA = 1;         //打開總中斷
    ES = 1;         //打開串口中斷
    TR1 = 1;        //打開計時器1

4.IIC

#define SlaveAddrW 0x90
#define SlaveAddrR 0x91
#define EEPROMW    0xa0
#define EEPROMR    0xa1

5.DS1302

  • 命令字
    #define AM(X)            X
    #define PM(X)           (X + 12)
    #define DS1302_SECOND    0x80
    #define DS1302_MINUTE    0x82
    #define DS1302_HOUR      0x84
    #define DS1302_DAY       0x86
    #define DS1302_MONTH     0x88
    #define DS1302_WEEK      0x8A
    #define DS1302_YEAR      0x8C
    #define DS1302_RAM(X)   (0xC0 + (X) * 2)
  • 函數操作
    //是否寫保護
    void DS1302_SetProtect(bit flag){
        if (flag)  
            Write_Ds1302(0x8e, 0x80);
        else       
            Write_Ds1302(0x8e, 0x00);
    } 
    
    //設置時間
    void DS1302_SetTime(unsigned char Address, unsigned char Value){
        DS1302_SetProtect(0);
        Write_Ds1302(Address, ((Value / 10) << 4) | (Value % 10));     //將十進制數轉換成BCD碼
    }
    
    //轉化時間格式
    void DS1302_GetTime(SYSTEMTIME *Time){
        unsigned char ReadValue;
    
        /* 將BCD碼轉換成十進制數 */
        ReadValue = Read_Ds1302(DS1302_MINUTE | 0x01);
        Time->minute = ((ReadValue & 0x70)>>4) * 10 + (ReadValue & 0x0f);
    
        ReadValue = Read_Ds1302(DS1302_HOUR | 0x01);
        Time->hour = ((ReadValue & 0x70)>>4) * 10 + (ReadValue & 0x0f);
    }
    
    //時間初始化
    void Time_Initial(){
        unsigned char Second;
    
        DS1302_SetTime(DS1302_HOUR, 8);
        DS1302_SetTime(DS1302_MINUTE, 30);
        DS1302_SetTime(DS1302_SECOND, 0);
    
        Second = Read_Ds1302(DS1302_SECOND | 0x01);
        if (Second & 0x80){
            DS1302_SetTime(DS1302_SECOND, 0);          //啟動時鐘
        }
    }
unsigned char Rb2_Read(){
    unsigned char dat;
    
    IIC_Start();
    IIC_SendByte(0x90);   //寫入地址
    IIC_WaitAck();
    
    IIC_SendByte(0x43);   //0x43是Rb2, 0x41是光敏
    IIC_WaitAck();
        
    IIC_Start();
    IIC_SendByte(0x91);   //讀命令
    IIC_WaitAck();
            
    dat = IIC_RecByte();  //讀取一個字節
    IIC_Ack(0);
    IIC_Stop();

    return dat;     
}

7.EEPROM(讀取和寫入數據都不可中斷)

unsigned char Read_EEPROM(unsigned char con){
    unsigned char dat;
    
    IIC_Start();
    IIC_SendByte(0xa0);   //寫入地址
    IIC_WaitAck();
    
    IIC_SendByte(con);        //從起始位置開始讀取
    IIC_WaitAck();
        
    IIC_Start();
    IIC_SendByte(0xa1);   //讀命令
    IIC_WaitAck();
            
    dat = IIC_RecByte();     //讀取一個字節
    IIC_Ack(0);
    IIC_Stop();

    return dat;
}


void Write_EEPROM(unsigned char date, unsigned char con){
    IIC_Start();
    IIC_SendByte(0xa0);
    IIC_WaitAck();

    IIC_SendByte(con);  
    IIC_WaitAck();
    
    IIC_SendByte(date);
    IIC_WaitAck();   
      
    IIC_Stop();  
    Delay(3);                      //寫入後要註意延時一段時間
}

8.DS18B20(讀取溫度不可中斷)

  • 延時函數
    //單總線延時函數
    void Delay_OneWire(uint t) 
    {
        char  z;  
        while(t--)  
            for(z = 0; z < 12; z++); 
    }
  • 讀取溫度
    /* 讀取數據不可中斷,可以采用關閉終端來實現 */
    unsigned int Read_Temperature(){
        unsigned char low,high;  
        unsigned int temp;  
        float t;
    
        init_ds18b20();          //器件初始化
        Write_DS18B20(0xcc);     //跳過讀序列 
        Write_DS18B20(0x44);     //啟動溫度轉換
        Delay_OneWire(200);      //延遲一會兒
    
        init_ds18b20();  
        Write_DS18B20(0xcc);     //同上
        Write_DS18B20(0xbe);     //讀取溫度
    
        low = Read_DS18B20();    //讀取低位
        high = Read_DS18B20();   //讀取高位
    
        temp = (high << 8) | low;
        t = temp * 0.0625;  
        temp = t + 0.5; 
    
        return temp;  
    }

藍橋杯單片機知識匯總(更新中)