📄 s51yk.lst
字号:
C51 COMPILER V8.02 S51YK 11/30/2007 10:24:39 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE S51YK
OBJECT MODULE PLACED IN s51yk.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE s51yk.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <regX52.h>
2
3 #define c(x) (x*110592/120000)
4 sbit Ir_Pin=P3^2;
5 sbit beep=P2^1;
6 //sbit RELAY=P2^0;
7 #define INBUF_LEN 4 //数据长度
8 unsigned char inbuf1[INBUF_LEN]={'0','0','0','0'};//发送缓冲区
9 unsigned char inbuf2[50];//接收缓冲区
10 unsigned char count3;
11 void init_serialcomm( void )
12 {
13 1 SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
14 1 T2CON=0x30;
15 1 TH2=0x00;
16 1 TL2=0x00;
17 1 RCAP2H=0xFF;
18 1 RCAP2L=0xDC;
19 1 TR2=1;
20 1 }
21 //向串口发送一个字符
22 void send_char_com( unsigned char ch)
23 {
24 1 SBUF=ch;
25 1 while (TI== 0 );
26 1 TI= 0 ;
27 1 }
28 //向串口发送一个字符串,strlen 为该字符串长度
29 void send_string_com( unsigned char *str, unsigned int strlen)
30 {
31 1 unsigned int k= 0 ;
32 1 do
33 1 {
34 2 send_char_com(*(str + k));
35 2 k++;
36 2 } while (k < strlen);
37 1 }
38 //串口接收中断函数
39 void serial () interrupt 4 using 3
40 {
41 1 if (RI) //RI==开始接收
42 1 {
43 2 unsigned char ch;
44 2 RI = 0 ; //软件RI=0
45 2 ch=SBUF;
46 2 if (ch> 1 )
47 2 {
48 3 count3= 0 ;
49 3 inbuf2[count3]=ch;
50 3 }
51 2 else
52 2 {
53 3 count3++;
54 3 inbuf2[count3]=ch;
55 3 }
C51 COMPILER V8.02 S51YK 11/30/2007 10:24:39 PAGE 2
56 2 }
57 1 }
58
59
60 unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
61 0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F.
62 unsigned char code Led_Sel[]={0x7f,0xbf,0xdf,0xef};
63 unsigned char dis_8[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','-'};
64
65 unsigned char Led_Buf[4]; //显示缓冲区
66 char Led_Index; //位选
67
68 unsigned char Ir_Buf[4]; //用于保存解码结果
69 void delay_50ms(unsigned int t)
70 {
71 1 unsigned int j;
72 1 for(;t>0;t--)
73 1 for(j=6245;j>0;j--)
74 1 {;}
75 1 }
76
77 //==============================================================
78 //数码管扫描
79 timer0() interrupt 1 using 1
80 {
81 1 TL0=65536-1000;
82 1 TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
83 1 P0=0xff;
84 1 P3=Led_Sel[Led_Index]; //位选
85 1 P0=Led_Tab[Led_Buf[Led_Index]]; //段选
86 1
87 1 if(++Led_Index>3) Led_Index=0; //四个扫描完了,到第一个数码管
88 1 }
89 //==============================================================
90 unsigned int Ir_Get_Low()
91 {
92 1 TL1=0;
93 1 TH1=0;
94 1 TR1=1;
95 1 while(!Ir_Pin && (TH1&0x80)==0);
96 1 TR1=0;
97 1 return TH1*256+TL1;
98 1 }
99 //=============================================================
100 unsigned int Ir_Get_High()
101 {
102 1 TL1=0;
103 1 TH1=0;
104 1 TR1=1;
105 1 while(Ir_Pin && (TH1&0x80)==0);
106 1 TR1=0;
107 1 return TH1*256+TL1;
108 1 }
109 //==============================================================
110 main()
111 {
112 1 unsigned int temp;
113 1 char i,j;
114 1 Led_Index=1;
115 1 init_serialcomm(); //初始化串口
116 1 TMOD=0x11;
117 1 TL0=65536-1000;
C51 COMPILER V8.02 S51YK 11/30/2007 10:24:39 PAGE 3
118 1 TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
119 1 EA=1;
120 1 ET0=1;
121 1 TR0=1;
122 1
123 1 Led_Buf[0]=0;
124 1 Led_Buf[1]=0;
125 1 Led_Buf[2]=0;
126 1 Led_Buf[3]=0; //显示区设成0
127 1 do{
128 2 restart:
129 2 while(Ir_Pin);
130 2 temp=Ir_Get_Low();
131 2 if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000
132 2 temp=Ir_Get_High();
133 2 if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500
134 2 for(i=0;i<4;i++) //4个字节
135 2 for(j=0;j<8;j++) //每个字节8位
136 2 {
137 3 temp=Ir_Get_Low();
138 3 if(temp<c(200) || temp>c(800)) goto restart;
139 3 temp=Ir_Get_High();
140 3 if(temp<c(200) || temp>c(2000)) goto restart;
141 3 Ir_Buf[i]>>=1;
142 3 if(temp>c(1120)) Ir_Buf[i]|=0x80;
143 3 }
144 2 Led_Buf[0]=Ir_Buf[2]&0xf;
145 2 Led_Buf[1]=(Ir_Buf[2]/16)&0xf;
146 2 Led_Buf[2]=Ir_Buf[3]&0xf;
147 2 Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果
148 2 inbuf1[0]=dis_8[Led_Buf[1]];
149 2 inbuf1[1]=dis_8[Led_Buf[0]];
150 2 inbuf1[2]=0x0d;
151 2 inbuf1[3]=0x0a;
152 2 send_string_com(inbuf1,INBUF_LEN);
153 2 P1=Ir_Buf[2];
154 2 beep=0;
155 2 delay_50ms(2);
156 2 beep=1;
157 2 //RELAY=0;
158 2 //delay_50ms(50);
159 2 //RELAY=1;
160 2
161 2
162 2 //while ( 1 )
163 2 //{
164 2
165 2 }
166 1
167 1
168 1 while(1);
169 1
170 1 }
171
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 645 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 81 10
C51 COMPILER V8.02 S51YK 11/30/2007 10:24:39 PAGE 4
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -