📄
字号:
C51 COMPILER V7.08 確口键臺 03/11/2008 13:50:23 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE 確口键臺
OBJECT MODULE PLACED IN 串口键盘.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 串口键盘.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*-----------------------------------------------------
2 使用说明: 该程序是实现两个单片机之间传送按键值,利用的是串行通讯模式1
3 A、这个是从函数的程序,可以直接下载到2051里;
4 B、这个函数可以以字符串的方式发送;调用SendChar(uchar ch)
5 C、还可以使用数据方式进行发送; 调用SendStrlen(unsigned char *str,unsigned int strl)
6 D、在使用时可以使用校验的方式防止数据发送错误;
7 E、此函数加了软件看狗;
8 设 计 人: KG
9 修改时间: 2007-11-3
10 //---------------------------------------------------*/
11 #include "reg51.h"
12 #include <intrins.h>
13 #include <string.h>
14
15 #define uchar unsigned char
16 #define uint unsigned int
17 sbit P1_0=P1^0;
18 sbit P1_1=P1^1;
19 sbit P1_2=P1^2;
20 sbit P1_3=P1^3;
21 sbit P1_4=P1^4;
22 sbit P1_5=P1^5;
23 sbit P1_6=P1^6;
24 sbit P1_7=P1^7;
25 sbit led=P3^7;
26 //---------------------------------------------------*/
27 //全局变量定义
28 unsigned char SendEnable; //软件看门狗设置
29 unsigned char B_key_value; //串口校验使用
30 /*-----------------------------------------------------------------------------------
31 函 数 名: Delay()
32 功 能: 延时
33 说 明: 延时时间0.5ms*i 最大延时127.5ms 12M
34 延时时间0.25ms*i 最大延时63.75ms 24M
35 入口参数: unsigned char i
36 返 回 值: 无
37 /*---------------------------------------------------------------------------------*/
38 void Delay(unsigned char i)
39 {
40 1 unsigned char j;
41 1 do{
42 2 //-------------------
43 2 j=250; //延时0.5ms
44 2 do{
45 3 j--;
46 3 }while(j);
47 2 //-------------------
48 2 i--;
49 2 }while(i);
50 1 }
51 /*-----------------------------------------------------------------------------------
52 函 数 名:
53 功 能: 延时
54 说 明:
55 入口参数: unsigned char i
C51 COMPILER V7.08 確口键臺 03/11/2008 13:50:23 PAGE 2
56 返 回 值: 无
57 设 计 人: 2007 11 3 KG
58 /*---------------------------------------------------------------------------------*/
59 void Delay500ms(unsigned char i)
60 {
61 1 do{
62 2 Delay(200); //延时500ms
63 2 i--;
64 2 }while(i);
65 1 }
66 /*-----------------------------------------------------
67 函 数 名:
68 功 能: 打开及初始化串口
69 说 明:
70 入口参数:
71 返 回 值:
72 设 计 人: 2007 11 3 KG
73 //---------------------------------------------------*/
74 void OpenSerialCom(void)
75 {
76 1 SCON = 0x50; //设置串口工作模式1并打开串口
77 1 TMOD = 0x20; //波特率
78 1 PCON |= 0x80;
79 1 TH1 = 0xfa; //9600
80 1 TL1 = 0xfa;
81 1 IE |= 0x90; //打开串行中断及总中断
82 1 TR1 = 1; //启动内部定时
83 1 }
84 /*-----------------------------------------------------
85 函 数 名:
86 功 能: 数据(字符串)串行发送
87 说 明:
88 入口参数:
89 返 回 值:
90 设 计 人: 2007 11 3 KG
91 //---------------------------------------------------*/
92 void SendChar(uchar ch)
93 {
94 1 ES=0;
95 1 SBUF=ch;
96 1 while(TI==0);
97 1 TI=0;
98 1 led=0;
99 1 Delay500ms(1); //1s
100 1 led=1;
101 1 ES=1;
102 1 }
103 /*-----------------------------------------------------
104 函 数 名: SendStrlen()
105 功 能: 字符串串行发送
106 说 明:
107 入口参数: *str: 所要发送字符串;
108 str1: 发送字符串的个数。
109 返 回 值: 无
110 设 计 人: 2007 11 3 KG
111 //---------------------------------------------------*/
112 void SendStrlen(unsigned char *str,unsigned int strl)
113 {
114 1 unsigned int k=0;
115 1 if(strl==0)
116 1 strl=strlen(str);
117 1 do{
C51 COMPILER V7.08 確口键臺 03/11/2008 13:50:23 PAGE 3
118 2 SendChar(*(str + k));
119 2 k++;
120 2 }while(k<strl);
121 1
122 1 }
123 /*-----------------------------------------------------
124 函 数 名:
125 功 能: 接收主CPU返回的按键值并进行校验,错误则重发。
126 说 明: 从CPU的串行中断,接收到主CPU返回的数据,如果正确则把RXD置低.
127 主CPU检测到该信号后确认键值。
128 入口参数:
129 返 回 值:
130 设 计 人: 2007 11 3 KG
131 //---------------------------------------------------*/
132 void B_Serial() interrupt 4
133 {
134 1 unsigned char ch;
135 1 if(RI)
136 1 { RI=0;
137 2 IE &= 0x0f;
138 2 ch=SBUF;
139 2 if(ch!=B_key_value) //校验
140 2 { SendChar(B_key_value);
141 3 SendEnable+=1; //允许发送
142 3 }
143 2 else
144 2 { led=0;
145 3 REN=0; //关闭串口
146 3 RXD = 0; //将检测位置0
147 3 ch = 50; //延时100us
148 3 do{
149 4 ch--;
150 4 }while(ch);
151 3 RXD = 1;
152 3 REN = 1; //打开串口
153 3 Delay500ms(1);
154 3 led=1;
155 3 SendEnable=0;
156 3 }
157 2 }
158 1 }
159 /*-----------------------------------------------------
160 函 数 名:
161 功 能: 按键扫描
162 说 明:
163 入口参数: 无
164 返 回 值: 键值
165 设 计 人: 2007 11 3 KG
166 //---------------------------------------------------*/
167 uint KeyScan()
168 {
169 1 uchar a=16;
170 1 P1=0xF0;
171 1
172 1 if((P1&0xF0)!=0xF0)
173 1 {
174 2 //Delay(120);//延时消抖
175 2 if((P1&0xF0)!=0xF0)
176 2 {
177 3 if(P1_4==0)
178 3 { //while(P1_4==0);
179 4 P1=0X0F;
C51 COMPILER V7.08 確口键臺 03/11/2008 13:50:23 PAGE 4
180 4 while(P1_0==0){a=0;}//key();}
181 4 while(P1_1==0){a=1;}//key();}
182 4 while(P1_2==0){a=2;}//key();}
183 4 while(P1_3==0){a=3;}//key();}
184 4 }
185 3 else if(P1_5==0)
186 3
187 3 {// while(P1_5==0);
188 4 P1=0X0F;
189 4 while(P1_0==0){a=4;} //key();}
190 4 while(P1_1==0){a=5;}//key();}
191 4 while(P1_2==0){a=6;}//key();}
192 4 while(P1_3==0){a=7;}//key();}
193 4 }
194 3 else if(P1_6==0)
195 3
196 3 {//while(P1_6==0);
197 4 P1=0X0F;
198 4 while(P1_0==0){a=8;}//key();}
199 4 while(P1_1==0){a=9;}//key();}
200 4 while(P1_2==0){a=10;}//key();}
201 4 while(P1_3==0){a=11;}//key();}
202 4 }
203 3 else if(P1_7==0)
204 3
205 3 {//while(P1_7==0);
206 4 P1=0X0F;
207 4 while(P1_0==0){a=12;}//key();}
208 4 while(P1_1==0){a=13;}//key();}
209 4 while(P1_2==0){a=14;}//key();}
210 4 while(P1_3==0){a=15;}//key();}
211 4 }
212 3 }
213 2 //else return(20);
214 2 }
215 1 B_key_value=a;
216 1 return(a);
217 1 }
218 /*-----------------------------------------------------
219 函 数 名:
220 功 能: IO口函数初始化, 指示灯闪烁两次
221 说 明:
222 入口参数: 无
223 返 回 值: 无
224 设 计 人: 2007 11 3 KG
225 //---------------------------------------------------*/
226 void SystemInti()
227 {
228 1 uint i=0;
229 1 SendEnable=0; //初始化变量
230 1 for(i; i<2; i++)
231 1 {
232 2 led=0;//系统开始,红灯闪烁两次
233 2 Delay500ms(1); //0.5s
234 2 led=1;
235 2 Delay500ms(1); //0.5s
236 2 }
237 1 P1 &=0x00;
238 1 }
239 /*-----------------------------------------------------
240 函 数 名: main()主函数
241 功 能:
C51 COMPILER V7.08 確口键臺 03/11/2008 13:50:23 PAGE 5
242 说 明:
243 入口参数:
244 返 回 值:
245 设 计 人: 2007 11 3 KG
246 //---------------------------------------------------*/
247 void main()
248 {
249 1
250 1 uint k;
251 1 //P0=0Xff;
252 1 //P2=0X00;
253 1 //Delay500ms(20);
254 1 start:
255 1 SystemInti(); //系统初始化
256 1 OpenSerialCom(); //串口初始化为模式1
257 1 Delay(100);
258 1 while(1)
259 1 {//k=10;
260 2 k=KeyScan(); //这个按键取值非常稳定
261 2 //k=10;
262 2 if(k!=16)
263 2 { P0=0Xff;
264 3 P2=0X00;
265 3 Delay500ms(20);
266 3 SendChar(k); //正常键值发送
267 3 }
268 2 if(SendEnable>=20) //软件看门狗,系统跑飞,重新开始
269 2 goto start;
270 2 }
271 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 447 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 7
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 + -