📄 test.c
字号:
#include <reg51.h>
sbit LED1 = P1^2;
sbit LED2 = P1^4;
sbit IR_IN = P3^2;
void init_serialcomm(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xFF; //Baud:4800 fosc=11.0592MHz :f4
//IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
TI=1;
}
unsigned char ir_timer=0,jiffies=0;
void clock_timer(void) interrupt 1 using 1{
ir_timer++;
jiffies++;
}
void clock_init(void){
jiffies = 0;
TMOD=0x02;
// TH0=TL0=0x9b;//12M
// TH0=TL0=0x7a;//16M
// TH0=TL0=0x75;//16.59M
// TH0=TL0=0x72;//17M
// TH0=TL0=0x37;//24M
TH0=TL0=0xa0;//22M
EA=1;
ET0=1;
TR0=1;
}
unsigned char ir_step=0;
unsigned int ir_addr;
unsigned char ir_data;
void ir_test(void){
bit ir_status,ir_last_status;
unsigned char __ir_timer;
ir_status=IR_IN;
if (ir_last_status==ir_status){//超时处理
if (ir_step>0 && ir_timer>0xb0){
ir_timer=0;
ir_step=0;
}
return;
}
__ir_timer=ir_timer;
ir_timer=0;
ir_step++;
ir_last_status=ir_status;
if(ir_step < 50 && __ir_timer > 0x18){//误码处理,提前出现数据码以外的非正常宽度编码,正常数据码宽度应小于0x10
ir_step = 0;
return;
}
//0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 94
//0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 94
if(ir_step <= 32){
if((ir_step & 3)==2 || (ir_step & 3)==3){
ir_addr >>= 1;
if(__ir_timer < 0xa)
ir_addr &= 0x7fff;
else
ir_addr |= 0x8000;
}
if(ir_step==16){
TI=0;
SBUF=(ir_addr>>8);
}
if(ir_step==32){
TI=0;
SBUF=(ir_addr>>8);
}
}else
if(ir_step>32 && ir_step<=48){
if((ir_step & 1)==0){
ir_data >>= 1;
if(__ir_timer < 0xa)
ir_data &= 0x7f;
else
ir_data |= 0x80;
}
if(ir_step==48){
TI=0;
SBUF=(ir_data);
}
}else
if(ir_step>48 && ir_step<=50){
if(ir_step==50){
ir_timer=0;
ir_step=0;
TI=0;
if (__ir_timer > 0x90 && __ir_timer < 0xa0)
SBUF=0xaa;
else
SBUF=0x55;
}
}
}
enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
unsigned char ControlByte,enum eepromtype EepromType);
unsigned char buf[8]={1,2,3,4,5,6,7,9};
void eeprom_read_test(unsigned char page){
unsigned char i,j,c;
for(i=0; i<32; i++){
for(j=0; j<8; j++){
buf[j]=1;
}
c = 0xa1 | page<<1;
if(RW24XX(buf, 8, (unsigned int)((i*8)), c, M2408)){
TI=0;
SBUF=0x55;
}
for(j=0; j<8; j++){
while(!TI);
TI=0;
SBUF=buf[j];
}
}
}
void eeprom_write_test(unsigned char page){
unsigned char i,j,c;
for(i=0; i<32; i++){
for(j=0; j<8; j++){
buf[j]=j<<1;
}
c = 0xa0 | page<<1;
RW24XX(buf, 8, (unsigned int)(i*8), c, M2408);
}
}
void wait(unsigned int t){
while(t--)
t=t;
}
void clock_test(){
unsigned char i,d;
unsigned char pdata *source=0;
// for(i=0; i<128; i++){
// source=i;
// *source = i>>1;
// }
for(i=0; i<128; i++){
source=i;
d=*source;
while(!TI);
TI=0;
SBUF=d;
}
}
void setup12887(unsigned char *p);
void read12887(unsigned *p);
void start12887(void);
void main(){
clock_init();
init_serialcomm();
wait(60000);
wait(60000);
wait(60000);
while(0){
ir_test();
}
{
unsigned char p_w;
bit ir_status,ir_last_status;
LED1=0;
LED2=1;
ir_status=ir_last_status=1;
while(1){
while(1){
ir_status=IR_IN;
if (ir_last_status!=ir_status){
ir_last_status=ir_status;
break;
}
}
p_w=jiffies;
jiffies=0;
while(!TI);
TI=0;
SBUF=p_w;
LED1=!LED1;
LED2=!LED2;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -