📄 uart.lst
字号:
C51 COMPILER V7.01 UART 06/30/2007 11:42:50 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN UART.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE UART.c LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <string.h>
2 #include <stdio.h>
3 #include "uart.h"
4 #include "menu.h"
5 #include "Lcd.h"
6 #include "system.h"
7
8 #define MAXLEN 2000 //Uart接收数据区
9 char xdata Mydata[MAXLEN];
10
11 char *USP; //Uart发送字符串指针
12 char UBUSY; //Uart发送忙标志位
13 char xdata *URP=Mydata; //Uart接收指针,指向数据接受区
14
15 ////////////////////////////////////////////////////////////////////////////////////////////////
16
17 //串口模块参数设置菜单
18 char code *UartConfigMenu={"(10,2)串口传输实验参数设置,(6,60)波特率设置: ,1200,2400,4800,9600,\
19 19200,28800,57600,115200,(6,90)显示方式: ,字符,十六进制,(6,120)数据返回: ,打开,关闭,"};
20
21 //串口模块参数默认值
22 unsigned char UartParaList[]={3,0,0};
23
24 ////////////////////////////////////////////////////////////////////////////////////////////////
25 void Hexprintf(unsigned char x,unsigned char y, char *ptr) //以十六进制显示*ptr
26 {
27 1 unsigned char temp;
28 1 unsigned int low,high;
29 1 char buf[10];
30 1 temp=*ptr;
31 1 high=temp/16;
32 1 low=temp%16;
33 1 sprintf(buf,"%X%X%s",high,low," \0");
34 1 tprintf(x,y,buf);
35 1 if (X>=39)
36 1 {
37 2 X=0;
38 2 Y+=16;
39 2 }
40 1 }
41
42 void UartSend(char *ptr) //通过UART发送指定字符串
43 {
44 1 char SFRPAGE_SAVE;
45 1 SFRPAGE_SAVE=SFRPAGE;
46 1 SFRPAGE=UART0_PAGE;
47 1 USP=ptr;
48 1 TI0=1;
49 1 SFRPAGE=SFRPAGE_SAVE;
50 1 }
51
52 void inter() interrupt 4
53 {
54 1 if (TI0) //发送USP指向字符
55 1 {
C51 COMPILER V7.01 UART 06/30/2007 11:42:50 PAGE 2
56 2 TI0 = 0;
57 2 if(*USP!='\0')
58 2 {
59 3 SBUF0 = *USP;
60 3 USP++;
61 3 }
62 2 else
63 2 {
64 3 UBUSY=0;
65 3 }
66 2 }
67 1 if (RI0) //将数据保存到数据接收区
68 1 {
69 2 RI0 = 0;
70 2 if( URP-Mydata < MAXLEN-1 )
71 2 {
72 3 *URP = SBUF0;
73 3 URP++;
74 3 }
75 2 }
76 1 }
77
78 void uart_port_ini(void)
79 {
80 1 SFRPAGE = 0x0F;
81 1 XBR0 |= 0x04; //Uart引出到管脚:Tx到P0.0;Rx到P0.1
82 1 XBR2 |= 0x40; //弱上拉全局允许,交叉开关使能
83 1 P0MDOUT |= 0x01;
84 1 IE |= 0x90;
85 1 }
86
87 void uart_ini(unsigned char Sel_Baud)
88 {
89 1 SFRPAGE = 0x00;
90 1 SSTA0 = 0x10; //选择T1作为时钟源,禁止波特率2分频
91 1 SCON0 = 0x50; //Uart工作在方式1:8位可变波特率.忽略停止位.接受允许.
92 1 CKCON = 0x00; //sys/12 -> T1
93 1 TMOD |= 0x20; //T1工作方式:自动再装入8位定时器
94 1 //波特率设置
95 1 switch (Sel_Baud)
96 1 { // 波特率设置=256-22.1184M/12/16/Baud
97 2 case 0: TH1 = 160; break; // 1200
98 2 case 1: TH1 = 208; break; // 2400
99 2 case 2: TH1 = 232; break; // 4800
100 2 case 3: TH1 = 244; break; // 9600
101 2 case 4: TH1 = 250; break; // 19200
102 2 case 5: TH1 = 252; break; // 28800
103 2 case 6: TH1 = 254; break; // 57660
104 2 case 7: TH1 = 255; break; // 115200
105 2 }
106 1 TL1 = TH1;
107 1 TR1 = 1;
108 1 }
109
110 //串口模块函数
111 void Uart()
112 {
113 1 char *p[20]; //记录每页显示的起始地址,支持最多20页显示
114 1 unsigned char currentp; //记录当前页号
115 1 char xdata *DSP; //显示指针
116 1 unsigned char Disflag; //显示接收数据标志位
117 1 unsigned int RCounter; //记录接收字节数
C51 COMPILER V7.01 UART 06/30/2007 11:42:50 PAGE 3
118 1 char SFRPAGE_SAVE; //保存SFR值
119 1
120 1 if(MenuActive(UartConfigMenu, UartParaList)==0) //放弃菜单设置,直接退出
121 1 return ;
122 1 uart_port_ini();
123 1 uart_ini(UartParaList[0]);
124 1 UartSend("C8051f124 UART ready!!");
125 1
126 1 SFRPAGE=0x0F;
127 1 Udprintf(0,208," 波特率: ");
128 1 switch (UartParaList[0])
129 1 {
130 2 case 0: Udprintf(10,208,"1200"); break;
131 2 case 1: Udprintf(10,208,"2400"); break;
132 2 case 2: Udprintf(10,208,"4800"); break;
133 2 case 3: Udprintf(10,208,"9600"); break;
134 2 case 4: Udprintf(10,208,"19200"); break;
135 2 case 5: Udprintf(10,208,"28800"); break;
136 2 case 6: Udprintf(10,208,"57600"); break;
137 2 case 7: Udprintf(10,208,"115200"); break;
138 2 }
139 1 dprintf(26,224,"暂停 清空 退出");
140 1 Key[6].pressed=1; //进行初始化
141 1
142 1 while(1)
143 1 {
144 2 if(Key[6].pressed==1) //检测到清空键
145 2 {
146 3 int i;
147 3 Clear(0,208);
148 3 currentp=0;
149 3 DSP=Mydata;
150 3 URP=Mydata;
151 3 USP=Mydata;
152 3 Disflag=1;
153 3 RCounter=0;
154 3 for(i=0;i<20;i++)
155 3 p[i]=Mydata;
156 3 for(i=0;i<MAXLEN;i++)
157 3 Mydata[i]='\0';
158 3 X=0;
159 3 Y=0;
160 3 dprintf(1,224," ");
161 3 dprintf(6,224," ");
162 3 dprintf(26,224,"暂停");
163 3 Udprintf(20,208,"接收字节数: 0 ");
164 3 SFRPAGE_SAVE=SFRPAGE;
165 3 SFRPAGE=UART0_PAGE;
166 3 REN0=1; //接受允许
167 3 SFRPAGE=SFRPAGE_SAVE;
168 3 Key[6].pressed=0;
169 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -