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

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

[复制链接]

该用户从未签到

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

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 ^+ C
1 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

该用户从未签到

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
, h& ~% N! U7 r, g0 k# H在proteus上为什么看不到LED灯发生变化
! h8 }- W0 @8 \+ N- H1 E/ g
有什么解决方法吗?学习学习' s0 m9 b' \4 |. v- i
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-4 18:58 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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