|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
RS232单片机串口实验0 _7 `/ |0 z9 o- o' c# n" |
( E; s6 o* y* b" f$ N
% d- w R g V0 i; u( l+ b0 Y; T
RS232串口实验,在附件里,一共有4个程序 分别实现4个不同的功能。' ^' I1 I( {0 e' {
( l5 `, l1 c/ X; o* ~) P0 e bLCD1602显示接收到HEX数据
( Y5 S; q& J/ `+ z数码管显示接收到的HEX数据
3 j& O0 _5 }3 W# v/ B返回接收到的数据
+ S6 c: n6 q/ t1 b; I, E1 q发送数据
9 l% i6 \# K- q$ n. ~/ G
" n1 Z; h8 y. H/ t, W0 m下面是数码管的那个源码:
+ n3 i: g! N' K- n$ w5 z; Y/*******************************************************************************
0 c; M) m9 j" h h* 4 s! K2 X9 p: V" x/ v
* 普中科技7 U- j; }( e" F8 W4 I& c6 U
--------------------------------------------------------------------------------
" T7 P) @- [7 H* 实 验 名 : RS232串口试验& J8 P3 _# n+ @" U5 f2 L6 Y
* 实验说明 : 单片机将串口接收到的数据以10进制显示在数码管上。
% B% t1 Q8 Y+ F" ]/ ]( J* 连接方式 : 见连接图7 t9 t) ~4 _7 k! h' |
* 注 意 :
- f+ S5 z% t" O$ Z0 D- W! v*******************************************************************************/
# E3 k: r9 n) W$ t2 B0 n$ D
. t/ h' Z) Q: \7 x0 U' K#include<reg51.h>
7 ~, B# ] A @ A" X3 W" J
3 H2 i+ {/ w2 ~/ O/ s' K3 A//--定义使用的IO--//1 F1 a/ ]5 K# }$ B: ]# z
#define GPIO_DIG P0
8 ^# C9 G: x% P2 t: E
- |$ a) P# @) c& Osbit LSA=P2^2;* n' n- E' K, I7 h4 f
sbit LSB=P2^3;
+ K/ e3 l; D9 z& r9 }% a: ysbit LSC=P2^4;
" C5 t6 z' t8 |8 V$ P6 [ \5 [! u5 _
//--定义全局变量--//. D& }& t" n+ T# G/ m% y
unsigned char code DIG_CODE[17]={' }. O* P5 ] o- P6 C
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,, a- f' O: h, t- D% U) n/ e8 N3 U, K
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};8 ?8 R9 _6 R0 e- i$ G
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
2 ~! M" F8 ~7 e( `+ F, tunsigned char DisplayData[8];) [6 u7 P6 N* z4 @
//用来存放要显示的8位数的值
# z( ^: Z" y# {
2 E2 M; J' v. c//--声明全局函数--//! P5 X. h: Q! ]9 l: P
void DigDisplay(); //动态显示函数
4 w' `8 }# F9 Jvoid UsartConfiguration();
8 @6 S- t% Q4 R @/ y; |: G+ g/ Q+ x! E/*******************************************************************************- Y2 W4 Z9 J" W! O# O4 F6 ^
* 函 数 名 : main
* |+ P' b" C6 A2 k5 V* 函数功能 : 主函数* G% H6 ]* E9 ~- I3 q4 i( K$ o9 o' W
* 输 入 : 无, B: c& r `/ q$ S5 b, w& `3 v
* 输 出 : 无, {6 |1 v5 Y, q$ Q9 U. E
*******************************************************************************/
/ m4 m' z5 j" w& i1 A Z- ]8 `7 b* }7 C$ v u5 i6 ^% `. Q& R5 ~
void main()
1 g h, s. D: d* ?4 X& _3 {0 ~1 Q{
~; m8 @* b0 k2 B; F V unsigned char receiveData;
# C; D# p( U; ~. h b
' {8 ^- D, `, E% f0 e7 X UsartConfiguration();
5 S3 {/ C* [% j/ P) b/ X8 c2 T while(1)' X" l9 w/ \* O1 F+ Q. n( j
{" M) h1 t) d" g R, A
if(RI == 1) //查看是否接收到数据
{7 v- ` K. k: U {
1 s2 L$ W0 q+ H/ u/ S4 l2 F" a receiveData = SBUF; //读取数据! x6 U( N, v" o$ X1 b
RI = 0; //清除标志位
' O& h; s9 N+ ]+ G
5 L; q, A5 w3 S* u //--因为一次接受只能接收到8位数据,最大为255,所以只用显示百位之后--//
8 H: d u* d9 |/ ? DisplayData[0] = 0x00;
7 I5 \5 u' v: p8 i6 b; d5 T' I DisplayData[1] = DIG_CODE[receiveData / 100]; // 百位
* D7 _. I) F# p+ Y( h DisplayData[2] = DIG_CODE[receiveData % 100 / 10]; // 十位1 d2 r f, R& Q) x5 n
DisplayData[3] = DIG_CODE[receiveData % 10]; // 个位1 B: x C$ R! Z6 K
DisplayData[4] = 0x00;$ B" a8 Q% ^$ E5 V7 x# ]) T d, C
DisplayData[5] = DIG_CODE[receiveData / 100]; // 百位
; r1 L$ d0 e4 n" B9 k. |9 ? DisplayData[6] = DIG_CODE[receiveData % 100 / 10]; // 十位
6 T6 O9 F' F# W) o Q DisplayData[7] = DIG_CODE[receiveData % 10];3 y5 {& C' k: q9 J4 X
}5 I. C3 i7 m# d' [$ X
DigDisplay();
' Y9 D$ _7 F( x% I }0 y8 p+ l% S) s6 a7 V; T- o3 R1 G
}
5 q6 r; v" C: ?8 j) Q7 K/*******************************************************************************, _0 w2 {& A' v5 R% R+ k9 y/ I
* 函 数 名 :UsartConfiguration()
1 L7 \- Z# E. }, {' d* 函数功能 :设置串口
, q. p# L1 K# h3 n* 输 入 : 无
8 V7 M* r. n. s. k% W9 t$ Z* 输 出 : 无9 T- {5 P: J* Q( \# R
*******************************************************************************/
9 `/ ^) [1 q" H% r- r+ U& G( Z+ ]0 m+ I3 Z) J
void UsartConfiguration()5 v5 H8 N9 F, i* E4 G( ]
{
+ w: z, ?. @- m: |, B SCON=0X50; //设置为工作方式1! d9 V4 e* R0 B4 e6 {. C8 V
TMOD=0X20; //设置计数器工作方式2
1 X+ m/ P3 D' e- V PCON=0X80; //波特率加倍
7 M" F) y8 x+ t) ~6 g6 e TH1=0XF3; //计数器初始值设置,注意波特率是4800的6 q9 V! z- L8 j9 u! t
TL1=0XF3;6 G4 `3 s7 I) u2 \- L! R6 w
TR1=1; //打开计数器
Y/ K' W; y4 @+ E}
2 | B. X' J& |4 o3 q/*******************************************************************************
/ {4 g' J$ U* N" g. J9 u* 函 数 名 : DigDisplay, {7 p$ {7 G& M8 f
* 函数功能 : 使用数码管显示6 ]- j0 t! e. P0 e3 G S a
* 输 入 : 无* C; j8 @2 R4 L0 d
* 输 出 : 无3 `2 B3 H0 o: B5 ^- S6 r
*******************************************************************************/ H9 J1 H+ ]9 @4 Z6 s- l
void DigDisplay()
9 M: |7 Y8 r! a. q$ l, @{
# S P$ L+ K, {: V; \* }. J unsigned char i;
2 [, [- J4 E- i7 } unsigned int j;
" S4 M$ i& j- X for(i=0;i<8;i++)8 ^9 I& \8 N; y: ?0 i+ H6 P& X
{# a; G2 S8 m' D$ R8 P
switch(i) //位选,选择点亮的数码管,
# S- s. k. `9 R1 V/ {% I {! J. c- O D5 j+ B* H
case(0):
$ Y; L& x7 }8 z) b9 U8 x4 j$ F2 k LSA=0;LSB=0;LSC=0; break;//显示第0位, g# N; N& f( W( F" d3 h
case(1):
3 X1 @7 q1 r8 T) r LSA=1;LSB=0;LSC=0; break;//显示第1位/ p3 K+ J. |- m3 x% ~% F
case(2):2 C2 ]" a/ R7 k, b) ~
LSA=0;LSB=1;LSC=0; break;//显示第2位
7 s' s1 H* l2 S# K% l0 M) j case(3):6 F+ I* S1 @# M+ G/ M7 @ d
LSA=1;LSB=1;LSC=0; break;//显示第3位& }; J0 Z( r2 X- i7 G- ?
case(4):
2 e( i& ]/ {) z! m- [ LSA=0;LSB=0;LSC=1; break;//显示第4位
! X& V% ^- ]% {5 |" E& \' o9 ] case(5):
! ^5 ~, z1 v/ m0 E1 f' e9 N LSA=1;LSB=0;LSC=1; break;//显示第5位 k# p1 |& ~: r: X3 |" H
case(6):
5 e( h8 i( z$ B. x1 I0 I* r LSA=0;LSB=1;LSC=1; break;//显示第6位" ~2 }( P$ E% c3 x
case(7):
2 w' _! B# L! O6 Y% G, w6 z# S LSA=1;LSB=1;LSC=1; break;//显示第7位 ) A c3 y, m3 t J0 J; b9 m
}$ h/ A' o" D" V* z" O3 [* J- A
GPIO_DIG=DisplayData;//发送段码* ^1 b9 g, q# N+ j
j=10; //扫描间隔时间设定
8 k& |: s, s6 ?, T( G while(j--);
# ?5 _6 x( e% B" a( l GPIO_DIG=0x00;//消隐0 Q+ ]% m+ J% w! \5 M6 x0 W7 Y
}
6 N* Q' p8 U) L6 h) ~8 z}
! X8 \% o$ T$ F( R
# l: T( S5 F; I, o% M下载:
: u7 _. n2 a6 M' U8 j+ Q$ b9 a4 `" x. l
; W7 L) K8 p7 R" w9 ?
|
|