📄 test.lst
字号:
C51 COMPILER V7.20 TEST 11/01/2004 17:44:53 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE test.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2
3
4 sbit FS1 = P3^7;
5 sbit FS2 = P1^0;
6 sbit BEEP = P1^1;
7
8 sbit LED1 = P1^2;
9 sbit LED2 = P1^4;
10 sbit IR_IN = P3^2;
11
12 unsigned char ir_timer=0;
13 unsigned int jiffies=0;
14 void clock_timer(void) interrupt 1 using 1{
15 1 ir_timer++;
16 1 jiffies++;
17 1 }
18
19 void clock_init(void){
20 1 jiffies = 0;
21 1 TMOD=0x02;
22 1 // TH0=TL0=0x9b;//12M
23 1 // TH0=TL0=0x7a;//16M
24 1 // TH0=TL0=0x75;//16.59M
25 1 // TH0=TL0=0x72;//17M
26 1 // TH0=TL0=0x37;//24M
27 1 TH0=TL0=0xa0;//22M
28 1 EA=1;
29 1 ET0=1;
30 1
31 1 TR0=1;
32 1 }
33 void init_serialcomm(void)
34 {
35 1 SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
36 1 TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
37 1 PCON |= 0x80; //SMOD=1;
38 1 TH1 = 0xFF; //Baud:4800 fosc=11.0592MHz :f4
39 1 //IE |= 0x90; //Enable Serial Interrupt
40 1 TR1 = 1; // timer 1 run
41 1 RI=0;
42 1 TI=1;
43 1 }
44
45 void serial_out(unsigned char d){
46 1 while(!TI);
47 1 TI=0;
48 1 SBUF=(d);
49 1 }
50
51 //等待指定长度的串行数据到达,超时值为每两个字节之间的间隔时间而非等待整个串的时间.
52 //超时单位为time_out * 100uS,为0时为永久等待
53 bit wait_serial(unsigned char *p, unsigned char len, unsigned char time_out){
54 1 unsigned int time=jiffies;
55 1 unsigned char n=0;
C51 COMPILER V7.20 TEST 11/01/2004 17:44:53 PAGE 2
56 1 while(time_out == 0 || jiffies-time < time_out){
57 2 if (RI){
58 3 p[n++]=SBUF;
59 3 RI=0;
60 3 if(n==len)
61 3 return 0;
62 3 time=jiffies;
63 3 }
64 2 }
65 1 return 1;
66 1 }
67
68 unsigned char ir_step=0;
69 unsigned int ir_addr;
70 unsigned char ir_data;
71 unsigned char ir_buf[3];
72 bit ir_status,ir_last_status;
73 void ir_test(void){
74 1 unsigned char __ir_timer;
75 1
76 1 if (ir_step == 50)//数据未取走,停止红外接收.
77 1 return;
78 1
79 1 ir_status=IR_IN;
80 1
81 1 if (ir_last_status==ir_status){//超时处理
82 2 if (ir_step>0 && ir_timer>0x4a){
83 3 ir_timer=0;
84 3 ir_step=0;
85 3 }
86 2 return;
87 2 }
88 1
89 1 __ir_timer=ir_timer;
90 1 ir_timer=0;
91 1 ir_step++;
92 1 ir_last_status=ir_status;
93 1
94 1 if(ir_step < 50 && __ir_timer > 0x7){//误码处理,提前出现数据码以外的非正常宽度编码,正常数据码宽度应小于0x
-5
95 2 ir_step = 0;
96 2 return;
97 2 }
98 1
99 1 //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
100 1 //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
101 1 //数据转换规则:前32位每4位取中间两位,合成16字节地址,之后16位每两位取第1位,得到8位键值
102 1 //地址:ED FF
103 1 //键值:FC F3 CF 3F 分别对应按键A,B,C,D
104 1
105 1 if(ir_step <= 32){
106 2 if((ir_step & 3)==2 || (ir_step & 3)==3){
107 3 ir_addr >>= 1;
108 3 if(__ir_timer < 4)//1 --- 3
109 3 ir_addr &= 0x7fff;
110 3 if(__ir_timer > 4) //5 -- 7
111 3 ir_addr |= 0x8000;
112 3 else
113 3 ir_step = 0;
114 3 }
115 2 }else
116 1 if(ir_step>32 && ir_step<=48){
C51 COMPILER V7.20 TEST 11/01/2004 17:44:53 PAGE 3
117 2 if((ir_step & 1)==0){
118 3 ir_data >>= 1;
119 3 if(__ir_timer < 4)//1 --- 3
120 3 ir_data &= 0x7f;
121 3 else
122 3 if(__ir_timer > 4) //5 -- 7
123 3 ir_data |= 0x80;
124 3 else
125 3 ir_step = 0;
126 3 }
127 2 }else
128 1 if(ir_step>48 && ir_step<=50){
129 2 if(ir_step==50){
130 3 if (__ir_timer < 0x36 || __ir_timer > 0x4a)//接收码收0x1d结束,未收到该码则为出错
131 3 ir_step=0;
132 3 else{
133 4 ir_buf[0]=ir_addr>>8;
134 4 ir_buf[1]=ir_addr;
135 4 ir_buf[2]=ir_data;
136 4 }
137 3 }
138 2 }
139 1 }
140
141
142 #if 0
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;
C51 COMPILER V7.20 TEST 11/01/2004 17:44:53 PAGE 4
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));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -