📄 serial.lst
字号:
C51 COMPILER V7.06 SERIAL 06/19/2007 14:12:47 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE serial.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************************************/
2 /* */
-
3 /*名称: RS232通信+数码管显示程序 */
-
-
4 /*功能: 在数码管上显示串口发过来的数字 */
-
5 /*难度等级: 高 */
-
6 /* 作者: zengrenliang */
7 /* 版权: http://www.51kaifa.com */
8 /*编写日期: 2006.05.19 */
-
-
9 /*****************************************************************/
10
11 #include <reg52.h>
12 #define uchar unsigned char
13
14 bit receive; //接收标志
15 bit re_finish;//接收一串字符完成标志
16 sbit lck = P3^5;//HC574锁存信号
17 sbit LED = P1^3;//串口通信指示
18 sbit addr0 = P1^4;//系统片选地址线0
19 sbit addr1 = P1^5;//系统片选地址线1
20 sbit addr2 = P1^6;//系统片选地址线2
21 sbit addr3 = P1^7;//系统片选地址线3
22
23 uchar i,buffer[8];//串口缓冲区
24 uchar cash[8]; //数码管显示缓冲区
25 uchar sbuffer,number;//发送字符个数
26 uchar sendFINS ; //发送完成标志
27 uchar copyOK , cmd_numb ;//发送缓冲区填充完成标志
28
29 //数码管位扫描数据
30 uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0--row7
31
32 //数码管数字码表
33
34 uchar code table[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//0,1,2,3,4,5
35 0x82,0xf8,0x80,0x90,0x88,0x83,//6,7,8,9,a,b
36 0xc6,0xa1,0x86,0x8e,0xbf,0xff};//c,d,e,f,-,空格
37
38 void delay(unsigned int loop); //延时函数声明
39
40
41 /********************************系统初始化函数************************/
42
43 void initial(void)
44 { uchar j;
45 1
46 1
47 1 SCON=0x50; //串口工作方式1,允许接收
48 1 PCON=0x80; //波特率翻倍
C51 COMPILER V7.06 SERIAL 06/19/2007 14:12:47 PAGE 2
49 1 TCON=0;
50 1 TMOD=0x26; //T1用于串口波特率控制
51 1 TL1=0xfa; //初始化T1,波特率为9600(晶振11.0592M)
52 1 TH1=0xfa;
53 1 TR1=1; //开定时器
54 1 EA=1; //开总中断
55 1 ES=1; //开串口中断
56 1 copyOK = 0; //缓冲区准备好标志清零
57 1 receive = 0; //接收标志清零
58 1 re_finish = 0; //接受完成标志清零
59 1 cmd_numb = 0; //接受计数器清零
60 1 P1 = 0xb0; //RS485允许接收
61 1 for(j=0; j<8; j++) //串口缓冲区清空
62 1 buffer[j] = 17; //table[18]为空显示
63 1 for(j=0; j<8; j++) //串口缓冲区清空
64 1 cash[j] = 17; //table[18]为空显示
65 1 cash[0] = 15;
66 1 }
67
68
69 /************************向串口发送字符串*************************/
70
71 void send(void)
72 {
73 1 P1 = 0xf0;
74 1 if(copyOK) //串口准备好且缓冲区准备好
75 1 {
76 2 i = 0;
77 2 REN = 0; //发送过程中禁止接收数据
78 2 copyOK = 0; //清缓冲区准备好标志
79 2 SBUF = cash[i++]; //发送字符串首字符
80 2 number = 7; //置发送计数器
81 2 }
82 1 else
83 1 return; //没准备好则返回
84 1 }
85
86
87 /*****************************串口中断响应处理函数***********************/
88
89 void serial(void) interrupt 4
90 { uchar k;
91 1 if(RI)//为接收中断
92 1 {
93 2 RI=0; //清接收中断标志
94 2 LED = ~LED; //闪串口指示LED
95 2 sbuffer = SBUF; //读取串口缓冲区数据
96 2
97 2 if((sbuffer == 's') && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
98 2 {
99 3 receive = 1; //开始接收标志
100 3 cmd_numb = 0; //清接收计数器
101 3 re_finish = 0; //清接收完成标志
102 3 }
103 2 else if(sbuffer == 'e') //判断数据尾
104 2 {
105 3 if(cmd_numb<8)//接收到的字符少于8个
106 3 for(k=cmd_numb;k<8;k++)//则空位填空显示
107 3 buffer[k] = 17;
108 3 re_finish = 1; //置接收完成标志
109 3 receive =0; //清接收标志
110 3 }
C51 COMPILER V7.06 SERIAL 06/19/2007 14:12:47 PAGE 3
111 2 else if(receive){ //判断当前是否处于接收状态
112 3
113 3 buffer[cmd_numb++] = sbuffer-'0'; //当前字符送缓冲区
114 3 }
115 2 else //无效命令则返回
116 2 return;
117 2 }
118 1 else{
119 2 TI=0; //为单个字符发送完中断
120 2 if(!number) //字符串发送完
121 2 { REN = 1; //单片机允许接收
122 3 P1 = 0xbf; //RS485允许接收
123 3 }
124 2 else{ //字符串未发送完
125 3 SBUF = cash[i++]; //发送下一字符
126 3 number--; //发送字符数减一
127 3 }
128 2 }
129 1 }
130
131 /*****************************延时函数**********************/
132 void delay(unsigned int loop)
133 { unsigned int i ; //loop 为执行空指令的次数,改变它可一改变延时时长
134 1 for(i=0;i<loop;i++); //循环执行空指令loop次,达到延时目的
135 1 }
136
137
138 /******************************数码管显示扫描*************************/
139
140 void ledscan()
141 { uchar i;
142 1
143 1 for(i=0;i<8;i++){
144 2 P2 = 0xff;//关闭所有数码管
145 2 addr3 = 0;
146 2 addr0 = 0;
147 2 addr1 = 1;
148 2 addr2 = 0;//开发板上U4(74HC574)的片选地址
149 2 P0 =table[cash[i]]; //取一行显示数据
150 2 addr3 = 1;
151 2 addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
152 2 P2 = scan[i];//取row0--row7行扫描数据
153 2 delay(50); //延时50us
154 2 }
155 1 }
156
157 /********************************主函数****************************/
158
159 main()
160 {
161 1 initial();
162 1 while(1){//主循环
163 2 if(re_finish){//把串口缓冲区的内容送到显示缓冲区
164 3 cash[0] = buffer[0];
165 3 cash[1] = buffer[1];
166 3 cash[2] = buffer[2];
167 3 cash[3] = buffer[3];
168 3 cash[4] = buffer[4];
169 3 cash[5] = buffer[5];
170 3 cash[6] = buffer[6];
171 3 cash[7] = buffer[7];
172 3 re_finish = 0;//接收完成标志
C51 COMPILER V7.06 SERIAL 06/19/2007 14:12:47 PAGE 4
173 3 copyOK=1;//发送缓冲区填充完成标志
174 3 send(); //把显示缓冲区的内容发送给电脑
175 3 }
176 2 ledscan(); //循环扫描数码管
177 2 }
178 1 }
179 /**********************************结束****************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 328 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 ----
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -