📄 test.c.bak
字号:
#include <reg51.h>
sbit FS1 = P1^0;
sbit FS2 = P1^1;
sbit BEEP = P1^4;
sbit IR_IN = P3^2;
unsigned char ir_timer=0;
unsigned int 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=0x40;//22M
EA=1;
ET0=1;
TR0=1;
}
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
RI=0;
TI=1;
}
void serial_out(unsigned char d){
while(!TI);
TI=0;
SBUF=(d);
}
//等待指定长度的串行数据到达,超时值为每两个字节之间的间隔时间而非等待整个串的时间.
//超时单位为time_out * 100uS,为0时为永久等待
bit wait_serial(unsigned char *p, unsigned char len, unsigned char time_out){
unsigned int time=jiffies;
unsigned char n=0;
while(time_out == 0 || jiffies-time < time_out){
if (RI){
p[n++]=SBUF;
RI=0;
if(n==len)
return 0;
time=jiffies;
}
}
return 1;
}
unsigned char ir_step=0;
unsigned int ir_addr;
unsigned char ir_data;
unsigned char ir_buf[3];
void ir_test(void){
bit ir_status,ir_last_status;
unsigned char __ir_timer;
if (ir_step == 50)//数据未取走,停止红外接收.
return;
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
//数据转换规则:前32位每4位取中间两位,合成16字节地址,之后16位每两位取第1位,得到8位键值
//地址:ED FF
//键值:FC F3 CF 3F 分别对应按键A,B,C,D
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;
}
}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;
}
}else
if(ir_step>48 && ir_step<=50){
if(ir_step==50){
if (__ir_timer < 0x90 || __ir_timer > 0xa0)//接收码收0x94结束,未收到该码则为出错
ir_step=0;
else{
ir_buf[0]=ir_addr>>8;
ir_buf[1]=ir_addr;
ir_buf[2]=ir_data;
}
}
}
}
void ee_write(unsigned char ee_addrh,unsigned char ee_addrl,unsigned char ee_num,unsigned char *sp);
void ee_read(unsigned char ee_addrh,unsigned char ee_addrl,unsigned char ee_num,unsigned char *sp);
void setup12887(unsigned char *p);//*p指向7字节数组,从0到6分别是秒 分 时 星期 日 月 年
void read12887(unsigned char *p);//*p指向7字节数组,从0到6分别是秒 分 时 星期 日 月 年
void start12887(void);
unsigned char date[7];
void sleep(unsigned int t){
unsigned int time=jiffies;
while(jiffies-time<t);
}
typedef struct log_s{
unsigned char index;
unsigned char year;
unsigned char month;
unsigned char day;
unsigned char hou;
unsigned char min;
unsigned char sec;
unsigned char rsv1;
} log_t;
#include <string.h>
unsigned char log_pos=0;
unsigned char log_index=0;
#define MAX_LOGS 60
void find_log_pos(){
log_t log;
log_index=0;
log_pos=0;
memset((void *)&log, 0xff, sizeof(log_t));
ee_read(log_pos>>5, log_pos<<3, sizeof(log_t), (unsigned char*)&log);
if(log.year==0xff)
return;
log_index=log.index;
for(log_pos=1; log_pos<MAX_LOGS; log_pos++){
memset((void *)&log, 0xff, sizeof(log_t));
ee_read(log_pos>>5, log_pos<<3, sizeof(log_t), (unsigned char*)&log);
log_index++;
if(log.year==0xff)
return;
if(log.index == log_index)
continue;
return;
}
if (log_pos==MAX_LOGS)
log_index++;
}
void write_log(){
log_t log;
memset((void *)&log, 0xff, sizeof(log_t));
if(log_pos>=MAX_LOGS)
log_pos=0;
read12887(date);
log.index=log_index;
log.year=date[6];
log.month=date[5];
log.day=date[4];
log.hou=date[2];
log.min=date[1];
log.sec=date[0];
ee_write(log_pos>>5, (log_pos<<3)&0xff, sizeof(log_t), (unsigned char*)&log);
log_pos++;
log_index++;
}
void clear_log(){
log_t log;
memset((void *)&log, 0xff, sizeof(log_t));
for(log_pos=0; log_pos<MAX_LOGS; log_pos++){
ee_write(log_pos>>5, log_pos<<3, sizeof(log_t), (unsigned char*)&log);
sleep(100);
}
}
typedef struct arg_s{
unsigned int ir_addr;
unsigned char ir_data;
unsigned int delay1;
unsigned int delay2;
unsigned int delay3;
}arg_t;
arg_t arg;
#define arg_addr 0x300
void get_arg(){
ee_read(arg_addr>>8, arg_addr&0xff, sizeof(arg_t), (unsigned char*)&arg);
}
void save_arg(){
arg.ir_addr=(ir_buf[0]<<8)|ir_buf[1];
arg.ir_data=ir_buf[2];
arg.delay1=10000;
arg.delay2=10000;
arg.delay3=10000;
ee_write(arg_addr>>8, arg_addr&0xff, sizeof(arg_t), (unsigned char*)&arg);
}
sys_init(){
clock_init();
init_serialcomm();
start12887();
find_log_pos();
get_arg();
}
void main(){
sys_init();
while(1){
ir_test();
if(ir_step == 50){
write_log();
if(ir_addr == arg.ir_addr){
if(ir_data == 0xFC){
FS1 = 0;
BEEP = 0;
sleep(arg.delay1);
BEEP = 1;
sleep(arg.delay2);
FS2 = 0;
BEEP = 0;
sleep(arg.delay3);
BEEP = 1;
}
if(ir_data == 0xF3){
FS1 = 1;
FS2 = 1;
}
}
ir_step=0;
}
if (RI){
unsigned char ch = SBUF;
RI=0;
if(ch=='w'){
unsigned char sbuf[3];//r addr_h addr_l len
if(wait_serial(sbuf, 3, 0)==0){
unsigned char dbuf[32];
if(wait_serial(dbuf, sbuf[2], 200)==0){
ee_write(sbuf[0], sbuf[1], sbuf[2], dbuf);
}else
serial_out(0x56);
}else
serial_out(0x57);
}
else
if(ch=='r'){
unsigned char i;
unsigned char sbuf[3];//r addr_h addr_l len
unsigned char dbuf[32];
if(wait_serial(sbuf, 3, 200)==0){
ee_read(sbuf[0], sbuf[1], sbuf[2], dbuf);
for(i=0; i<sbuf[2]; i++)
serial_out(dbuf[i]);
}else{
#if 0 //测试用0.
serial_out(0x55);
#else
unsigned char seg;
for(seg=0; seg<32; seg++){
ee_read(seg>>3, seg<<5, 32, dbuf);
for(i=0; i<32; i++)
serial_out(dbuf[i]);
}
#endif
}
}
else
if(ch=='d'){
unsigned char i;
if(wait_serial(date, 7, 200)==0){
setup12887(date);
}else{
read12887(date);
for(i=0; i<7; i++)
serial_out(date[i]);
}
}
else
if(ch=='i'){
serial_out(ir_buf[0]);
serial_out(ir_buf[1]);
serial_out(ir_buf[2]);
}
else
if(ch=='c'){
clear_log();
}
else
if(ch=='s'){
save_arg();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -