藍橋杯單片機知識匯總(更新中)
阿新 • • 發佈:2018-02-25
藍橋杯 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); //啟動時鐘 } }
6.A/D
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; }
藍橋杯單片機知識匯總(更新中)