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

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

[复制链接]

该用户从未签到

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

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  }% q
7 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

该用户从未签到

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! U! C; e% K, X. ^! V+ H
在proteus上为什么看不到LED灯发生变化
3 b0 A. ~* P3 q0 U1 T. q& Y
有什么解决方法吗?学习学习
- J4 y$ P& P' Z2 N7 U# ]  ]  i
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-15 02:47 , Processed in 0.140625 second(s), 25 queries , Gzip On.

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

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

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