EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
功能描述:通过虚拟串口输入A、B、C、D控制灯泡L1、L2的亮灭,项目文件。
# E r3 q# l4 a$ V) C5 C3 C图1 仿真图
1 v. z; \7 ?" ]% Z) Q% j- E + P. h$ f4 W( R* X
$ t# g2 {7 i3 z5 w0 d第一步点击vspd.exe安装虚拟串口连接软件
6 ?2 Z- X+ G" d( S! |安装完成后打开如下图,选择试用就可以
4 B3 O9 J7 v# A% ]+ D点击pair * m+ i4 L' a% m S8 J
3 }/ N1 P* P/ V* E0 S* \
找两个com口连接起来,数字不要太大要不protues中的串口找不到,设置完了不要关闭软件 第二步:在protues中配置串口,打开protues文件,点击串口
' j8 N& n8 Q5 N- L设置如下 下一步点击com.exe配置PC串口 配置如下,其中端口根据你设置的去决定![]() / U' L4 o; c8 M0 B
0 l( z: ~& q4 H) x r
配置结束,在protues中点运行 在串口中发送区输入字母ABCBEF,点击手动发送观察实验现象 : k: M& U. S( r9 B- `5 m
) D8 s F) I' r5 r
' M: D( b. d; `3 \) w! S* W: q& f8 Q
% ~2 Y2 N3 t9 J. y4 G! A# G
+ E& a+ t4 j9 a
/********************************************main.c********************************************/- Z( Z' \6 v! R3 G3 K! s+ ?+ b
) r6 Q" @# H& J
#include <reg51.h>2 G, E. v' ]% \+ N+ P
sbit led1 = P1^0;2 D+ z+ n* I9 N# z$ E
sbit led2 = P1^1;" u3 z. J; V2 O2 E+ T
//初始化串口 (设置串口,开启串口中断)2 G4 X) a( ~% y1 l5 X
void init_uart(void)2 J1 f N! k: g+ X
{
5 V! W, j2 l' q) w% O1 B) v SCON = 0x50; // SCON: 方式 1, 8-bit, 允许接收数据
9 n6 d5 l1 Q6 K3 | TMOD |= 0x20; // TMOD: 设置定时器1工作在方式2, 8-bit 自动重装: [6 O# w1 K9 V: |, l3 s8 h
TH1 = 0xFD; // TH1: 初始值为0xFD 波特率:9600 晶振频率:11.0592MHz
3 y% i( q9 _0 X. B$ {3 v TL1 = 0x0;+ J- S0 q( I) H) I4 L4 b' j
TR1 = 1; // TR1: 开启定时器1 / u. K+ b. v* u' D9 `
EA = 1; //打开总中断
Y# d# Q, e o6 s ES = 1; //打开串口中断
% x' X f+ ~( u" L& _( c} + i/ R$ y" Y; v6 S
9 n+ G+ u7 v/ M7 q
4 U8 `# m9 e2 Z$ V% U" u// 发送一个字节数据. V) |; v# v/ d2 q
void uart_send_byte(unsigned char dat)- p" p8 Q6 @/ h9 E
{6 y7 L7 L# W h+ T' u
SBUF = dat; // 将数据送到发送缓冲寄存器SBUF,一位一位的发送! N5 z! ^( V7 l: L8 p$ r T
while(!TI); // 等待发送完毕 (发送完毕TI硬件置1)
; I( s% F3 C- K TI = 0;// 将TI清零,表示可以发送下一字节数据。
. h% h. _* Y( m! j( e$ t}
5 H# w5 ?: P/ ^* S' C6 R J' C
// 发送字符串
6 Z. I" ~1 L5 ]* ^8 [void uart_send_str(unsigned char *s)( [$ S+ m' g8 n4 t
{3 e5 t( Z! Q! t1 n. P( N4 n
while(*s != '\0')// '\0':字符串结束标志/ }4 p+ k9 |; v! F. M
{
& }( D0 h+ R# \2 j uart_send_byte(*s);// 发送1个字节数据,1个字符占8位,1字节# Y m7 n7 d7 C
s++;// 指向下一个字符* r3 G5 m9 F4 m
}+ _2 z& z4 r. r1 p" l
}
( N4 s5 {3 }5 |. S3 G- u/ ?1 m! M }6 r' j- P
4 A" O& M# h* ^2 V6 _// 串口中断处理函数 (串口接收到数据,发送数据完毕都可以引起串口中断); U; X0 _- p* E1 x! W) y% b3 |
void uart_interrupt(void) interrupt 4 //也叫串行中断服务程序3 Q5 W4 D+ H y5 y) F
{/ R5 a, v2 v+ O; Y- `
unsigned char recv_data;// 用来存放接收到的数据
/ ~5 F5 o2 I8 h% M z# t unsigned char send_data[] = "I received.\n";// 要发送的信息
# T, R0 e" S$ r3 s, I / V K2 q; ]3 [/ e* z
if(RI) //接收数据(1字节)完毕,RI会被硬件置1
4 A, l# ~! p/ _ {7 {1 F$ U+ z+ g6 r3 x1 ?
RI = 0; // 将 接收中断标志位 清零(让串口可以继续接收数据)6 M2 L7 d4 Z8 o. H
recv_data = SBUF; //读取接收到的数据,并存放到data6 {! [- Y ~$ y2 y) c& z. r$ ?4 P
: ]! ?7 L0 M6 _ 0 @# X/ k; N, I3 b& U2 u& M
if(recv_data == 'A')//如果收到的字符是'0',就让灯灭4 t: H7 K5 \' t. s# ]
{
8 r* z3 u! {) |0 r Q) _ w( K led1 = 0;// p1.0引脚低电平,LED灯亮
, w0 y4 q# C# M3 n6 n. b( L; E _ led2 =1 ;
: u; z8 `. d7 \ uart_send_str("A");3 U, T8 E0 V6 ~4 w4 o+ Y g; d }
}' @0 Y# n }# u) F1 {0 U* V5 j
else if(recv_data == 'B')
$ q& Z. s" v |9 k# D( ~, {) l {
, U; p# j+ x- {# u led1 = 1;// p1.0引脚高电平,LED灯灭; v' V! s9 ]# V( b. h8 `5 z8 u
led2 = 0;
+ X" y. |$ i0 T1 ?& v% T uart_send_str("B");
) l/ N/ E2 k9 y6 \! K }
% \+ \; f/ Y) r5 E! C else if(recv_data == 'C')
* c8 K/ D% h0 L {2 A( j* r r6 Y
led1 = 0;// p1.0引脚高电平,LED灯灭
% t5 @0 S% w1 {* z) k( |% T led2 = 0;
( A9 [2 c" ?! b& }- _, Q2 Z% f uart_send_str("C");
* W* j# `$ t+ j! e# }% {3 m' W } `0 p: Q+ D# b# _0 e) D9 E
else if(recv_data == 'D')
! A3 j" `9 i1 T$ Z0 v4 | `& V/ i$ ? {
# P& H8 J- l- i1 r& v s9 @/ R led1 = 1;// p1.0引脚高电平,LED灯灭0 w% Q: Z1 o# ^5 r: C7 e: P
led2 = 1;0 S0 U' }8 {! O6 u) e# R, f" j
uart_send_str("D");$ ~5 j, y( D! {) ~8 W7 b
}
+ k9 C* `1 _ U9 l- S! S/ j else uart_send_str("E");' X$ D" Z. k1 r+ S9 G$ z Q
2 e& u }" f$ I* j2 _0 L }( K# p" k
% `2 o4 H$ S+ N+ h& h
( o( ~# f" y5 v% H9 [5 v3 l , N! z! y. G i8 Z; {; c
}
9 T/ k) \) }0 b; R if(TI)// 发送数据(1字节)完毕
, L: d+ S0 s) ^- F7 ]3 @ {
: g+ Q9 K1 e, O+ T# e( u' e TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)+ F. L& S h$ D& E+ ]9 R. W: A9 M0 Q
}* X4 U8 x1 l/ k* x5 p! ?& j' s
}
1 ?( d- I; E9 D4 q& w! G a* n9 n% c6 `& H
void main(void)* N+ T2 c+ X2 y1 L1 P
{$ Y! x7 i- o. W$ q9 s+ T
init_uart();// 初始化串口
/ V& W5 y) y& p- P
" M/ p. L) u; A! a while(1)// 主循环不做任何动作。(死循环); U, M# W) E2 V6 |6 t6 D
{}
; u; k2 U; J, W2 U/ W}
+ v* W% D& u4 y/ c& C3 ~ |