📄 com.lst
字号:
C51 COMPILER V7.06 COM 02/28/2007 16:12:35 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE COM
OBJECT MODULE PLACED IN COM.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE COM.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 /*****************************************************************/
3 /* */
-
4 /*名称: 24C02读写程序 */
-
-
5 /*功能: 接收串口发来的数据,写到24C02里面 */
6 /* 再从24C02里读出刚写进的数据,由串口发出 */
7 /*难度等级: 高 */
-
8 /* 作者: zengrenliang */
9 /* 版权: http://www.51kaifa.com */
10 /*编写日期: 2006.05.21 */
-
-
11 /*****************************************************************/
12
13 #include <reg52.h>
14 #define uchar unsigned char
15 #define uint unsigned int
16 sbit SK=P1^2;//SPI时钟线
17 sbit DI=P1^3;
18 sbit DO=P1^4;//SPI数据线
19 sbit LCK = P3^5;
20 bit receive;//接收标志
21 bit re_finish;//接收一串字符完成标志
22 sbit LED = P1^2;//LED指示灯
23
24 uchar i,buffer[8],cbuffer[8];//串口缓冲区
25 uchar sbuffer,number;//发送字符个数
26 uchar sendFINS ;//发送完成标志
27 uchar copyOK , cmd_numb ;//发送缓冲区填充完成
28
29 void send(void);
30 void vGet_Send(void);
31 void delay(unsigned int loop);
32 void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number);
33 void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number);
34
35 /*******************************系统初始化***********************/
36 void initial()
37 { unsigned char j;
38 1
39 1 SCON=0x50; //串口工作方式1,允许接收
40 1 PCON=0x80; //波特率翻倍
41 1 TCON=0;
42 1 TMOD=0x26; //T1用于串口波特率控制
43 1 TL1=0xfa; //初始化T1,波特率为9600(晶振11.0592M)
44 1 TH1=0xfa;
45 1 TR1=1; //开定时器
46 1 EA=1; //开总中断
47 1 ES=1; //开串口中断
48 1 copyOK = 0; //缓冲区准备好标志清零
49 1 receive = 0; //接收标志清零
C51 COMPILER V7.06 COM 02/28/2007 16:12:35 PAGE 2
50 1 re_finish = 0; //接受完成标志清零
51 1 cmd_numb = 0; //接受计数器清零
52 1
53 1 for(j=0; j<8; j++) //串口缓冲区清空
54 1 buffer[i] = 0xff; //table[18]为空显示
55 1 }
56
57 /******************************主函数**************************/
58
59 main()
60 {
61 1 initial();
62 1 while(1){
63 2 if(re_finish){//接收一串字符完成
64 3 re_finish = 0;
65 3 vGet_Send();
66 3 }
67 2 }
68 1 }
69
70 /*****************************保存和串口发送**************************/
71 void vGet_Send(void)
72 { uchar i;
73 1
74 1 WriteString(buffer,0x10,6);//数据存放初始地址为0x10
75 1
76 1 delay(1000);
77 1
78 1 for(i=0;i<8;i++)
79 1 buffer[i] = 0x5f; //用0xff填充发送缓冲区
80 1
81 1 ReadString(buffer,0x10,6);//读数据
82 1 copyOK = 1; //置准备好标志
83 1 send(); //向串口发送
84 1 }
85
86 /*****************************串口发送***************************/
87
88 void send(void)//向串口发送字符串
89 {
90 1
91 1 if(copyOK) //串口准备好且缓冲区准备好
92 1 {
93 2 i = 0;
94 2 REN = 0; //发送过程中禁止接收数据
95 2 copyOK = 0; //清缓冲区准备好标志
96 2 SBUF = cbuffer[i++]; //发送字符串首字符
97 2 number = 7; //置发送计数器
98 2 }
99 1 else
100 1 return; //没准备好则返回
101 1 }
102
103
104 /***************************串口中断响应*************************/
105
106 void serial(void) interrupt 4//串口中断响应
107 {
108 1 if(RI)//为接收中断
109 1 {
110 2 RI=0; //清接收中断标志
111 2 LED = ~LED; //闪串口指示LED
C51 COMPILER V7.06 COM 02/28/2007 16:12:35 PAGE 3
112 2 sbuffer = SBUF; //读取串口缓冲区数据
113 2
114 2 if((sbuffer == 's') && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
115 2 {
116 3 receive = 1; //开始接收标志
117 3 cmd_numb = 0; //清接收计数器
118 3 re_finish = 0; //清接收完成标志
119 3 }
120 2 else if(sbuffer == 'e') //判断数据尾
121 2 {
122 3 re_finish = 1; //置接收完成标志
123 3 receive =0; //清接收标志
124 3 }
125 2 else if(receive){ //判断当前是否处于接收状态
126 3
127 3 cbuffer[cmd_numb++] = sbuffer; //当前字符送缓冲区
128 3 }
129 2 else //无效命令则返回
130 2 return;
131 2 }
132 1 else{
133 2 TI=0; //为单个字符发送完中断
134 2 if(!number) //字符串发送完
135 2 { REN = 1; //允许接收
136 3 }
137 2 else{ //字符串未发送完
138 3 SBUF = cbuffer[i++]; //发送下一字符
139 3 number--; //发送字符数减一
140 3 }
141 2 }
142 1 }
143
144 /*****************************延时函数**************************/
145 void delay(unsigned int loop)
146 { unsigned int i ; //loop 为执行空指令的次数,改变它可一改变延时时长
147 1 for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
148 1 }
149
150
151
152 // 允许写入
153 void Ewen(void) {
154 1 unsigned char temp,InData;
155 1 LCK = 0;
156 1 P0 = 0xfe;
157 1 LCK = 1;//CS=0;
158 1
159 1 SK=0;
160 1
161 1 LCK = 0;
162 1 P0 = 0xff;
163 1 LCK = 1;//CS=1;
164 1
165 1 InData=0x98; // 10011XXXX
166 1 for(temp=9;temp!=0;temp--) { // 9
167 2 DI=InData&0x80;
168 2 SK=1; SK=0;//产生时钟
169 2 InData<<=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -