EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
功能描述:通过虚拟串口输入A、B、C、D控制灯泡L1、L2的亮灭,项目文件。
8 d/ D* s, f, @8 H/ N) y图1 仿真图5 k0 \) d2 B0 R3 X0 y7 Z& e6 N
- \7 ^4 T8 o+ `
: ? D1 K9 m6 V( h9 i; H8 O4 O7 w第一步点击vspd.exe安装虚拟串口连接软件 ! k4 J" g2 B% T* Y8 L+ D) U2 U |, C
安装完成后打开如下图,选择试用就可以
: k# _( j5 H# H( l$ k/ w点击pair
) L9 l+ n5 R& t/ F: n; ^! E+ D
2 M; x5 N; a9 P0 a$ C7 x6 O找两个com口连接起来,数字不要太大要不protues中的串口找不到,设置完了不要关闭软件 第二步:在protues中配置串口,打开protues文件,点击串口
. i1 z6 P! e4 Y. f% D; n! H0 Q设置如下 下一步点击com.exe配置PC串口 配置如下,其中端口根据你设置的去决定![]()
+ \/ \- Z2 J+ B8 O6 Z1 b( _" Y% c6 j7 Z& D* R9 z
配置结束,在protues中点运行 在串口中发送区输入字母ABCBEF,点击手动发送观察实验现象
- b6 @: P+ k! j1 n' L" f e8 V
" O% o1 N: a ]1 |0 i# ]' A4 K
; W) u L$ ^4 S7 Z# x# ]
8 N% `# X, N+ U }% q7 c8 y r/ v+ F7 {. P# X7 ]4 O
单片机源程序如下:
8 T0 ]+ t& R% Q: f7 l " \! s# j* t. @% I, K, s! t
/********************************************main.c********************************************/& D% L3 ~" j5 ^0 [) y. E4 c# Q
, V; h0 X+ `$ E2 F
#include <reg51.h>
$ x& K$ J% ]8 g8 e+ U' Rsbit led1 = P1^0;
6 k5 j! N3 D, N7 f' C+ Gsbit led2 = P1^1;# H# V7 P1 ~. D# u
//初始化串口 (设置串口,开启串口中断)8 f4 V9 M$ Q7 [' b' x
void init_uart(void)1 }/ }% `4 x0 p, D
{
: f1 Z! B- C: k+ o2 u, m$ J0 @- s SCON = 0x50; // SCON: 方式 1, 8-bit, 允许接收数据7 {! ?, U# }! l2 ^' T7 m1 u
TMOD |= 0x20; // TMOD: 设置定时器1工作在方式2, 8-bit 自动重装' d# g* v6 O- S- e0 _8 J
TH1 = 0xFD; // TH1: 初始值为0xFD 波特率:9600 晶振频率:11.0592MHz
/ ~) Y6 ?; G& v0 U TL1 = 0x0;7 Q# @! L2 F; F- j3 }" n2 e
TR1 = 1; // TR1: 开启定时器1 ! _8 l0 j) r6 F4 T# @5 R
EA = 1; //打开总中断
% X0 E' Q9 C: q$ m4 i) ] ES = 1; //打开串口中断
- A& e) x/ K0 V* u}
5 f) K9 j0 J9 A( d/ P; r. w7 \2 g! v! Y1 r1 v' [
! R+ W- j* H0 `" O3 y+ V
// 发送一个字节数据$ D: D8 B. Y5 u4 U6 E ?
void uart_send_byte(unsigned char dat)
! ^0 T* I6 E% w5 j; T{
9 E8 u/ e7 q( [ p) e- r# } SBUF = dat; // 将数据送到发送缓冲寄存器SBUF,一位一位的发送5 z+ n" C4 H& ^$ O5 t# ~
while(!TI); // 等待发送完毕 (发送完毕TI硬件置1)! N5 p" i+ R' O6 K) o1 ]5 I
TI = 0;// 将TI清零,表示可以发送下一字节数据。
& ?- {, q' U. q* k& F- r& j" L- n: K}$ w& }7 Q# H8 V
/ f; g% w$ U7 x0 D8 Q$ \; f
// 发送字符串( W! \4 n- E( \! X' F
void uart_send_str(unsigned char *s)! \! E$ `# a7 c8 F
{ K8 |0 z7 Y' D. R7 X. B7 ^% Q. O
while(*s != '\0')// '\0':字符串结束标志
# H) g' `6 R2 I. ~, C {- ?6 Y$ U, G8 b" ]( X9 |$ m
uart_send_byte(*s);// 发送1个字节数据,1个字符占8位,1字节
6 \" v1 f2 X/ L s++;// 指向下一个字符
7 D# \/ g/ }+ C* P1 b# y9 n }
. m& h; o' j, k$ |}; L; ^! Z; z+ L4 O! S
- Q9 ~, M" r% p& |7 L
2 @) r4 r% s5 b
// 串口中断处理函数 (串口接收到数据,发送数据完毕都可以引起串口中断)
' @ h$ {, h2 cvoid uart_interrupt(void) interrupt 4 //也叫串行中断服务程序
3 O" g( J y1 ?1 s9 u+ T! f7 c{
' u! z( k1 {8 o unsigned char recv_data;// 用来存放接收到的数据
; L9 |+ d# z! Q unsigned char send_data[] = "I received.\n";// 要发送的信息8 \+ b. ~- J. f- G+ n% c
Z' e2 s) s4 F* L, M! I- J if(RI) //接收数据(1字节)完毕,RI会被硬件置16 q* j7 g1 }' B. M
{, v* z( j! u* ?
RI = 0; // 将 接收中断标志位 清零(让串口可以继续接收数据). T) S, I- Z9 |" S- T# V/ A6 \
recv_data = SBUF; //读取接收到的数据,并存放到data
3 T* U/ c- X, }( Y y* {
( A6 C( L- _* c0 J& @7 m F - ~/ ~" d; L7 d8 J ]3 e
if(recv_data == 'A')//如果收到的字符是'0',就让灯灭7 d* V- r& y; u5 T, F5 y, f2 @
{* Q" B0 u5 A3 u/ n
led1 = 0;// p1.0引脚低电平,LED灯亮: O! H) q+ T- H0 s1 J
led2 =1 ;
. o0 J I% {" t+ l3 { uart_send_str("A");3 d; n9 Y1 x+ H M' e8 j# F0 K
} L! P3 x7 S( m
else if(recv_data == 'B')
( Q% i% R4 w/ e }) {2 W6 O; ]( R {
8 j1 ?1 ?& q* ~# f3 }1 S# k led1 = 1;// p1.0引脚高电平,LED灯灭
+ k# j& X& T% y9 T3 y: K) r led2 = 0;
: b3 f7 R. |. S" Y2 {" K uart_send_str("B");
* u+ N, i9 B% d! Z } f( K$ |2 v3 l7 N4 [6 P/ B. c
else if(recv_data == 'C')' @4 b! R5 D0 K; z- I8 X+ N
{- W8 e \5 ]; k9 [
led1 = 0;// p1.0引脚高电平,LED灯灭8 e+ `/ ?3 ^9 u
led2 = 0; P; n: N9 a7 l. a' i
uart_send_str("C");; g3 v/ x. B8 g" [$ W7 e9 Z; i
}! [. l* ]/ j4 |. C: ?
else if(recv_data == 'D')7 ~2 p: v+ U( c% K
{1 t# k! t! r+ s
led1 = 1;// p1.0引脚高电平,LED灯灭/ l; Y7 U8 E# x( v
led2 = 1;
1 N4 G- I0 S% u( l/ R8 r M uart_send_str("D");5 S" Y @/ U/ H
}4 K0 S" O9 Q, E! {* z \2 Q
else uart_send_str("E");
) e5 B5 H, F! e
) ~& ]0 g( t0 F9 e, [% b8 ]! { f1 V+ }3 ^) X2 ?- U. y" S4 |
6 D& d: K, C( p: |) J/ c% P
: F5 |& ]" e$ w* p9 P) F }
3 D4 [8 |' w4 S) [ if(TI)// 发送数据(1字节)完毕
) b$ {; g9 p0 `# F2 { {
9 K# r5 c6 g! ?$ c2 V TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)
: V* \! R: j5 x9 _+ @1 e" W7 | }7 m5 m$ \) ?# n& r3 @# J
}- E2 O; C( W4 @$ P
/ t. L9 {9 R, F3 N- T4 [void main(void)6 M7 h5 L k, V& k0 m9 _
{3 F A; R6 T2 p# S; T2 j
init_uart();// 初始化串口& F% B+ _+ ]5 ?6 @9 A) n
1 Q2 y- }/ \5 u# k0 f, P+ H while(1)// 主循环不做任何动作。(死循环)' Y' R4 u. _6 }& z
{}7 v- U, A) I. j1 m( ?- X2 z9 l
}
+ f" x9 M! h0 x% y4 B/ F t |