EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
功能描述:通过虚拟串口输入A、B、C、D控制灯泡L1、L2的亮灭,项目文件。
( f9 z! x5 U% f1 R3 D/ W! [图1 仿真图, l$ P+ M9 J* j7 A# |1 \7 [
![]()
* B x! A: y9 P
, M! H# ]9 R* {. I第一步点击vspd.exe安装虚拟串口连接软件
/ U F0 J9 i, d: O安装完成后打开如下图,选择试用就可以
5 K% I& n4 V- t/ J* W3 Y点击pair
; Z1 g, H& @, R6 I' n! M6 X u0 J, s% x1 ^: O y9 n# N
找两个com口连接起来,数字不要太大要不protues中的串口找不到,设置完了不要关闭软件 第二步:在protues中配置串口,打开protues文件,点击串口
6 s* w) S B8 W3 J设置如下 下一步点击com.exe配置PC串口 配置如下,其中端口根据你设置的去决定![]() 1 I/ X( O/ i0 V, T6 d8 D
9 ^ k' b: y9 O1 c2 x
配置结束,在protues中点运行 在串口中发送区输入字母ABCBEF,点击手动发送观察实验现象 4 J# @+ M. z% |) ^$ K+ m) l/ t
9 A6 w, j ~, p% s3 j4 s
2 |" S! c# t& j) T& ?+ }6 ~' l* {9 l2 ?$ Y4 O
/ A% _' y$ p$ T$ m; x" B: I
单片机源程序如下:# I5 N4 k, ~3 B+ T. Q3 ?2 B* B
9 \7 c; o( I2 @% O2 G- ^; e
/********************************************main.c********************************************/; r- w( ]" M3 Q8 {" C
* i! L0 p6 [. _8 r
#include <reg51.h>
1 m6 ^) e9 K' {2 }+ T, a( Bsbit led1 = P1^0;
V& v0 W% y+ U+ \sbit led2 = P1^1;
& J8 L& j* q6 j E. x//初始化串口 (设置串口,开启串口中断)3 k4 x a k4 X- n8 d8 H
void init_uart(void)8 S1 a0 F, P% d' K8 C2 \
{
6 x/ e5 I& f2 v9 N# m5 r% }& ^ O) L SCON = 0x50; // SCON: 方式 1, 8-bit, 允许接收数据% `$ e! d" ]( u
TMOD |= 0x20; // TMOD: 设置定时器1工作在方式2, 8-bit 自动重装
. O9 s. l9 E+ {9 t TH1 = 0xFD; // TH1: 初始值为0xFD 波特率:9600 晶振频率:11.0592MHz
R4 Q) l0 A3 t- { TL1 = 0x0;2 n- C' `. u" Z- J
TR1 = 1; // TR1: 开启定时器1
7 e0 [% w8 Q" ?* c0 a EA = 1; //打开总中断
9 ?: Z, g/ p1 k+ e7 W* M! ^ ES = 1; //打开串口中断* z7 x- [* s4 g: M" E. Z- T6 _0 i
} 1 X' e, U8 {4 Q- E, r
' ^" }3 x ~! q. D8 u
/ R1 @, l' X( U- F- I% y+ y, i: ^, B// 发送一个字节数据
9 X) K" T, A) D. t6 a2 rvoid uart_send_byte(unsigned char dat)
, [1 t* w# r( M. Z1 j{
& d9 N! J2 q% X" S8 \ SBUF = dat; // 将数据送到发送缓冲寄存器SBUF,一位一位的发送
0 ]0 Q" P4 P" @6 q% Z5 X2 e& V while(!TI); // 等待发送完毕 (发送完毕TI硬件置1)6 K' M9 ?1 W! \ F4 K; u. F
TI = 0;// 将TI清零,表示可以发送下一字节数据。
" H% e9 F. d- j) N1 m. P t}
, P8 j9 b+ T& X1 e. `9 Q/ P$ E# M! f' f: k% w$ i/ p( @$ D
// 发送字符串
1 }# U5 O/ s! Y gvoid uart_send_str(unsigned char *s)% V8 T. }, x' o1 W1 Y+ R8 c4 Q
{
: x- V+ e6 M8 c- D7 g0 p while(*s != '\0')// '\0':字符串结束标志4 J/ v5 L, W0 N7 ^
{
/ t; ^3 k9 l9 @6 j( C0 G! Y uart_send_byte(*s);// 发送1个字节数据,1个字符占8位,1字节
' Q. J, E( C& E t s++;// 指向下一个字符
5 `7 Y( O- F" ^- S/ }0 N" D }/ K, `7 l+ A6 Z7 ~8 V
}
# t! y& S8 G2 C$ c! T" b9 `4 o5 @7 B9 d W- V" S: d9 _
+ j1 o+ G' {5 ~// 串口中断处理函数 (串口接收到数据,发送数据完毕都可以引起串口中断)
- e( F* e4 S, C0 i1 }' ~void uart_interrupt(void) interrupt 4 //也叫串行中断服务程序; A& v3 _1 @' k* N" a/ S! i
{: K8 j4 `: j# e
unsigned char recv_data;// 用来存放接收到的数据! \/ P+ B9 U* Y! i1 s8 b. q
unsigned char send_data[] = "I received.\n";// 要发送的信息& v! F& v. A" [4 H
1 k9 Q d- n' ?5 e+ Z6 g if(RI) //接收数据(1字节)完毕,RI会被硬件置1- \$ N* Y1 J, G0 x! S. `
{
$ G7 a7 B4 ]# z$ w3 Z RI = 0; // 将 接收中断标志位 清零(让串口可以继续接收数据); d8 H- j1 R8 J5 E& }8 r7 @7 d1 D
recv_data = SBUF; //读取接收到的数据,并存放到data" J$ m4 |# t5 s
5 M! n% E% i+ ~7 ^( w% L& J9 Z% }. `
* v5 M) q% i; b/ A8 r% L
if(recv_data == 'A')//如果收到的字符是'0',就让灯灭: |9 {/ ]5 C6 E: y& u1 W' S. u+ j
{$ a" O, T0 {. B+ w7 ~3 v! b
led1 = 0;// p1.0引脚低电平,LED灯亮
0 U$ q' P$ F+ H% z0 ^, H( N led2 =1 ;
5 {; {! c' a! s$ } uart_send_str("A");
4 i% d1 j5 L" i9 X7 E/ m } W- {: H# h7 U- ^
else if(recv_data == 'B')
. t7 e! M4 g- I5 ]( t2 R { z& g6 y, u3 v$ _% s8 f- K
led1 = 1;// p1.0引脚高电平,LED灯灭
. U+ t* B9 f1 g" q led2 = 0;
- }( i+ o. r$ t uart_send_str("B");3 I5 u9 c" U. D! ?* I
}
5 S3 u, H4 x2 ]0 b$ D6 T else if(recv_data == 'C')# L- D3 ~$ ]& J3 ?7 S7 G
{
/ c. Z6 X2 \9 G5 ^ led1 = 0;// p1.0引脚高电平,LED灯灭/ Z+ \9 D. |; w- R+ z4 H9 I
led2 = 0;: f' A; s0 \& D" Z/ N! r
uart_send_str("C");
7 x& p8 Z3 M* Y) j }
: x( m3 H5 [1 X- \* h else if(recv_data == 'D')
. C) c$ |- k U" }' r1 M {
4 V/ B, R* j8 x% F led1 = 1;// p1.0引脚高电平,LED灯灭
( J0 c; x1 x& l' q$ R1 A led2 = 1;8 L7 ^1 |8 @& x
uart_send_str("D");
: m2 C u4 n. G5 h }- @# v+ F9 N7 l
else uart_send_str("E");( z* i' U6 E1 ?+ h' z& s
/ h0 |6 I# p" ^5 B# Q: A
; a* g% ?- t% k9 x/ ~- k5 z( Q' b ' p+ G2 B6 X/ q7 p2 S
6 C# E, G6 c. I% p }; W! S; n7 k" @# L: q1 ?# {4 f
if(TI)// 发送数据(1字节)完毕
! I+ u" H! z8 I+ w {
- Q, f9 ?' Y7 c0 j" ? TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)- W$ t* P1 s$ K8 K8 H' J/ v! i
}4 J; x! e- I ~8 P }( k
}: `4 D0 B$ c! l
& t8 |7 f' ?$ |% z u/ T) M- o
void main(void)
9 u# P$ _2 D4 J{
7 v- l7 c R2 T# f) N' F" s. Y init_uart();// 初始化串口
. P7 I, d3 J' W T+ j1 q) w0 O- @ 0 H/ t! [, ?7 D9 T3 G
while(1)// 主循环不做任何动作。(死循环)! j3 y: J/ f* T0 L N* j
{}
, m; l$ w; ^3 r4 t+ X& K}
; _$ s* @" O6 ~, M) U |