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

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

[复制链接]

该用户从未签到

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

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  u
0 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

该用户从未签到

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:384 ]3 q  y; {8 q0 K" ?
在proteus上为什么看不到LED灯发生变化

1 l6 |  A# O5 b! i8 h: v- y有什么解决方法吗?学习学习
# j0 {1 S3 |6 l. o1 R
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 18:28 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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