📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 01/05/2008 10:09:14 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /***************************************/
2 /* 十字路口交通灯控制系统 */
3 /* 开发语言:C51 */
4 /* 编译器:keil C51 V7.06 */
5 /***************************************/
6 /*采用线选法寻址8255A */
7 /*PA Address 7FFCH */
8 /*PB Address 7FFDH */
9 /*PC Address 7FFEH */
10 /*Control Address 7FFFH */
11 /*晶振: 12M */
12 /*单片机:AT89s51 */
13 /***************************************/
14 #include "at89x51.h"
15 #include "absacc.h"
16 #define KEY XBYTE [0x7FFC]
17 #define LED XBYTE [0x7FFD]
18 #define Control XBYTE [0x7FFF]
19
20 #define R_ON_G_ON 0x2e//东西方向红灯亮 南北方向绿灯亮
21 #define R_ON_G_OFF 0x3e//东西方向红灯亮 南北方向绿灯灭
22 #define R_ON_Y_ON 0x1e//东西方向红灯亮 南北方向黄灯亮
23
24 #define G_ON_R_ON 0x35//东西方向绿灯亮 南北方向红灯亮
25 #define G_OFF_R_ON 0x37//东西方向绿灯灭 南北方向红灯亮
26 #define Y_ON_R_ON 0x33//东西方向黄灯亮 南北方向红灯亮
27 unsigned char data second;
28 unsigned char data msecond;
29 unsigned char data caution;
30 bit complete;
31 /****************************************************************/
32 /*******************************/
33 /* 定时器初始化 */
34 /* 输入:无 */
35 /* 输出:无 */
36 /*******************************/
37 void init_t(void)
38 {
39 1 TMOD=0X21; //定时器0工作在方式1 10ms产生一次中断
40 1
41 1 TH0=0xd8;
42 1 TL0=0xf0;
43 1 EA=1;
44 1 ET0=1;
45 1 }
46 /****************************************************************/
47 /***************************************/
48 void init_8255A(void)
49 {Control=0x98; //PA口工作于方式0 输入
50 1 //PB口工作于方式0 输出
51 1 //PC7-4输入 PC3-0 输出
52 1 }
53 /****************************************************************/
54 /*******************************/
55 /* 键盘检测延迟函数 */
C51 COMPILER V7.06 MAIN 01/05/2008 10:09:14 PAGE 2
56 /* 输入:无 */
57 /* 输出:无 */
58 /*******************************/
59 void key_delay(void)
60 {unsigned int i;
61 1 i=1000;
62 1 while(--i);
63 1 }
64 /****************************************************************/
65 /*******************************/
66 /* 键盘检测函数 */
67 /* 输入:无 */
68 /* 输出:键盘检测值 */
69 /*******************************/
70 unsigned char key_detect(void)
71 {unsigned char key;
72 1 key=KEY;
73 1 key_delay(); //延迟约20MS 消除按键抖动
74 1 if((key==KEY)&&(key==0xFE))
75 1 return 0x01; //若两次按键值相同 且 PA0为0 为有效按键 返回 0x01
76 1 else return 0x00; //否则还回 0x00
77 1
78 1 }
79 /***************************************************************************************/
80 /*******************************/
81 /* 主函数 */
82 /* 输入:无 */
83 /* 输出:无 */
84 /*******************************/
85 /***************************************/
86 main()
87 { init_8255A(); //8255初始化
88 1 init_t(); //定时器初始化 定时器未开启
89 1 while(1)
90 1 {switch( key_detect()) //键盘检测
91 2 {
92 3 case 0x00:LED=0xFF;TR0=0;break; //检测函数为 0x00 开关断开 关闭定时器 交通灯停止工作
93 3 case 0x01:TR0=1 ; break; //检测函数为 0x01 开关闭合 启动定时器 交通灯开始工作
94 3 default:LED=0xFF ;TR0=0;break; //检测函数为其他值 关闭定时器 交通灯停止工作
95 3 }
96 2
97 2 }
98 1 }
99 /***************************************/
100 /***************************************************************************************/
101 /*******************************/
102 /* 定时中断服务函数 */
103 /* 输入:无 */
104 /* 输出:无 */
105 /*******************************/
106 void timer0_isp()interrupt 1 using 2
107 { TR0=0; //关闭定时器
108 1 if(++msecond==100) //10毫秒中断一次 100次为1秒
109 1 {msecond=0;
110 2 ++second;
111 2 }
112 1 if(msecond==3)
113 1 complete=~complete; //设定闪烁标志位
114 1 //-----------------------------------------------------------------------------------
115 1 if(second<=15) caution=0x01; //0-15s 东西方向红灯亮, 南北方向绿灯亮 共15s
116 1 else if(second<=18) caution=0x02; //15-18s 东西方向红灯亮, 南北方向绿灯闪烁 共3s
117 1 else if(second<=20) caution=0x03; //18-20s 东西方向红灯亮, 南北方向黄灯亮 共2s
C51 COMPILER V7.06 MAIN 01/05/2008 10:09:14 PAGE 3
118 1 else if(second<=35) caution=0x04; //20-35s 东西方向绿灯亮, 南北方向红灯亮 共15s
119 1 else if(second<=38) caution=0x05; //35-38s 东西方向绿灯闪烁,南北方向红灯亮 共3s
120 1 else caution=0x06; //38-40s 东西方向黄灯亮, 南北方向红灯亮 共2s
121 1 //-------------------------------------------------------------------------------------
122 1 switch(caution)
123 1 {case 0x01:LED=R_ON_G_ON;break; //东西方向红灯亮 南北方向绿灯亮
124 2 case 0x02:if(complete)
125 2 LED=R_ON_G_ON ;
126 2 else LED=R_ON_G_OFF;
127 2 break; //东西方向红灯亮 南北方向绿灯闪动
128 2 case 0x03:LED=R_ON_Y_ON;break; //东西方向红灯亮 南北方向黄灯亮
129 2 case 0x04:LED=G_ON_R_ON;break; //东西方向绿灯亮 南北方向红灯亮
130 2 case 0x05:if(complete)
131 2 LED=G_ON_R_ON;
132 2 else LED=G_OFF_R_ON;
133 2 break; //东西方向绿灯闪动 南北方向红灯亮
134 2 case 0x06:LED=Y_ON_R_ON;break; //东西方向黄灯亮 南北方向红灯亮
135 2 default :LED=0xFF;break; //其他情况下 交通停止工作
136 2 }
137 1 //-------------------------------------------------------------------------------------
138 1 if(second==40) second=0; //40秒完成一次交通灯循环 秒值归0
139 1
140 1 TH0=0xd8; //10ms //校正定时器启动值
141 1 TL0=0xf0;
142 1 TR0=1; //重新启动定时器
143 1 }
144 /*********************************************************************************************************
-************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 297 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -