EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
功能描述:通过虚拟串口输入A、B、C、D控制灯泡L1、L2的亮灭,项目文件。% T" a J* `: k9 p! z! P
图1 仿真图
. t6 t- t& [7 I( c( V- h* R! K6 X8 h![]()
5 t( V- Q" ^8 k( C
( u* I. o$ E/ B* s" `! G+ y第一步点击vspd.exe安装虚拟串口连接软件
, b3 x( ^1 t) o" L安装完成后打开如下图,选择试用就可以 5 _( o) {5 `4 V* h! f6 E
点击pair 2 A6 f7 W) {: O
8 V2 ^. v$ q3 T+ e找两个com口连接起来,数字不要太大要不protues中的串口找不到,设置完了不要关闭软件 第二步:在protues中配置串口,打开protues文件,点击串口 ' ~2 m, p; J2 j5 X. P- y7 _
设置如下 下一步点击com.exe配置PC串口 配置如下,其中端口根据你设置的去决定![]() - Z* O$ C e" z: R8 B; r2 o
- d5 [% r* R3 W6 N4 K9 S# v/ i
配置结束,在protues中点运行 在串口中发送区输入字母ABCBEF,点击手动发送观察实验现象 - H. m6 V3 j) J, ]# n
. ?8 L+ C: D9 s6 z4 ^+ C1 v4 V/ K+ _4 w& S G" ~
1 K/ f H; j; _6 [8 [+ [- Y
) Z+ |0 G: i9 ?+ _7 d1 ^) X6 h单片机源程序如下:
7 s$ Z$ n/ R; J+ v+ { \7 X c0 ~: S3 s& O4 h- f
/********************************************main.c********************************************// f ~ j/ W: w3 T5 f* F! h
9 `* s) W# M. K#include <reg51.h>$ o9 U% _8 E& ]* s1 q4 B
sbit led1 = P1^0;
5 O3 w+ v. P1 g1 ~sbit led2 = P1^1;
9 h3 i! j; F% X0 b//初始化串口 (设置串口,开启串口中断)
3 k- g9 p3 @+ y3 A( J/ C9 t* vvoid init_uart(void)
/ W/ G9 G7 W5 D; H! W{/ ^; q/ `: j! c- V
SCON = 0x50; // SCON: 方式 1, 8-bit, 允许接收数据
" h1 R, \5 N" o6 s" \% y( T# u TMOD |= 0x20; // TMOD: 设置定时器1工作在方式2, 8-bit 自动重装
l' a" q: q# E; u5 a TH1 = 0xFD; // TH1: 初始值为0xFD 波特率:9600 晶振频率:11.0592MHz : M* K$ `% r0 @! J$ C, d
TL1 = 0x0;
2 q; z) _ a3 H9 N( x TR1 = 1; // TR1: 开启定时器1
8 G | i+ x- D2 }& s3 E EA = 1; //打开总中断
0 \2 A* c! s2 M( f' ?8 I( k ES = 1; //打开串口中断9 S! X) P3 t) s* _! ^& H
} / T9 z; p0 r8 A, {* |% D8 [$ h
4 O. ~0 P I( Q' [: H
6 x+ ?" J" {8 K// 发送一个字节数据
% f6 a Y3 B; Zvoid uart_send_byte(unsigned char dat), V3 v) w. e: W
{6 K I9 H8 [ V$ ]6 B4 u [3 ~
SBUF = dat; // 将数据送到发送缓冲寄存器SBUF,一位一位的发送9 w; u4 H& {( W) M2 _( P* A
while(!TI); // 等待发送完毕 (发送完毕TI硬件置1)
% f+ E' p6 o; a' x+ d+ h/ W" y# e TI = 0;// 将TI清零,表示可以发送下一字节数据。; ]8 I o* m: k2 M
}
3 o# \) K3 Y1 m6 B3 \
) j" H: V* d2 L8 `" X7 v// 发送字符串) u- ?+ h1 @0 {0 `
void uart_send_str(unsigned char *s)
' `' ]9 ]: w- r( k G! d* Z- t{
/ k( W. V0 c3 X3 a8 U0 i while(*s != '\0')// '\0':字符串结束标志9 x' \0 c2 F6 m1 A! d
{
0 ?& n: O) z7 c7 I# L r uart_send_byte(*s);// 发送1个字节数据,1个字符占8位,1字节8 `) W# E* e) v$ J
s++;// 指向下一个字符
7 g1 b1 L. R% s& A }1 k7 Z/ B' U3 r0 _9 g% B
}
7 O9 u" l1 `; d5 Q- y/ ^+ h! A6 g/ p
: {* a5 H/ e6 k4 D }# n9 Q5 @! b
// 串口中断处理函数 (串口接收到数据,发送数据完毕都可以引起串口中断)% H5 k, L' S! L, `# |0 i) u
void uart_interrupt(void) interrupt 4 //也叫串行中断服务程序& H5 U& E& e7 s
{! p4 z' d: \+ x# Y4 Y" c1 m
unsigned char recv_data;// 用来存放接收到的数据) }" K; t7 E4 k5 Z# L
unsigned char send_data[] = "I received.\n";// 要发送的信息
0 j$ P0 O9 T5 U- R / v, |7 z1 W9 z
if(RI) //接收数据(1字节)完毕,RI会被硬件置14 t4 Q' l- x, c9 r6 W
{ j! b# T$ J+ H+ P4 e
RI = 0; // 将 接收中断标志位 清零(让串口可以继续接收数据)0 D! _' i+ E; x( \/ U
recv_data = SBUF; //读取接收到的数据,并存放到data5 ?$ j& Q& x/ s: Y2 h7 K3 l2 T
, n$ z5 ~9 ]. q- u6 _3 ^* b* `
$ Z' N. p* I6 V+ k2 h if(recv_data == 'A')//如果收到的字符是'0',就让灯灭- W$ n- n+ f1 j. J; Z# f, N
{; W3 c5 m' q s L$ r/ o1 d! S" U. _* b
led1 = 0;// p1.0引脚低电平,LED灯亮+ N2 q+ x% J+ [( ^1 v
led2 =1 ;
3 D: R# e' \# S( X. @5 n uart_send_str("A");* L- ]7 }( Q2 I( s& H
}
r& E) Q: f4 ^4 E else if(recv_data == 'B')4 ]8 W# X Z$ M2 G7 O B4 K
{+ L7 H! _( f9 K* f" f$ i! ]
led1 = 1;// p1.0引脚高电平,LED灯灭$ @6 K- G% S. ^( ^& _% e
led2 = 0;
Y. _ b5 C! Z P" W! T( y uart_send_str("B");
2 l. M2 ]1 u: B* ^* f$ w9 _5 X$ C }4 W, _! N s' q5 f
else if(recv_data == 'C')% ^8 \3 [3 e' m$ F5 U/ g' V% |
{# p% [8 Q! l: u) b* c2 H7 Q% O8 ^
led1 = 0;// p1.0引脚高电平,LED灯灭
3 H. {# m a | z led2 = 0;
p8 A a* L5 s. [7 i uart_send_str("C");
" H. \% [7 [ |, p2 b, ^ }
# x$ S+ s, L( U$ V+ g else if(recv_data == 'D')8 w2 t% X( w: b2 a9 h( x8 J
{2 s; w4 T5 w* Y5 x6 `% U
led1 = 1;// p1.0引脚高电平,LED灯灭
8 o Q* T R( N7 d$ q led2 = 1;
) O& w5 ]% ^0 m% M uart_send_str("D");4 d& `# \! H# ]' Q7 D: q) W1 J2 C
}8 t5 F' m \( w# F$ e% C% O
else uart_send_str("E"); d* m! D) v3 J) U; ^9 i
U9 [* w! p7 J' b. n8 H8 i8 q
' `1 l' p5 r- s/ _% s- j* p( n) ^ o2 w- T" f" l0 n% w
2 A2 k+ U* Y7 C" L( L1 o }
4 X$ d$ }) ^9 X8 _* N" | if(TI)// 发送数据(1字节)完毕 i2 j) H9 K+ a# i, l4 d- {
{8 s( A1 }* Y5 K' Q9 ]
TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)0 q3 e) t' L4 S- U3 v
}
# [3 F9 B/ s% T p- [/ x}
% y3 o* d$ {# w. t+ Z- ]8 V0 o
. P! n! F: X; W: E0 Bvoid main(void)
' A2 O7 [ X0 o{
; P' e7 @8 v3 o init_uart();// 初始化串口
- u( {. i3 R/ i( f3 v' f4 n
1 y) e- _( D V while(1)// 主循环不做任何动作。(死循环)
. M5 e8 M' {3 g/ \ {}
# A- ?: w' {% i$ m" ~}% [7 I1 p5 M0 M6 y1 K! d
|