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

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

[复制链接]

该用户从未签到

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

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
单片机源程序如下:* h7 l' z' |9 }
+ 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 ~

该用户从未签到

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
1 ^# u# ~5 C% @- H在proteus上为什么看不到LED灯发生变化

. Q+ z6 r0 H  ~! \有什么解决方法吗?学习学习
+ e( \9 J) b" `% E1 i& T1 K
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 11:05 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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