找回密码
 注册
关于网站域名变更的通知
查看: 224|回复: 2
打印 上一主题 下一主题

Proteus仿真单片机串口控制灯泡教程与源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-28 09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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# L
7 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( [

该用户从未签到

2#
发表于 2022-6-28 10:38 | 只看该作者
在proteus上为什么看不到LED灯发生变化

点评

有什么解决方法吗?学习学习  详情 回复 发表于 2022-6-28 13:52

该用户从未签到

3#
发表于 2022-6-28 13:52 | 只看该作者
big_gun 发表于 2022-6-28 10:38, u6 U7 R; p" m- s
在proteus上为什么看不到LED灯发生变化
. d  N: w( k) m$ u* c5 G: D, F
有什么解决方法吗?学习学习
# M8 G4 Q# k: A# x: p: ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-28 22:40 , Processed in 0.093750 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表