📄 s51yk.lst
字号:
C51 COMPILER V6.12 S51YK 01/28/2003 20:03:39 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE S51YK
OBJECT MODULE PLACED IN .\s51yk.OBJ
COMPILER INVOKED BY: E:\Keil\C51\BIN\C51.EXE .\s51yk.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*红外遥控解码数码管显示实验
2 程序说明:本程序要用数码管显示遥控接头解出来的码值,并配有蜂鸣器鸣叫
3 作者:RF-X1开发板团队
4 日期:2008-07-20
5 */
6 #include <reg51.h>
7 #define c(x) (x*120000/120000)
8
9 sbit Ir_Pin=P1^7; //遥控接头接口
10 sbit beep=P3^7; //蜂鸣器接口
11 unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
12 0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F.
13 unsigned char code Led_Sel[]={0xfe,0xfd,0xfb,0xf7};
14 unsigned char Led_Buf[4]; //显示缓冲区
15 char Led_Index; //位选
16 unsigned char Ir_Buf[4]; //用于保存解码结果
17
18 /******************************************/
19 /* 延时子程序 */
20 /******************************************/
21 void delay_50ms(unsigned int t)
22 {
23 1 unsigned int j;
24 1 for(;t>0;t--)
25 1 for(j=6245;j>0;j--)
26 1 {;}
27 1 }
28
29 /******************************************/
30 /* 数码管定时扫描 */
31 /******************************************/
32 timer0() interrupt 1 using 1
33 {
34 1 TL0=65536-1000;
35 1 TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
36 1 P0=0xff;
37 1 P2=Led_Sel[Led_Index]; //位选
38 1 P0=Led_Tab[Led_Buf[Led_Index]]; //段选
39 1
40 1 if(++Led_Index>3) Led_Index=0; //四个扫描完了,到第一个数码管
41 1 }
42
43 /******************************************/
44 /* 获取码值的低位 */
45 /******************************************/
46 unsigned int Ir_Get_Low()
47 {
48 1 TL1=0;
49 1 TH1=0;
50 1 TR1=1;
51 1 while(!Ir_Pin && (TH1&0x80)==0);
52 1 TR1=0;
53 1 return TH1*256+TL1;
54 1 }
55
C51 COMPILER V6.12 S51YK 01/28/2003 20:03:39 PAGE 2
56 /******************************************/
57 /* 获取码值的高位 */
58 /******************************************/
59 unsigned int Ir_Get_High()
60 {
61 1 TL1=0;
62 1 TH1=0;
63 1 TR1=1;
64 1 while(Ir_Pin && (TH1&0x80)==0);
65 1 TR1=0;
66 1 return TH1*256+TL1;
67 1 }
68
69 /******************************************/
70 /* 主函数 */
71 /******************************************/
72 main()
73 {
74 1 unsigned int temp;
75 1 char i,j;
76 1 Led_Index=1;
77 1
78 1 TMOD=0x11;
79 1 TL0=65536-1000;
80 1 TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
81 1 EA=1;
82 1 ET0=1;
83 1 TR0=1;
84 1
85 1 Led_Buf[0]=0;
86 1 Led_Buf[1]=0;
87 1 Led_Buf[2]=0;
88 1 Led_Buf[3]=0; //显示区设成0
89 1 do{
90 2 restart:
91 2 while(Ir_Pin);
92 2 temp=Ir_Get_Low();
93 2 if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000
94 2 temp=Ir_Get_High();
95 2 if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500
96 2 for(i=0;i<4;i++) //4个字节
97 2 for(j=0;j<8;j++) //每个字节8位
98 2 {
99 3 temp=Ir_Get_Low();
100 3 if(temp<c(200) || temp>c(800)) goto restart;
101 3 temp=Ir_Get_High();
102 3 if(temp<c(200) || temp>c(2000)) goto restart;
103 3 Ir_Buf[i]>>=1;
104 3 if(temp>c(1120)) Ir_Buf[i]|=0x80;
105 3 }
106 2 Led_Buf[0]=Ir_Buf[2]&0xf;
107 2 Led_Buf[1]=(Ir_Buf[2]/16)&0xf;
108 2 Led_Buf[2]=Ir_Buf[3]&0xf;
109 2 Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果
110 2 P1=Ir_Buf[2];
111 2 beep=0;
112 2 delay_50ms(2);
113 2 beep=1;
114 2 }
115 1
116 1 while(1);
117 1
C51 COMPILER V6.12 S51YK 01/28/2003 20:03:39 PAGE 3
118 1 }
119
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 495 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 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 + -