main.lst
来自「3、LCD12864不能显示或不能清楚显示: 1)重新按住复位键和KEY A 2」· LST 代码 · 共 187 行
LST
187 行
C51 COMPILER V7.06 MAIN 11/18/2006 09:36:16 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************************************/
2 /* */
-
3 /*名称: 串口对ds1302读写程序 */
-
-
4 /*功能: 读写DS1302,通过串口返回给电脑 */
-
5 /*难度等级: 中 */
-
6 /* 作者: zengrenliang */
7 /* 版权: http://www.51kaifa.com */
8 /*编写日期: 2006.05.21 */
-
-
9 /*****************************************************************/
10 #include <reg52.h>
11 #include "ds1302.h"
12 #define uchar unsigned char
13
14 bit receive;//接收标志
15 bit re_finish;//接收一串字符完成标志
16 sbit LED = P1^3;//LED指示灯
17
18 uchar i,buffer[8],str[8];//串口缓冲区
19 uchar sbuffer,number;//发送字符个数
20 uchar sendFINS ;//发送完成标志
21 uchar copyOK , cmd_numb ;//发送缓冲区填充完成
22
23 /*********************************系统初始化*****************************/
24
25 void initial()
26 { unsigned char j;
27 1
28 1 SCON=0x50; //串口工作方式1,允许接收
29 1 PCON=0x80; //波特率翻倍
30 1 TCON=0;
31 1 TMOD=0x26; //T1用于串口波特率控制
32 1 TL1=0xfa; //初始化T1,波特率为9600(晶振11.0592M)
33 1 TH1=0xfa;
34 1 TR1=1; //开定时器
35 1 EA=1; //开总中断
36 1 ES=1; //开串口中断
37 1 copyOK = 0; //缓冲区准备好标志清零
38 1 receive = 0; //接收标志清零
39 1 re_finish = 0; //接受完成标志清零
40 1 cmd_numb = 0; //接受计数器清零
41 1
42 1 for(j=0; j<8; j++){ //串口缓冲区清空
43 2 buffer[i] = 0xff; //table[18]为空显示
44 2 str[i] = 0xff;
45 2 }
46 1 }
47
48
C51 COMPILER V7.06 MAIN 11/18/2006 09:36:16 PAGE 2
49 /*************************************向串口发送字符串****************************/
50
51
52 void send(void)
53 {
54 1
55 1 if(copyOK) //串口准备好且缓冲区准备好
56 1 {
57 2 i = 0;
58 2 REN = 0; //发送过程中禁止接收数据
59 2 copyOK = 0; //清缓冲区准备好标志
60 2 SBUF = str[i++]; //发送字符串首字符
61 2 number = 7; //置发送计数器
62 2 }
63 1 else
64 1 return; //没准备好则返回
65 1 }
66
67
68 /**************************************串口中断响应*********************************/
69
70 void serial(void) interrupt 4
71 {
72 1 LED = ~LED;//LED闪烁
73 1 if(RI)//为接收中断
74 1 {
75 2 RI=0; //清接收中断标志
76 2 sbuffer = SBUF; //读取串口缓冲区数据
77 2
78 2 if((sbuffer == 0x55) && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
79 2 {
80 3 receive = 1; //开始接收标志
81 3 cmd_numb = 0; //清接收计数器
82 3 re_finish = 0; //清接收完成标志
83 3 }
84 2 else if(sbuffer == 0xaa) //判断数据尾
85 2 {
86 3 re_finish = 1; //置接收完成标志
87 3 receive =0; //清接收标志
88 3 }
89 2 else if(receive){ //判断当前是否处于接收状态
90 3
91 3 buffer[cmd_numb++] = sbuffer; //当前字符送缓冲区
92 3 }
93 2 else //无效命令则返回
94 2 return;
95 2 }
96 1 else{
97 2 TI=0; //为单个字符发送完中断
98 2 if(!number) //字符串发送完
99 2 { REN = 1; //允许接收
100 3 }
101 2 else{ //字符串未发送完
102 3 SBUF = str[i++]; //发送下一字符
103 3 number--; //发送字符数减一
104 3 }
105 2 }
106 1 }
107
108 /*************************************执行PC端命令*******************************/
109 void DispatchCmd(void)
110 { uchar p;
C51 COMPILER V7.06 MAIN 11/18/2006 09:36:16 PAGE 3
111 1 switch(buffer[0])
112 1 {
113 2 case 1: //设置DS1302
114 2 v_Set1302(&buffer[1]);
115 2 for(p=0;p<8;p++)
116 2 str[p] = 0x55;
117 2 copyOK = 1;
118 2 send();
119 2 break;
120 2
121 2 case 2: //读取DS1302
122 2 for(p=0;p<8;p++)
123 2 str[p] = 0x00;
124 2 v_Get1302(&str);
125 2 copyOK = 1;
126 2 send();
127 2 break;
128 2
129 2 default:
130 2 return;
131 2 }
132 1 }
133
134 /***************************************主函数************************************/
135 main()
136 {
137 1 P0 = 0xff;
138 1 P2 = 0xff;
139 1 P1 = 0xff;
140 1 initial();
141 1
142 1 while(1){//主循环
143 2
144 2 if(re_finish){//接收完成
145 3 re_finish = 0;//清接收完标志
146 3 copyOK = 0;//清填充完标志
147 3 DispatchCmd();//执行命令
148 3 }
149 2 }
150 1 }
151
152 /**************************************结束***************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 269 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 1
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?