EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
功能描述:通过虚拟串口输入A、B、C、D控制灯泡L1、L2的亮灭,项目文件。
7 [* l& ]3 M2 @图1 仿真图
5 g7 @+ B5 `/ l& h. A" p![]()
( e* f) G& P8 y A0 u W* d$ V
0 @6 B. P( D+ A2 Y8 T: B8 T7 H7 \第一步点击vspd.exe安装虚拟串口连接软件 ' @2 k1 J9 |8 f3 _
安装完成后打开如下图,选择试用就可以
O. v6 ], ^4 p+ W" n: G点击pair % R. k, H/ K. G k7 t, t
W$ _" Z# w% X) \ z6 K% b3 [找两个com口连接起来,数字不要太大要不protues中的串口找不到,设置完了不要关闭软件 第二步:在protues中配置串口,打开protues文件,点击串口 2 Y$ q/ R% z9 _) X9 l) @
设置如下 下一步点击com.exe配置PC串口 配置如下,其中端口根据你设置的去决定![]()
6 ]8 a; L8 ~6 V5 X3 D2 W6 `
) n7 s: O+ \' f( C* i) E# ]配置结束,在protues中点运行 在串口中发送区输入字母ABCBEF,点击手动发送观察实验现象 5 r2 \+ @( B: x0 y! s3 k! b
+ q4 Y% \& |# z4 I
) A4 V8 _- r8 T+ r9 L
* H, x" D! y) q0 c# L7 u0 c: ]" f+ C. D! C; `
单片机源程序如下:
- U6 A( ~9 S7 o3 q x
6 w4 B6 L7 I2 [0 B9 V- J1 d7 {/********************************************main.c********************************************/
/ H7 \' G8 u" J. g0 Y' e! j8 X4 c3 Y' m) d6 c2 p0 S" \
#include <reg51.h>
1 S0 d3 I. ]8 a9 z8 ]sbit led1 = P1^0;
2 ^- K2 F6 [0 @: W. U9 hsbit led2 = P1^1;- Q0 W1 w+ Z3 o
//初始化串口 (设置串口,开启串口中断)
T3 B/ Z9 ` m7 H C1 z4 X2 pvoid init_uart(void)/ o; P, h- {: \" g! ?. a
{
' i( j4 M2 [' { SCON = 0x50; // SCON: 方式 1, 8-bit, 允许接收数据& M% O( p6 l% z: I* U1 [
TMOD |= 0x20; // TMOD: 设置定时器1工作在方式2, 8-bit 自动重装
5 `, ^, g7 }8 L6 z* ?" `. x TH1 = 0xFD; // TH1: 初始值为0xFD 波特率:9600 晶振频率:11.0592MHz . i6 \3 H7 m: C: V6 v
TL1 = 0x0;
$ F. N3 }- ~4 r TR1 = 1; // TR1: 开启定时器1 + K8 }& a1 M, x
EA = 1; //打开总中断0 n: w4 c, T1 O" R( @# O' b7 O( o
ES = 1; //打开串口中断
+ f3 F) m) g& _, k8 k. `8 y} " z& W0 j* D0 \8 e
! m$ |& m! ?; s/ S- B. s9 R0 z2 n" f( d% m C
// 发送一个字节数据
0 g* I. k8 x4 p: z$ y. y- pvoid uart_send_byte(unsigned char dat)
! X. p l1 h9 \{- G h2 Z- k" B4 e
SBUF = dat; // 将数据送到发送缓冲寄存器SBUF,一位一位的发送! D4 R' c$ y+ }8 J* ~+ Y* Y/ h
while(!TI); // 等待发送完毕 (发送完毕TI硬件置1)9 H5 X$ v9 q7 I% t! @' f
TI = 0;// 将TI清零,表示可以发送下一字节数据。
7 V. f7 c1 a" S* C/ O8 }}
& Z. L9 r6 O9 g+ e4 k; F: ~/ `* \ u0 c* q5 ]5 n& ~9 @( p# u* ]
// 发送字符串7 [" A$ s" B3 p" [" p% O* ]
void uart_send_str(unsigned char *s)
0 _% W0 V& I0 _! Z5 K! I{$ e) j: ^! [! v
while(*s != '\0')// '\0':字符串结束标志9 ]7 x4 F5 o9 t5 c( Z& m
{4 X6 f1 l: v# H) W
uart_send_byte(*s);// 发送1个字节数据,1个字符占8位,1字节) i7 h6 [* |0 H/ u' i' Z
s++;// 指向下一个字符3 h$ i% @- | Y4 ^% g) D4 Z
}1 g4 a4 f: K7 P
}
' s- h7 [* J5 `; h; E- v
) L7 E# [) F8 A1 N2 v4 \. V( K, H' M" J n: H9 K6 g* A
// 串口中断处理函数 (串口接收到数据,发送数据完毕都可以引起串口中断)9 U5 E+ P! O: W# V
void uart_interrupt(void) interrupt 4 //也叫串行中断服务程序
8 x: ^4 m! Q5 v" }2 J{
9 [) ]" `, o$ \9 w: j2 [! s unsigned char recv_data;// 用来存放接收到的数据5 D, V, p( }8 S2 {# J
unsigned char send_data[] = "I received.\n";// 要发送的信息
/ c# ]* T( Z6 V, V , \8 U$ I$ d4 h! J2 D$ h& K+ O6 A
if(RI) //接收数据(1字节)完毕,RI会被硬件置1- D6 Z" F& M+ J2 L0 \/ _6 i
{
; c m [2 M$ q, L1 g RI = 0; // 将 接收中断标志位 清零(让串口可以继续接收数据)
: @+ Q0 k$ R( m( Y7 \% h$ P) @ recv_data = SBUF; //读取接收到的数据,并存放到data. q( m1 d* N0 t+ e! H, p
' ^) @% o7 _. j% s9 Q0 c
4 Y9 s" h* ?2 [, m6 g1 u if(recv_data == 'A')//如果收到的字符是'0',就让灯灭
( V; ]9 A5 z% a. U% {* u {6 B L* g# }/ i% Q( z) r
led1 = 0;// p1.0引脚低电平,LED灯亮' y6 z% e8 g: O6 _( d$ R
led2 =1 ;8 |2 p2 S/ P. J* h# l% w7 r
uart_send_str("A");7 i7 ]4 ^( w% p, Y" A4 j3 E
}. F7 ?6 u, y5 w L9 s ?
else if(recv_data == 'B')
) }* v: q# N( |9 q; \: ^ {, a9 t R3 |& T' g1 T& g
led1 = 1;// p1.0引脚高电平,LED灯灭
Y9 @2 M o% i% W! j) L led2 = 0;% D) \% t5 g4 ^' P* c
uart_send_str("B");) I0 p# [+ M' d3 h0 H( N8 v+ ~+ ^5 Z
}9 ]. }4 K. J) E+ N
else if(recv_data == 'C'). I; s. m- r% \2 Y* U
{
. ~0 k9 \/ l. E0 ^" k# M* q: [! R led1 = 0;// p1.0引脚高电平,LED灯灭
' B5 q9 X( k5 Q2 Y led2 = 0;1 W! X2 Q8 m( d" E" H( p
uart_send_str("C");
0 q+ o" `0 D7 q0 i* B! G6 H }
$ x/ b. K1 T3 F, g C/ l1 d else if(recv_data == 'D')
- C/ a! d. G1 w# I7 J& k {
6 M% U4 l8 j" s8 \ led1 = 1;// p1.0引脚高电平,LED灯灭
% |; d' B% v' u" ?" F led2 = 1;/ p4 ]* p% n9 ~, k( M; P) Q" S2 E' `
uart_send_str("D");. p* b* E$ O. ?% G% b
}
0 Q* _8 h2 A" l* q$ M" F8 [8 Z6 w else uart_send_str("E");
! J* q* ` ^! d- h* G/ W 7 a: v w, g7 r
- | D/ v0 z6 q. C6 b. t d# Z# Q* C0 f% B# a
# H, J) K$ i) S2 ]$ n
}
; l% j6 c6 L! j9 @ if(TI)// 发送数据(1字节)完毕1 L/ z- N" {# s# m
{$ Q* Y& e" c6 t ^
TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)4 P- W7 D9 _2 s" ?
}* B W8 `9 V; N6 [7 ]! d
}# {* E" [+ L$ t8 |* e- e6 Y6 \
4 W( n: d5 R0 pvoid main(void)* q) X: k! a, ~$ H1 Z; C
{
9 ]# G+ }" n% K+ T init_uart();// 初始化串口
: W/ j$ E& k' S1 ?7 D / Y2 I/ u3 ]4 G' j
while(1)// 主循环不做任何动作。(死循环) v3 c T! e/ M! s5 F
{}
+ b6 H" P. k2 Z6 B}5 B0 w3 U4 V( [
|