?? 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通信+數(shù)碼管顯示程序 */
-
-
4 /*功能: 在數(shù)碼管上顯示串口發(fā)過來的數(shù)字 */
-
5 /*難度等級: 高 */
-
6 /* 作者: zengrenliang */
7 /* 版權(quán): http://www.51kaifa.com */
8 /*編寫日期: 2006.05.19 */
-
-
9 /*****************************************************************/
10
11 #include <reg52.h>
12 #define uchar unsigned char
13
14 bit receive; //接收標(biāo)志
15 bit re_finish;//接收一串字符完成標(biāo)志
16 sbit lck = P3^5;//HC574鎖存信號
17 sbit LED = P1^3;//串口通信指示
18 sbit addr0 = P1^4;//系統(tǒng)片選地址線0
19 sbit addr1 = P1^5;//系統(tǒng)片選地址線1
20 sbit addr2 = P1^6;//系統(tǒng)片選地址線2
21 sbit addr3 = P1^7;//系統(tǒng)片選地址線3
22
23 uchar i,buffer[8];//串口緩沖區(qū)
24 uchar cash[8]; //數(shù)碼管顯示緩沖區(qū)
25 uchar sbuffer,number;//發(fā)送字符個數(shù)
26 uchar sendFINS ; //發(fā)送完成標(biāo)志
27 uchar copyOK , cmd_numb ;//發(fā)送緩沖區(qū)填充完成標(biāo)志
28
29 //數(shù)碼管位掃描數(shù)據(jù)
30 uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0--row7
31
32 //數(shù)碼管數(shù)字碼表
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); //延時函數(shù)聲明
39
40
41 /********************************系統(tǒng)初始化函數(shù)************************/
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; //緩沖區(qū)準備好標(biāo)志清零
57 1 receive = 0; //接收標(biāo)志清零
58 1 re_finish = 0; //接受完成標(biāo)志清零
59 1 cmd_numb = 0; //接受計數(shù)器清零
60 1 P1 = 0xb0; //RS485允許接收
61 1 for(j=0; j<8; j++) //串口緩沖區(qū)清空
62 1 buffer[j] = 17; //table[18]為空顯示
63 1 for(j=0; j<8; j++) //串口緩沖區(qū)清空
64 1 cash[j] = 17; //table[18]為空顯示
65 1 cash[0] = 15;
66 1 }
67
68
69 /************************向串口發(fā)送字符串*************************/
70
71 void send(void)
72 {
73 1 P1 = 0xf0;
74 1 if(copyOK) //串口準備好且緩沖區(qū)準備好
75 1 {
76 2 i = 0;
77 2 REN = 0; //發(fā)送過程中禁止接收數(shù)據(jù)
78 2 copyOK = 0; //清緩沖區(qū)準備好標(biāo)志
79 2 SBUF = cash[i++]; //發(fā)送字符串首字符
80 2 number = 7; //置發(fā)送計數(shù)器
81 2 }
82 1 else
83 1 return; //沒準備好則返回
84 1 }
85
86
87 /*****************************串口中斷響應(yīng)處理函數(shù)***********************/
88
89 void serial(void) interrupt 4
90 { uchar k;
91 1 if(RI)//為接收中斷
92 1 {
93 2 RI=0; //清接收中斷標(biāo)志
94 2 LED = ~LED; //閃串口指示LED
95 2 sbuffer = SBUF; //讀取串口緩沖區(qū)數(shù)據(jù)
96 2
97 2 if((sbuffer == 's') && (receive == 0)) //判斷是否為數(shù)據(jù)頭 ,是數(shù)據(jù)頭則準備接收
98 2 {
99 3 receive = 1; //開始接收標(biāo)志
100 3 cmd_numb = 0; //清接收計數(shù)器
101 3 re_finish = 0; //清接收完成標(biāo)志
102 3 }
103 2 else if(sbuffer == 'e') //判斷數(shù)據(jù)尾
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; //置接收完成標(biāo)志
109 3 receive =0; //清接收標(biāo)志
110 3 }
C51 COMPILER V7.06 SERIAL 06/19/2007 14:12:47 PAGE 3
111 2 else if(receive){ //判斷當(dāng)前是否處于接收狀態(tài)
112 3
113 3 buffer[cmd_numb++] = sbuffer-'0'; //當(dāng)前字符送緩沖區(qū)
114 3 }
115 2 else //無效命令則返回
116 2 return;
117 2 }
118 1 else{
119 2 TI=0; //為單個字符發(fā)送完中斷
120 2 if(!number) //字符串發(fā)送完
121 2 { REN = 1; //單片機允許接收
122 3 P1 = 0xbf; //RS485允許接收
123 3 }
124 2 else{ //字符串未發(fā)送完
125 3 SBUF = cash[i++]; //發(fā)送下一字符
126 3 number--; //發(fā)送字符數(shù)減一
127 3 }
128 2 }
129 1 }
130
131 /*****************************延時函數(shù)**********************/
132 void delay(unsigned int loop)
133 { unsigned int i ; //loop 為執(zhí)行空指令的次數(shù),改變它可一改變延時時長
134 1 for(i=0;i<loop;i++); //循環(huán)執(zhí)行空指令loop次,達到延時目的
135 1 }
136
137
138 /******************************數(shù)碼管顯示掃描*************************/
139
140 void ledscan()
141 { uchar i;
142 1
143 1 for(i=0;i<8;i++){
144 2 P2 = 0xff;//關(guān)閉所有數(shù)碼管
145 2 addr3 = 0;
146 2 addr0 = 0;
147 2 addr1 = 1;
148 2 addr2 = 0;//開發(fā)板上U4(74HC574)的片選地址
149 2 P0 =table[cash[i]]; //取一行顯示數(shù)據(jù)
150 2 addr3 = 1;
151 2 addr3 = 0;//在U4的11腳(鎖存信號)產(chǎn)生上升沿
152 2 P2 = scan[i];//取row0--row7行掃描數(shù)據(jù)
153 2 delay(50); //延時50us
154 2 }
155 1 }
156
157 /********************************主函數(shù)****************************/
158
159 main()
160 {
161 1 initial();
162 1 while(1){//主循環(huán)
163 2 if(re_finish){//把串口緩沖區(qū)的內(nèi)容送到顯示緩沖區(qū)
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;//接收完成標(biāo)志
C51 COMPILER V7.06 SERIAL 06/19/2007 14:12:47 PAGE 4
173 3 copyOK=1;//發(fā)送緩沖區(qū)填充完成標(biāo)志
174 3 send(); //把顯示緩沖區(qū)的內(nèi)容發(fā)送給電腦
175 3 }
176 2 ledscan(); //循環(huán)掃描數(shù)碼管
177 2 }
178 1 }
179 /**********************************結(jié)束****************************/
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)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -