|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
RS232单片机串口实验: z! O* O0 O. z: o7 n- N5 M( O
+ d6 Q3 `7 L* G6 s7 g, Z# w9 u2 ?$ e. C7 }# B$ p6 q8 Q
RS232串口实验,在附件里,一共有4个程序 分别实现4个不同的功能。! k* F1 y7 l8 k9 a- n) Z0 i" Q
, I& _7 D: S0 O" |- m) \3 N. NLCD1602显示接收到HEX数据* Q8 o: P* d: ?1 r8 r) Q) u& g. M
数码管显示接收到的HEX数据4 W2 d" T) x! Y$ R
返回接收到的数据/ V' o. q# v. e: c
发送数据 5 g! A$ D: G; @
7 |/ J) p* s3 W' j5 L
下面是数码管的那个源码:1 I" h) @/ Q4 ^3 z. S
/*******************************************************************************4 [: D! e& S+ L- ?& F( e% M% O- H3 E
*
/ t+ P8 Y( l3 ?; I1 G* 普中科技
/ w) A& c7 v/ P# ?, ]--------------------------------------------------------------------------------
! A1 ~, T+ M4 b k! G& ~6 z* 实 验 名 : RS232串口试验
- C; {& c$ A5 A; N B0 B* G' B* 实验说明 : 单片机将串口接收到的数据以10进制显示在数码管上。( I. c( \9 n8 N7 W* a* B& ^
* 连接方式 : 见连接图
( q3 r% {. X! N. ^9 k& r" \% @) x* 注 意 :
# w- ^6 M- N& m( r1 V( U*******************************************************************************/% A3 ?" B6 D0 i, v
, @9 D1 M; o' e* A& ~# O
#include<reg51.h>( j8 {' V& ?. C) p& Y0 f: Q
e! W8 X$ V7 a5 A7 Y3 j//--定义使用的IO--//+ @; d8 m# @* h* z
#define GPIO_DIG P0
1 M$ n/ J; E3 x( I5 P# W6 l/ ?1 A' D7 M1 T }/ G: l- b6 E
sbit LSA=P2^2;
5 Q' [( k% {9 B" x* L- esbit LSB=P2^3;4 B% ~( y* [/ Y- ?
sbit LSC=P2^4;
1 R) U# f. \( k4 F
. m' t, D" J5 M" u//--定义全局变量--//; @( y3 Y$ X3 ?7 p; [0 }
unsigned char code DIG_CODE[17]={3 l2 {7 c5 W! v0 d3 C
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,) @0 @$ I' |5 ~! b+ ^5 @
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
6 O# C( ?4 R. P3 f9 [# h0 T' ]. r1 a//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码9 f d6 ^; t L: Z X9 C
unsigned char DisplayData[8];
" t6 Y) @, j* ?6 E/ u- H; I* F) b//用来存放要显示的8位数的值
% y) I# A; {4 r$ w9 H! T$ r2 I$ i' F. F
//--声明全局函数--//' u- y* d) _* ?8 X( \( a: u0 r
void DigDisplay(); //动态显示函数 7 v; y6 [4 J, b) O% L/ z$ M
void UsartConfiguration();3 w# a1 v/ ?9 L! `1 G
/*******************************************************************************0 A9 |' w7 w4 V& e! I" y
* 函 数 名 : main
6 d3 X9 D f7 A0 t3 x0 q* 函数功能 : 主函数
! G V+ z6 y& T' c* 输 入 : 无
! o. r2 v. O0 k8 l5 U/ q* 输 出 : 无$ |; k6 {# k7 [2 U
*******************************************************************************/
- e- U' |1 ?" i& J9 c" e$ h( ?* L$ Y
. b0 J/ L; D! v' ^' kvoid main()
- [9 s( e5 L' N{
/ s) ~. L; k: l" p) a8 ]! `" b8 ^ unsigned char receiveData;
p. T5 z8 P! q5 w! N4 g7 P
7 V/ s* r n$ g; r) Y- |% g' r UsartConfiguration();5 F4 s( o2 I' J+ W! J% O
while(1)
" s4 R+ t1 K( I% ?- E {
$ o6 e% B8 ~) V: W3 g# q if(RI == 1) //查看是否接收到数据
% i/ r' w+ w0 h | {
7 w& r; M @# V, F: T receiveData = SBUF; //读取数据, x1 S M2 X w7 s8 m1 ]
RI = 0; //清除标志位4 x- s+ c6 C* {, E% n
1 Y$ `- O! z% ]' J/ X% Q( |4 w //--因为一次接受只能接收到8位数据,最大为255,所以只用显示百位之后--//
1 b/ `2 A U# h" J5 a DisplayData[0] = 0x00;
% u* F7 k- C6 B$ F) t0 j) f0 I- E DisplayData[1] = DIG_CODE[receiveData / 100]; // 百位
1 f7 I: D6 w% ?$ t _3 ?( F DisplayData[2] = DIG_CODE[receiveData % 100 / 10]; // 十位3 B7 y1 S4 \$ L2 R& Y
DisplayData[3] = DIG_CODE[receiveData % 10]; // 个位
1 E8 U G+ S' c7 e" p( ^' ? DisplayData[4] = 0x00;7 l/ N9 _& x& a& j% f" s; ?5 m
DisplayData[5] = DIG_CODE[receiveData / 100]; // 百位. ~3 Q' Y2 |% d% Y
DisplayData[6] = DIG_CODE[receiveData % 100 / 10]; // 十位
0 ~: G9 u8 y% y I" | DisplayData[7] = DIG_CODE[receiveData % 10];
1 R$ t0 E0 i( U/ b2 ?: a2 j }
3 i9 R {) \! r% b8 f DigDisplay();
1 ^" c) Q# E _ }0 c5 m! O4 P& j* M' J, O0 ?: R9 j
}$ R; e, `" t4 V" A9 l2 J
/*******************************************************************************
2 f, N* t! X* n% b* 函 数 名 :UsartConfiguration()5 e# t: O& \; T* D5 \
* 函数功能 :设置串口
7 R9 G3 _0 \9 P* 输 入 : 无) ?: C% a" P k. t H/ u0 _' V
* 输 出 : 无
6 s& c' g/ ^$ M$ `+ y*******************************************************************************/
; {9 @9 A# f$ Y3 h! j7 Q7 z1 t; y- I8 s# b8 c
void UsartConfiguration()# f D& J) A) y5 }* j& I
{; I# F' ]/ _! J. @2 F
SCON=0X50; //设置为工作方式1( P4 S# ?( l$ z! z+ f
TMOD=0X20; //设置计数器工作方式29 ]7 x, ]2 H0 U3 @) q. g
PCON=0X80; //波特率加倍
* T4 z3 Y$ d, v& x; H' j3 w3 i TH1=0XF3; //计数器初始值设置,注意波特率是4800的( s6 l8 |3 n9 O: B
TL1=0XF3;7 l; |# K7 o( {: _1 C4 \8 T7 e
TR1=1; //打开计数器
, U7 S$ f) m2 g}( B, n- [$ \1 H- W/ J% ^% \
/*******************************************************************************
1 W0 D/ l- H. F( t% `* 函 数 名 : DigDisplay; r' x( m. U: k3 }+ g: w7 X& u
* 函数功能 : 使用数码管显示
/ e& J: @8 ~- @% Z0 ]+ d- J9 S* 输 入 : 无
$ {. d( g0 e! x7 y# h1 k* 输 出 : 无
, u3 y7 |. Q" Q' d*******************************************************************************/
3 e6 z0 _9 S1 Xvoid DigDisplay()
- G: e( y0 o+ c! p7 S; z7 v{% ?( Q, d0 g+ W# [, O$ D9 \" y0 w. T. {
unsigned char i;& q8 l1 K3 f6 x; G
unsigned int j;
" x7 ^9 O" c$ J' Q6 d for(i=0;i<8;i++)
: @ p* ~! u9 m# z; a2 y! w {3 h9 @( O& e6 S; |) ]; T; p
switch(i) //位选,选择点亮的数码管,
9 }6 v2 b; q' e5 t' k9 S {$ T0 I) L) S7 V5 V9 U( A9 s% Q
case(0):8 a; Y' {) [; C# [3 C! m; a
LSA=0;LSB=0;LSC=0; break;//显示第0位
% y/ w! C+ I/ r8 _9 [% [2 I case(1):
n) Q ~4 B$ v- n9 c LSA=1;LSB=0;LSC=0; break;//显示第1位
& f: h+ ~& {& v; A2 z5 _ case(2):9 W% X- s, q, }- h% C
LSA=0;LSB=1;LSC=0; break;//显示第2位
# ~& @, z; n0 i. Y" D8 c% o case(3):4 N% H4 e1 |7 z$ G' a
LSA=1;LSB=1;LSC=0; break;//显示第3位
) ~1 t @# K. Q' k case(4):
$ {# W( A" P1 E" Q7 D% Y5 ~. A LSA=0;LSB=0;LSC=1; break;//显示第4位! j5 |' H( P6 v& x9 [
case(5):
4 m) i* M% C7 S2 Z5 D1 I LSA=1;LSB=0;LSC=1; break;//显示第5位- S4 f+ d* h( y) @0 V9 M
case(6):
2 k0 N. E. O) |( I6 z5 l LSA=0;LSB=1;LSC=1; break;//显示第6位
. i* t$ W2 f f case(7):
, ^, F9 r1 _- N: E LSA=1;LSB=1;LSC=1; break;//显示第7位 ( ]# S" d/ I. m8 R" \
}" _" R6 c. p K0 U6 h. O
GPIO_DIG=DisplayData;//发送段码) V* b, B: J1 z e: V F3 k* s/ H1 y
j=10; //扫描间隔时间设定
& Y2 b. l/ k4 d# B while(j--); 3 g- V9 M& U4 D7 z, E
GPIO_DIG=0x00;//消隐
' |5 J& D& d; e( o+ S1 o; T: M }1 ]3 W; Z6 A# Z% d5 O$ H1 z
}
- y3 B7 T, v) V1 L% H4 @2 s8 c' h. U; h$ M
下载:
5 q V* E' G: ]0 _6 i* ?$ |& R0 O# Y
$ \ {" @5 c, s# n( K |
|