📄 93c46.lst
字号:
C51 COMPILER V7.06 93C46 06/19/2007 13:22:16 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 93C46
OBJECT MODULE PLACED IN 93c46.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE 93c46.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 /*****************************************************************/
3 /* */
-
4 /*名称: 93C46读写程序 */
-
-
5 /*功能: 接收串口发来的数据,写到93C46里面 */
6 /* 再从93C46里读出刚写进的数据,由串口发出 */
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^0;//SPI时钟线
17 sbit DI=P1^5;
18 sbit DO=P1^6;//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 93C46 06/19/2007 13:22:16 PAGE 2
50 1 re_finish = 0; //接受完成标志清零
51 1 cmd_numb = 0; //接受计数器清零
52 1 LCK = 0;
53 1 P0 = 0xf7;//关闭所有指示灯
54 1 LCK = 1;
55 1
56 1 for(j=0; j<8; j++) //串口缓冲区清空
57 1 buffer[i] = 0xff; //table[18]为空显示
58 1 }
59
60 /******************************主函数**************************/
61
62 main()
63 {
64 1 initial();
65 1 while(1){
66 2 if(re_finish){//接收一串字符完成
67 3 re_finish = 0;
68 3 vGet_Send();
69 3 }
70 2 }
71 1 }
72
73 /*****************************保存和串口发送**************************/
74 void vGet_Send(void)
75 { uchar i;
76 1
77 1 WriteString(buffer,0x10,6);//数据存放初始地址为0x10
78 1
79 1 delay(1000);
80 1
81 1 for(i=0;i<8;i++)
82 1 buffer[i] = 0x5f; //用0xff填充发送缓冲区
83 1
84 1 ReadString(buffer,0x10,6);//读数据
85 1 copyOK = 1; //置准备好标志
86 1 send(); //向串口发送
87 1 }
88
89 /*****************************串口发送***************************/
90
91 void send(void)//向串口发送字符串
92 {
93 1
94 1 if(copyOK) //串口准备好且缓冲区准备好
95 1 {
96 2 i = 0;
97 2 REN = 0; //发送过程中禁止接收数据
98 2 copyOK = 0; //清缓冲区准备好标志
99 2 SBUF = cbuffer[i++]; //发送字符串首字符
100 2 number = 7; //置发送计数器
101 2 }
102 1 else
103 1 return; //没准备好则返回
104 1 }
105
106
107 /***************************串口中断响应*************************/
108
109 void serial(void) interrupt 4//串口中断响应
110 {
111 1 if(RI)//为接收中断
C51 COMPILER V7.06 93C46 06/19/2007 13:22:16 PAGE 3
112 1 {
113 2 RI=0; //清接收中断标志
114 2 LED = ~LED; //闪串口指示LED
115 2 sbuffer = SBUF; //读取串口缓冲区数据
116 2
117 2 if((sbuffer == 's') && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
118 2 {
119 3 receive = 1; //开始接收标志
120 3 cmd_numb = 0; //清接收计数器
121 3 re_finish = 0; //清接收完成标志
122 3 }
123 2 else if(sbuffer == 'e') //判断数据尾
124 2 {
125 3 re_finish = 1; //置接收完成标志
126 3 receive =0; //清接收标志
127 3 }
128 2 else if(receive){ //判断当前是否处于接收状态
129 3
130 3 cbuffer[cmd_numb++] = sbuffer; //当前字符送缓冲区
131 3 }
132 2 else //无效命令则返回
133 2 return;
134 2 }
135 1 else{
136 2 TI=0; //为单个字符发送完中断
137 2 if(!number) //字符串发送完
138 2 { REN = 1; //允许接收
139 3 }
140 2 else{ //字符串未发送完
141 3 SBUF = cbuffer[i++]; //发送下一字符
142 3 number--; //发送字符数减一
143 3 }
144 2 }
145 1 }
146
147 /*****************************延时函数**************************/
148 void delay(unsigned int loop)
149 { unsigned int i ; //loop 为执行空指令的次数,改变它可一改变延时时长
150 1 for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
151 1 }
152
153
154
155 // **************************允许写入****************************
156 void Ewen(void) {
157 1 unsigned char temp,InData;
158 1 LCK = 0;
159 1 P0 = 0xf6;
160 1 LCK = 1;//CS=0;
161 1
162 1 SK=0;
163 1
164 1 LCK = 0;
165 1 P0 = 0x40;
166 1 LCK = 1;//CS=1;
167 1
168 1 InData=0x98; // 10011XXXX
169 1 for(temp=9;temp!=0;temp--) { // 9
170 2 DI=InData&0x80;
171 2 SK=1; SK=0;//产生时钟
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -