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

在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
//在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)% b4 ?: U/ j  T: n2 \
#include"STC8AXX.h"! v( |) F' H& N5 p
#include<stdio.h>
! w3 {& [% G. \! j7 p% \, n4 |  H#include"types.h"
" p; O" U- s% p9 p8 h4 `  j#include"Qport.h"1 D. Y/ u% x6 F8 A5 C. Q- g. s
#include"delay.h"
3 ^3 @1 y0 \& b0 I
  O! s( z) Q' Z9 R#define uchar  unsigned char
; y* E1 |& k9 i# ?& @#define uint   unsigned int        
! S. O  w2 g; n# X) `#define FOSC    11059200UL
0 F3 z& `/ M4 T2 Z& f#define BAUD1                9600UL
% L5 d! H. E1 H, o8 H#define BRT1    (65536 - FOSC / BAUD1 / 4)                                //FEE0
5 l0 Z6 ]3 U8 k* x; o4 r# k
* l# V( u6 O! ]1 x! q% _  X2 p
7 t- A9 C( y' B2 P- a4 e" Luchar code *s ="Please input the following commands:\n"* _% Q* Q' p" R2 X1 D# K- K, [/ Y
                 "Inport  p         (read port)\n"
( o$ ]6 c* w- Z, _                "Outport p nnn         (write port)\n"# a8 E) J" g9 G: S+ c2 Z# j
                " where p=0..3, nnn=0..255\n"" P0 L, T$ U) _
                 "Help or ?  (display this text)\n";' t1 b. x# T) n3 C7 B% ]

/ ~2 N* f  X6 T) b# t3 s' e' I1 ^# L; p3 M& h: j4 T/ R
uchar help(){) z# z1 s% i, A9 d
  printf( "\n%s\n", Q );
8 d, J8 P* ?2 e4 I/ t; H  return 0;* Z" V( @* _) Y) z4 G) {
}
) Z, [5 Y7 v, j1 q: E2 ~6 v# q; H* Z
  R; A% |7 B5 Q1 F: p, K2 C
uchar Inport( uchar idata *rbuf ) {
, r, o6 ]/ {# T: Y           uint p;; E3 \5 p9 l7 R# y( a
                uchar v;9 y+ [6 {4 ~2 O/ _/ f
          if( sscanf( rbuf, "%i", &p ) != 1 )
" @- ^0 F8 X  y2 o# N4 i3 d! T4 K    return 1;                                                                                
  r9 x  X; p+ i! c; r  D: ~! \                    case 0: v=P0; break;               
. n. r6 t5 b  z) A                    case 1: v=P1; break;               
/ a7 l/ t9 _- y4 e4 e1 s' C                    case 2: v=P2; break;                9 b$ _$ y  w# x. N$ z/ K
                    case 3: v=P3; break;               
' Q3 a: z* Q& t                    case 4: v=P4; break;               
, j! D: M8 a7 F                    case 5: v=P5; break;                : d% G' P  N, ~8 r# h3 c' M1 k
                    case 6: v=P6; break;               
( A* @+ e0 Z% I' y! E% m+ r                    case 7: v=P7; break;                * _  E' p( @: d* F3 o* [3 \4 W: R1 w: Z
: x5 o# a4 @" v$ A3 h# w- D
        default: return 2;                        $ W3 @) _: \( r* R
          }, B. f1 B) |/ A) v0 v2 q
          printf( "Port P%d = %02X\n", p, (uint)v );
: m+ V/ d5 v( d3 @& o" k2 r0 E          return 0;6 F5 p3 _$ [3 H& Y1 H
}# X! e+ N' T, K# y# \
  o3 L' X4 a+ f# X& k

1 s8 f. L1 v5 V5 m+ t% Yuchar Outport( uchar idata *rbuf ) {
! S2 T0 M) C$ G9 n6 }4 E/ \* }* ]          uint p, v;3 F$ ~; \  ?0 ]/ S% p
          if( sscanf( rbuf, "%i%i", &p, &v ) != 2 )
/ |& Y5 ~9 F" R& n) I6 ~5 L" W) Q2 n                    return 1;                                       
" }4 e+ g% J- M+ n          switch( p ){9 r! g% {7 Y5 K
                    case 0: P0=v; break;                                                3 {% T( X8 R2 g9 G: w/ B
                    case 1: P1=v; break;                                                3 v% o6 ?3 {: x, G: e
                    case 2: P2=v; break;                                                $ ]- s5 c; O! d3 S
                    case 3: P3=v; break;                                                
: I6 p" g+ Y# q: d9 r9 b1 T                    case 4: P4=v; break;                                                
0 R* n) N' ]+ U2 y# C  x: D4 P0 f. A                    case 5: P5=v; break;                                                . \- d( [( E6 N! [
                    case 6: P6=v; break;                                                ! ]1 r+ k. P! H
                    case 7: P7=v; break;                                                . k* h! ^- M( H  k5 z% ]1 A
8 z* s" k% f/ p) \! k
                        default: return 2;                                                        
! m( F: g. k! G2 w          }6 t. G* Z+ F, |5 ~; Z; H
          return 0;
* Y/ i( j' L% X/ _4 n}
3 K& _. {* B! S, T. O% M- Q3 G6 ?4 b  L, {4 v

# R  o  v1 h; i/ _* s+ {& \void main( void ) {4 @' e+ y2 g% y; u* b7 [
uchar idata buf[41];
# F, O( S& J# z+ r; S- K7 I2 f0 c9 {% O/ N- K6 y
        uchar elevel;
9 @" o9 K1 z+ ^' h1 u) U        uchar mjs;
- |9 I: v4 u+ }( Y( O! o        Qport_init();                                                                                                5 |1 c+ J: l7 R( u; [! E7 P
/ H  O' {! a5 ^6 P) P
//SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI  `- C$ t% p" h! C9 M+ T1 Y
//      0   1   0   1   X   X   1  0 9 m8 I5 |# c0 P5 e4 e* S! c0 _
        SCON = TI_+REN_+SM1_;                                                                //0x52
2 C9 [  K+ m- b0 y8 p; I: l9 D5 F; v
//TMOD: T1_GATE  T1_C/T  T1_M1 T1_M0 T1_GATE  T0_C/T  T0_M1  T0_M0
2 e8 a# t- M5 T! h//         0        0      0     0     0        0       0      0- I, g+ Q8 d+ p7 ~  I
//$ m3 O7 j. w& |2 i: `: j) a6 r5 }7 W
  TMOD = 0x00;8 L* g- K/ `+ ?  L5 c
//AUXR: T0x12 T1x12        UART_M0x6  T2R T2_C/T T2x12 EXTRAM S1ST2. p9 w5 y8 {! [: h$ R( D" ~) e
//        1     1        0       0    0     0      0     0+ F, x. ]* W, y* M* t# y
/ P& @( k& v( Y9 q* Q# ]; u
        AUXR = 0xc0;
( n9 y; |/ N5 U        TL1 = BRT1;( j1 m- a0 A' }6 ^8 w" ]" [
  TH1 = BRT1 >> 8;
) p: i7 Y! s- }) o1 n3 s3 J7 s, h  TR1 = 1;                                
/ C0 J1 h4 X9 p. ?
. v. C5 d/ V3 {8 [
, q- I) C& R6 w0 P        for(;;){
9 d( H" I0 L+ ^0 A" c4 i
# c1 d# |' E8 a1 f' M. |" [; O//                if(!P30) IAP_CONTR=0x60;                                                                                                                                                
) x+ t& C8 Q) J9 D3 t! [" w8 Y4 W$ }% q//                        WDT_CONTR|=0x10;                                                                        ' d$ N& f2 N1 K& w7 l) K' M
: y. P0 S9 x4 X1 T6 e
                        for(mjs=0;mjs<=2;mjs++){
( Y+ q4 o- f1 J% m1 s% L                                        DelayMs(200);
+ R' ^( c2 h! }" t//                                        LED1=!LED1;% A3 T7 `  L( d; u# c& n3 _
                                        LED2=!LED2;7 {# \! `$ f4 g8 w  p% V& a# f  ^# l
                                        LED3=!LED3;8 \3 b, w3 q- ?, h5 X9 g4 i4 {
//                                        LED4=!LED4;
0 Q' Z. R* B& X5 A9 |( `                                                }% H, N; a; S7 I

! a' C) M" r; ~  q8 G( c* F0 D                                        help();                                                                                                                        ; B6 m4 x5 @; n
                                        putchar('>');% _* D: i$ y* E; U* w6 ~& F
                                        gets(buf,20);                                                        6 s. h/ X4 o3 K$ g
                                        switch( elevel = command( buf ) ){        / B) Q% B: }4 [; O3 {( C% u
                                                case 0: break;6 b# r* j! X5 Z: ?& E; q5 r- g* Z( l
                                                default: printf( "Error %d\n\n", (uint)elevel );}
  p0 p7 r; p$ q) E7 i: t  K                }
/ z1 K( v1 Q9 Q# _  Q7 X% `        }" _8 P% L7 Z# B8 ~# E' x' N
6 G2 P* z3 A8 g
//命令解析        ; y( D4 _: P: t+ q
#include<stdlib.h>- F6 [! c7 r( \9 O2 ~$ X. T6 z
#include<types.h>
, Q. m# e+ G5 M  ]- w( s  X& \! @; r7 c4 M" o$ y( M+ O1 k* J; ?% v
typedef struct {
) E( S' ?. b4 N9 b          uchar code *name;! E3 |! n( h) Z; C3 o. q1 z
          uchar (code *func)(uchar idata *);
2 P# v2 {7 ]* V8 e6 d) {}comm_struct;% l! {, ~# ?% w0 o7 k9 Z
7 T. y% Z0 P6 W, C5 ~2 r9 T

# n) z; A/ P* v4 `- Jcomm_struct code comm_tab[] = {                        # A# f+ x/ E) B/ z4 y. d/ f( E
                "Inport", Inport,
# [  x$ s/ V; y. I% B5 I                "Outport", Outport,9 t8 b9 p! ]3 a# M% R
                "help", help,+ p- [' n# `* K# e
                "?", help,
4 y! y! L, R  l5 @' X/ e" T$ C                "", NULL                                                        % _) ~, u; A/ }& v  g5 F3 g
};$ W0 E8 Z, g. _
9 J2 ~0 l: f6 Y" Q* N. T

. o* [) c) d+ Buchar command( uchar idata *buf ) {
( o$ ?# e, i5 C! @# u: T          uchar i, j;                                       
, n/ J& h2 v' L) w( ~          for( i = 0;; )
7 |1 p# c" ~8 d# L                    for( j = 0;; ){& O. u2 f/ r6 P  j+ w
                      if( comm_tab[i].name[j] != 0 ){
# q9 d  H  I. B5 z! b2 h2 d, v$ @        if( ((comm_tab[i].name[j] ^ buf[j]) & 0x5F) == 0 ){
7 d8 ]1 j0 `, ?1 S                                  j++;- a- L) l  S$ ~6 n. m7 d
                                                  continue;                                % _9 w% k6 {; D& j0 n8 ~& f
                         }
+ |9 w5 v% t% n& e6 U                                i++;0 {3 B* n+ \' `
        break;                                  ; G# B0 v7 `4 g
                      }  F4 R- Q* {, g/ d. `2 E4 A  a9 d
                      if( j == 0 )        return 255;                        ! V6 ^# j* L0 A$ a8 h& K
                      return comm_tab[i].func( buf+j );        . S. z- T/ z5 s+ J: b4 ?' e
                    }$ p# N6 O$ E: o4 w# Q5 z
}5 d. q8 z) F* n1 N& x7 Q( _

该用户从未签到

2#
发表于 2022-10-8 13:56 | 只看该作者
利用串口调试软件进行调试时,应输入如:inport 3\n这样的命令。

该用户从未签到

3#
发表于 2022-10-8 14:18 | 只看该作者
串口调试。先使能IO时钟、串口时钟。配置对应的IO引脚复用为串口。设置串口的线路,例如:串口时钟分频、每次发送的位数、停止位、校验位、波特率。设置串口中断优先级、使能串口中断、使能总中断。编写串口中断处理函数。最后写发送函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-18 10:02 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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