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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
//在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)! v0 n$ I+ |$ i) U  p
#include"STC8AXX.h"
* Y6 O& V" y- G# M2 a6 l$ E" N$ V#include<stdio.h>
3 V+ r. ]8 }5 H- M' G#include"types.h"( z( ?" i+ N/ R( ~  z: g' a
#include"Qport.h"
& _. T, o* ]+ L" O. d#include"delay.h"
  }! @  @+ t8 ]; X7 h. n7 {# H' d+ V0 j1 u) ]5 C/ u$ j* E( Q
#define uchar  unsigned char
" x  p$ f$ n- @; b6 }* b# z#define uint   unsigned int        
6 G: Z$ q- Q2 J- d- m; O7 g3 {#define FOSC    11059200UL
. _$ z3 [2 h, l$ p0 @#define BAUD1                9600UL
; q8 f2 f! q+ G4 Z# z5 |#define BRT1    (65536 - FOSC / BAUD1 / 4)                                //FEE0: M# s. ?3 m$ [5 h  z
) L( \' u( S5 m- M5 f

, W- @0 p& d" H- vuchar code *s ="Please input the following commands:\n"( J5 s. P+ I  ?
                 "Inport  p         (read port)\n": H, \" X5 W. f0 Q$ i8 e; b6 _
                "Outport p nnn         (write port)\n"2 W1 L8 G* X  }. m
                " where p=0..3, nnn=0..255\n") a% s3 h$ Q" X  l. ^" G% z
                 "Help or ?  (display this text)\n";
: ]9 _; k+ ^# `6 X7 B3 k( O7 u
1 N3 S8 x, y: A7 I5 R, M3 U8 @# G" p( [1 z! H
uchar help(){
9 ~0 [& v* C% C. d* j- c' ]+ Q  printf( "\n%s\n", Q );
; E  ~3 [# X" n" g3 [  return 0;
$ j) ^8 ^3 {  a, @, M1 m}
' `4 ?$ z  v7 q, O* W2 t( y  G
3 `! [( D, w! E
, c4 R2 j9 }1 [7 Ouchar Inport( uchar idata *rbuf ) {7 n! o& V2 [3 w- C7 i7 w9 M4 G
           uint p;  ?- R& s  I! k+ h( p
                uchar v;4 {: \8 q: T. S# P
          if( sscanf( rbuf, "%i", &p ) != 1 )
& I- H  X1 _. q# _2 B7 h    return 1;                                                                                
4 a- g* A3 Y+ E, g                    case 0: v=P0; break;               
) }, |; I, F' I) ?                    case 1: v=P1; break;                + R/ o3 ?+ I6 H% G! |$ Y
                    case 2: v=P2; break;               
; _# A# Q$ {! X; I& h2 v                    case 3: v=P3; break;                9 Q) `. R4 K- y- x8 Z  M
                    case 4: v=P4; break;               
+ O1 u. \' G6 }                    case 5: v=P5; break;                1 Y  F* D/ l% o4 K0 R- \. m# i2 i
                    case 6: v=P6; break;                0 [# R! s9 d2 @
                    case 7: v=P7; break;               
1 n$ u2 g  }! E4 E- N+ a1 e
/ z* g3 r$ }' T9 {/ T$ E7 t" H6 t        default: return 2;                        
+ E7 D- }8 r8 ^          }
# ~& X2 Q! U3 Y9 v& ?          printf( "Port P%d = %02X\n", p, (uint)v ); ; y( }7 s1 Y2 E* C! r
          return 0;' F# Y7 m/ J5 C- E) d
}
  l' \3 v5 m$ n- K" s$ t/ k: e4 P) g
  Y) [# r; A6 ^
uchar Outport( uchar idata *rbuf ) {7 V* c$ L  D1 p7 G" a  Q: [
          uint p, v;
' s2 W* z' Q9 y  p          if( sscanf( rbuf, "%i%i", &p, &v ) != 2 )- M1 J: i; Y# a9 p1 b% W% m2 K3 y
                    return 1;                                       
$ Q2 v+ Q# l* B3 \; [- J6 C1 l          switch( p ){
9 F$ u3 E2 k+ |# l  `7 }                    case 0: P0=v; break;                                                8 V+ ^4 L* f" O  t3 g  I  v" [9 D- o( ?
                    case 1: P1=v; break;                                                " [  B0 k0 N& x$ u5 t
                    case 2: P2=v; break;                                                5 Y. G* u$ c! E& s/ h3 ~+ [/ E
                    case 3: P3=v; break;                                                4 i- A8 p' m  t& i1 |
                    case 4: P4=v; break;                                                1 w4 I- H. C' a) W
                    case 5: P5=v; break;                                                " h" x5 A) p1 |3 y% v3 J2 O
                    case 6: P6=v; break;                                                2 U- A! M0 [( S! q& o& H
                    case 7: P7=v; break;                                                2 u9 z0 _3 N& B, ^

4 ~# [, C; t$ _, H* s                        default: return 2;                                                        
7 W8 P+ ~4 S+ _0 q# d5 M          }- P4 P, H& A" Y! S$ H4 ~* d$ D- w
          return 0;
+ J1 b0 N; v  n9 A3 b2 n}  Y7 _6 Z0 H  }/ V

/ g" N; Z3 _) ]+ o8 `8 X7 }; g5 s' H+ W; L5 U
void main( void ) {
6 L$ ?$ g) o4 d0 iuchar idata buf[41];9 h7 ~" u: ~4 m0 h( _5 z8 a
7 w& P% ^& z! Z' z- E4 _3 [  ?
        uchar elevel;( ^: ?. `6 H, [0 ^6 N* W/ N
        uchar mjs;# c) [6 K" ?3 y) B
        Qport_init();                                                                                                & z$ n* r1 s5 E1 i# w+ r9 t
) }3 e+ o  ?" D
//SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI  C! L2 b2 ~* j( A! M. _2 u6 _
//      0   1   0   1   X   X   1  0 ; O; b5 p2 O( r8 H, [) t. C$ M
        SCON = TI_+REN_+SM1_;                                                                //0x52
1 M. }* {: n, V  O) N. ~$ n3 T) `4 C- |# q
//TMOD: T1_GATE  T1_C/T  T1_M1 T1_M0 T1_GATE  T0_C/T  T0_M1  T0_M0
, D8 \: x6 D3 [" ^! w/ u! l& t//         0        0      0     0     0        0       0      05 ?9 w% P0 d1 N+ B: Y7 w/ T; w
//6 v. o9 Z( @5 [7 `6 L, d+ w
  TMOD = 0x00;
7 X& \1 F: u/ @9 H2 Y/ m* b//AUXR: T0x12 T1x12        UART_M0x6  T2R T2_C/T T2x12 EXTRAM S1ST2. ~  @! o" x8 z" T: N. }
//        1     1        0       0    0     0      0     0
5 s. G+ b0 ?# o- x" y/ @7 t# @/ m/ O2 _1 F% [
        AUXR = 0xc0;
8 N) H3 I7 S( i# x# [, n& H. {        TL1 = BRT1;
- P0 w3 q$ A3 [9 a+ }7 {  TH1 = BRT1 >> 8;
  e8 d" |1 X. u& v; k0 V) u# P$ }  TR1 = 1;                                % Y+ E: o6 `& O8 ~/ a
1 z# Q  Q5 u$ c8 G
- e+ U3 l  q5 H6 k. e1 F- o
        for(;;){7 h/ j5 g8 U) O
6 q, L8 S# |8 e7 _2 b0 E
//                if(!P30) IAP_CONTR=0x60;                                                                                                                                                
0 q0 d0 f$ Z/ i5 K# N+ ?//                        WDT_CONTR|=0x10;                                                                        # U1 k, n* i" z( [& ~# |
* W1 k' E% w/ L+ j' Z: S
                        for(mjs=0;mjs<=2;mjs++){
- V0 v; w- z0 n5 M                                        DelayMs(200);
) H/ h9 t/ _$ x1 [- `4 `) B//                                        LED1=!LED1;% C! I5 H  {# i& E$ c7 Y$ d
                                        LED2=!LED2;
& `2 U& Q2 c2 Q3 D                                        LED3=!LED3;
, I. O" f& K! f: r* P. A//                                        LED4=!LED4;2 \+ G/ P8 j! @0 n
                                                }, z0 f' c& H( ~6 S+ Z1 D

% T3 H+ s* Z( Z3 y/ S                                        help();                                                                                                                        
7 P% Z; y$ _, T) i                                        putchar('>');$ U* D! Q* o) h
                                        gets(buf,20);                                                        
) j1 G& m" h% Y                                        switch( elevel = command( buf ) ){        
6 O, T# F' v; A5 u                                                case 0: break;
* S- W, l* ~2 y                                                default: printf( "Error %d\n\n", (uint)elevel );}+ }1 S5 _+ O) U( B4 g
                }9 ]1 ~' D6 v# t- C% m1 W4 h0 w& k
        }
( ?$ w/ I$ R/ u! x1 z3 R4 a8 c! Q2 A( U4 o7 a, D5 A  {2 R1 g. K
//命令解析        
: M! J- g: n8 D5 d$ {0 p#include<stdlib.h>
8 Y' p- \" d/ y' [; M#include<types.h>
6 q0 r7 p- z, v: [" A3 _, S1 U( O9 m1 Y
typedef struct {. H* w( q8 r! k0 W/ E
          uchar code *name;5 N2 H# s) N+ _
          uchar (code *func)(uchar idata *);
6 P+ \( p$ G1 u# G; R5 G* A}comm_struct;+ q! }. E* G4 l. D
4 ?0 B1 e, f4 M' g' |

( p. m$ @' _, V: Jcomm_struct code comm_tab[] = {                        
4 {% f( Y* A5 z; o4 C& N, T4 z2 ]                "Inport", Inport,/ p0 h' h! [& @4 u& ]& t* H: T
                "Outport", Outport,
5 ^8 x" E7 X+ P7 b& o                "help", help,7 p& ^3 c! [6 `! G
                "?", help,7 m$ Z) C8 \% h  ]  l
                "", NULL                                                        4 ~5 Q% I7 z. w( O( o
};
- ~/ {. Z" e' t8 [) \- R4 k7 K" Z  A0 J
% \6 f& \% H" B( e$ v1 S
uchar command( uchar idata *buf ) {2 w; d: g( G# f# w3 M
          uchar i, j;                                        * d9 ]7 ^  m1 l9 a
          for( i = 0;; )
6 W1 j. l, b- J! Q! E; D                    for( j = 0;; ){5 W/ C3 w0 p7 _8 v0 s5 r- ^( f
                      if( comm_tab[i].name[j] != 0 ){3 U* A- z+ X$ }( A2 \0 x5 A
        if( ((comm_tab[i].name[j] ^ buf[j]) & 0x5F) == 0 ){! K4 L( P) P6 E8 H  R
                                  j++;
5 J1 V; \2 r8 E+ h0 i; S* N                                                  continue;                                
4 ^- u$ \( t3 a. h# v4 ?: ^: [                         }1 }3 V/ X8 O* z! R
                                i++;/ i1 H1 D" A4 W
        break;                                 
7 o' A7 s( s4 L' A" _0 S% q                      }
9 H6 L# ?1 R3 _                      if( j == 0 )        return 255;                        ( i% C( u  \2 S4 z# r" n" h
                      return comm_tab[i].func( buf+j );        9 U9 B' W$ W9 E
                    }
! ~6 T9 o6 ^4 R}
2 M  {6 m$ W( C

该用户从未签到

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-9-7 20:36 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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