📄 main.lst
字号:
C51 COMPILER V8.02 MAIN 05/14/2008 01:19:09 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /**************************************************************/
2 /* */
3 /* */
4 /* 胡寓洋设计,红外遥控1602时钟,语音播报 */
5 /* 红外解码为gguoqing 版主编写,特此感谢 */
6 /* */
7 /* */
8 /* */
9 /**************************************************************/
10 #include<reg52.h>
11 #include"lcd1602.h"
12 #include"ds18b20.h"
13 #include"ir_decode.h"
14 #include"luyin.h"
15 #define uchar unsigned char
16 #define uint unsigned int
17 #define TIMER0_COUNT 0xEE11
18 void keyscan1();
19 uchar ak;
20
21 uchar count,s1num,timer0_tick,count=0;
22 typedef struct{
23 char hour;
24 char minute;
25 char second;
26 }time;
27
28 typedef struct{
29 uint year;
30 uchar month;
31 char day;
32 }date;
33 time now={0,0,0};
34 date today={2008,1,29};
35 char code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
36 char code weekday[7][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
37 uchar ss,sg,fs,fg,ms,mg;
38
39 uchar monthday(uchar year,uchar month)
40 {
41 1 if(month==2 && year%4==0) //润年的2月有29天
42 1 return(29);
43 1 else
44 1 return(dayofmonth[month-1]); //非闰年时的该月份天数
45 1 }
46
47 void display_week() //由年月日计算星期
48 {
49 1 char days;
50 1 days=(today.day+1+2*today.month+3*(today.month+1)/5+today.year+today.year/4-today.year/100+today.year
-/400)%7;
51 1 display_string(&weekday[days][0]);
52 1 }
53
54 static void timer0_initialize(void) //timer0 initialize
C51 COMPILER V8.02 MAIN 05/14/2008 01:19:09 PAGE 2
55 {
56 1 EA=1; //设置不接受所有中断
57 1 timer0_tick=0;
58 1 TR0=0; //关闭Timer0
59 1 TMOD=0X01; //设置Timer0为模式2,16位工作模式
60 1 TL0=(TIMER0_COUNT & 0X00FF); //设置Timer0低八位数值
61 1 TH0=(TIMER0_COUNT >> 8); //设置Timer0高八位数值
62 1 PT0=1; //设置Timer0的优先级为最高
63 1 ET0=1; //设置接受Timer0的中断
64 1 TR0=1; //启动Timer0
65 1 EA=1; //设置系统接受中断
66 1 }
67
68 void write_time(uchar mk,uchar add,uchar number)
69 {
70 1 if(mk==0)
71 1 {ak=0;}
72 1 if(mk==1)
73 1 {ak=1;}
74 1 if(mk==2)
75 1 {ak=2;}
76 1
77 1 gotoxy(2,add);
78 1 display_data(ak,number);//now.minute now.second now.hour
79 1
80 1
81 1
82 1 }
83
84 void write_riqi(uchar add,uchar number)
85 {
86 1 //displaybuffer1[6]=number/10;//日期十位
87 1 //displaybuffer1[7]=number%10;//日期个位
88 1 gotoxy(1,add);
89 1 display_data(3,number);
90 1 }
91
92
93 void IR_IN() interrupt 0 using 0
94 {
95 1 unsigned char j,k,N=0;
96 1
97 1 EX0 = 0;
98 1 EX1=1;
99 1
100 1 belay(15);
101 1 if (IRIN==1)
102 1 { EX0 =1;
103 2 return;
104 2 }
105 1 //确认IR信号出现
106 1 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
107 1 {belay(1);}
108 1
109 1 for (j=0;j<4;j++) //收集四组数据
110 1 {
111 2 for (k=0;k<8;k++) //每组数据有8位
112 2 {
113 3 while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
114 3 {belay(1);}
115 3 while (!IRIN) //等 IR 变为高电平
116 3 {belay(1);}
C51 COMPILER V8.02 MAIN 05/14/2008 01:19:09 PAGE 3
117 3 while (IRIN) //计算IR高电平时长
118 3 {
119 4 belay(1);
120 4 N++;
121 4 if (N>=30)
122 4 { EX0=1;
123 5 return;} //0.14ms计数过长自动离开。
124 4 } //高电平计数完毕
125 3 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
126 3 if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
127 3 N=0;
128 3 }//end for k
129 2 }//end for j
130 1
131 1 if (IRCOM[2]!=~IRCOM[3])
132 1 { EX0=1;
133 2 return; }
134 1 if(IRCOM[3]==0XFE)//1
135 1 {
136 2 if(IRCOM[3]==0xfe)
137 2 {
138 3 mode=0;
139 3
140 3
141 3 }
142 2
143 2 }
144 1 if(IRCOM[3]==0XFd) //2
145 1 {
146 2 if(IRCOM[3]==0xfd)
147 2 {
148 3 plus=0;
149 3
150 3
151 3 }
152 2
153 2 }
154 1 if(IRCOM[3]==0XFc) //3
155 1 {
156 2 if(IRCOM[3]==0xfc)
157 2 {
158 3 dec=0;
159 3
160 3 }
161 2
162 2 }
163 1 if(IRCOM[3]==0XFb) //4
164 1 {
165 2 if(IRCOM[3]==0xfb)
166 2 {
167 3 dc=0;
168 3
169 3
170 3 }
171 2
172 2 }
173 1
174 1 if(IRCOM[3]==0XFA)
175 1 { if(IRCOM[3]==0XFA)
176 2 {recstart=0;}
177 2 }
178 1
C51 COMPILER V8.02 MAIN 05/14/2008 01:19:09 PAGE 4
179 1
180 1
181 1
182 1 keyscan1();
183 1
184 1
185 1
186 1
187 1
188 1
189 1
190 1
191 1 EX0 = 1;
192 1 }
193 void keyscan1()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -