📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 12/11/2007 16:22:43 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2
3 //红外报警系统
4
5 #include<REGX52.H>
6 //#include "1602S51.H"
7
8 sbit Alarm_sound=P1^3; //蜂鸣器,低电平有效
9 sbit LED_Green=P2^5; //正常工作指示 --绿
10 sbit LED_Test=P2^6; //测试状态指示 --红
11 sbit Relay_Control=P1^4; //继电器 低电平有效
12 sbit Red_LED1=P1^0; //红外接收头1
13 sbit Red_LED2=P1^1; //红外接收头2
14 sbit Red_LED3=P1^2; //红外接收头3
15 sbit human=P3^0; //热释电按口
16
17 unsigned int Alarm_Number=10; //报警门限值,可通过按键改变
18 unsigned char Style_bit=0; //类型标志位
19 unsigned int Count_number=0; //计数
20 bit Alarm_bit=0; //强制报警开关
21 bit Test_bit=0; //测试标志
22 bit Red_recognize_bit1=0; //识别到物体标志
23 bit Red_recognize_bit2=0; //识别到物体标志
24 unsigned char delay_count; //灯的开关状态 延迟计数,当到一定次数,就进行开关灯操作,
25 //这样做的好处时为了使灯的闪烁时间不影响其他子程序,如按键扫描
26
27
28 unsigned char style[6]={"STYLE:"}; //显示 Style 类型
29 unsigned char raster[6]={"Raster"};//显示 光栅
30 unsigned char identify[8]={"Identify"}; // 显示 人体识别
31 unsigned char TestModel[9]={"TestModel"}; //显示 测试模式
32 unsigned char count[7]={"Count: "}; // 显示 人体识别
33 unsigned char change[9]={"Alarm_Num"};
34 unsigned char Clear9[9]={" "}; //用于清屏
35 unsigned char Clear16[16]={" "}; //用于清屏
36 unsigned char Warning[16]={" Warning! "};
37
38 void Alarm_CLOSE(void);
39 void Alarm_OPEN(void);
40 void Key_Scan(void);
41 void Test(void);
42
43 //------------------------------------------------------
44 //液晶1602相关定义
45 sbit LCDE=P2^7;
46 sbit RW=P3^4;
47 sbit RS=P3^5;
48
49 wr_com(unsigned char comm);//********写控制字符程序 E=1 RS=0 RW=0**********//
50 wr_data(unsigned char dat);//*****当前位置写字符子程序:E=1 RS=1 RW=0
51 void display(unsigned char addr,unsigned char *a,unsigned char c);
52 unsigned char rd_bf();//*****忙状态检查*******//
53
54
55 //*************delay_ms********************************
C51 COMPILER V7.50 MAIN 12/11/2007 16:22:43 PAGE 2
56 void delay_10us(unsigned char x)
57 {
58 1 while(x--);
59 1 }
60
61 void delay_ms(unsigned char cnt)
62 {
63 1 unsigned char i;
64 1 do {
65 2 i = 4;
66 2 do {
67 3 delay_10us(39);
68 3 } while(--i);
69 2 } while(--cnt);
70 1 }
71
72 //====================================================
73 // 1602液晶相关
74
75
76 wr_com(unsigned char comm)//********写控制字符程序 E=1 RS=0 RW=0**********//
77 {
78 1 LCDE=0;
79 1 RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
80 1 RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
81 1 LCDE=1;
82 1 P0=comm;
83 1 RS=0;
84 1 RW=0;
85 1 LCDE=0;
86 1 }
87
88 wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
89 {
90 1 LCDE=0;
91 1 RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
92 1 RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
93 1 RS=1;
94 1 RW=0;
95 1 LCDE=1;
96 1 P0=dat;
97 1 LCDE=0;
98 1 RS=0;
99 1 RW=0;
100 1 }
101
102
103 unsigned char rd_bf()//*****忙状态检查*******//
104 {
105 1 unsigned char i;
106 1 //P0=0xff;
107 1 LCDE=0;
108 1 RS=0;
109 1 RW=0;
110 1 RS=0;
111 1 RW=1;
112 1 LCDE=1;
113 1 i=P0;
114 1 LCDE=0;
115 1
116 1 // while(i){i=P0_7;}
117 1
C51 COMPILER V7.50 MAIN 12/11/2007 16:22:43 PAGE 3
118 1 return(i);
119 1 }
120
121 void init_LCD()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
122 {
123 1 wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
124 1 delay_ms(5);
125 1 wr_com(0x38);
126 1 delay_ms(5);
127 1 wr_com(0x38);
128 1 delay_ms(5);
129 1
130 1 //rd_bf();
131 1 //delay5ms();
132 1 wr_com(0x01); ///***清屏****
133 1 delay_ms(5);
134 1 rd_bf();
135 1 delay_ms(5);
136 1 wr_com(0x06); ///****光标移动设置***
137 1 delay_ms(5);
138 1 rd_bf();
139 1 delay_ms(1);
140 1 wr_com(0x38); ////***显示模式设置****
141 1 delay_ms(1);
142 1 rd_bf();
143 1 delay_ms(1);
144 1 wr_com(0x0f); /////***显示开***
145 1 delay_ms(1);
146 1 rd_bf();
147 1 delay_ms(1);
148 1
149 1 wr_com(0x40); //set cgram address
150 1 delay_ms(1);
151 1 // rd_bf();
152 1
153 1
154 1 }
155
156 //---------------------------------------
157 //名称:显示子程序
158 //功能:在指定地方显示字符
159 //入口:a 是指向要显示的数组
160 // addr是要显示的地址
161 // c 为数组长度
162 //返回:无
163 void display(unsigned char addr, unsigned char *a, unsigned char c)
164 {
165 1 unsigned char i;
166 1 // if(rd_bf())
167 1 wr_com(addr);
168 1 for(i=0;i<c;i++)
169 1 {
170 2 rd_bf();
171 2 wr_data(a[i]);
172 2 delay_10us(1);
173 2 }
174 1
175 1
176 1
177 1 }
178
179 //---------------------------------------------------------------
C51 COMPILER V7.50 MAIN 12/11/2007 16:22:43 PAGE 4
180 //功能:数据输出
181 //输入:str为要显示的数据,X为坐标
182 void Printf_Number(unsigned char X,unsigned long Temp)
183 {
184 1
185 1 unsigned char i = 8;
186 1 char vec[9];
187 1 char *ptr=vec;
188 1 vec[i] = 0;
189 1 do
190 1 {
191 2 vec[--i] = Temp%10 + '0';
192 2 Temp /= 10;
193 2 }
194 1 while (Temp!=0);
195 1
196 1 ptr=ptr+i;
197 1
198 1 wr_com(X);
199 1 while((*ptr) != '\0')
200 1 {
201 2 // wr_lcd (dat, *ptr);
202 2
203 2 rd_bf();
204 2 wr_data(*ptr);
205 2 ptr ++;
206 2 delay_10us(2);
207 2 }
208 1 }
209
210
211
212
213 void main(void)
214 {
215 1
216 1 P0=0;
217 1 P1=0xff;
218 1 P2=0xFF;
219 1 P3=0xff;
220 1
221 1 Alarm_sound=1; //关蜂鸣器
222 1 LED_Green=1;
223 1 LED_Test=0;
224 1 Relay_Control=1;
225 1 init_LCD(); //初始化1602
226 1 display(0x80,style,6); //第一行
227 1 display(0x88,raster,6); //第二行
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -