本例程基于AI8051U為主控芯片的實驗箱進行編寫測試。
使用Keil C51編譯器,為了達到比較高的效率,一般建議選擇"Small"模式。
當編譯器出現 "error C249: 'DATA': SEGMENT TOO LARGE" 錯誤時,則需要手動將部分比較大的數組通過"xdata" 強制分配到 XDATA 區域(例如:char xdata buffer [256];)。
通過硬件I2C接口讀取AT24C02前8個字節數據,通過串口打印讀取結果.
將讀取的數據加1后寫回AT24C02前8個字節.
重新讀取AT24C02前8個字節數據,通過串口打印讀取結果.
MCU上電后執行1次以上動作,可重復斷電/上電測試AT24C02前8個字節的數據內容.
串口配置UART1(P3.0,P3.1): 115200,N,8,1.
MCU上電后執行1次以上動作,可重復斷電/上電測試AT24C02前8個字節的數據內容.
下載時, 選擇時鐘 24MHZ (用戶可自行修改頻率).
發送部分:void start2(void)
{
uint8_t i=0;
for(i=0;i<239;i++)
{
Delay13us();
P03=~P03;
}
P03=0;
Delay1600us();
}
void send_38k(void)
{
uint8_t i=0;
for(i=0;i<34;i++)
{
Delay13us();
P03=~P03;
}
P03=0;
}
void send_IR_Ctl(uint8_t *buf)
{
uint8_t i=0,j=0,tp;
start2();
for(i=0;i<14;i++)
{
tp=buf[ i];
for(j=0;j<8;j++)
{
send_38k();
if(tp&0x01)
{
Delay450us();
}else
{
Delay1150us();
}
tp>>=1;
}
}
send_38k();
}
接收部分:
void Get_Infrared_Code(uint8_t *buf)
{
uint8_t data_bits=0,timer_10us=0;
while(1)
{
if(P22==1)
{
if(timer_10us<255)
timer_10us++;
}else
{
buf[data_bits/8]&=~(0x01<<(data_bits%8));
if(timer_10us<70)
buf[data_bits/8]|=(0x01<<(data_bits%8));
if(timer_10us>140)
data_bits=0;
else
data_bits++;
timer_10us=0;
while(P22==0);
}
if(data_bits==112)
break;
Delay10us();
}
}
硬件連接:
P22->紅外接收輸出腳
P03->紅外接收發送腳
P24->OLED SCL
P23->OLED SDA
keil c51 編譯器
IRC 時鐘 33.176MHz
原理圖: 無
仿真: 無
代碼:
紅外遙控器.7z
(63.44 KB, 下載次數: 0)
2024-12-10 22:53 上傳
點擊文件名下載附件
Keil代碼 下載積分: 黑幣 -5
|