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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
//在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)& h6 ?- P4 x. E" S5 @
#include"STC8AXX.h"
8 m2 W8 U- @& k- x: X9 R#include<stdio.h>. v  e2 @/ T6 }* c
#include"types.h"
7 N$ ]* c/ {: H#include"Qport.h") e3 R/ M6 Q; D; q& b! b  Y( U0 n
#include"delay.h"
! X+ o7 q# i: H: j! X1 f1 `
8 y1 T1 R! G1 S$ M$ D3 U#define uchar  unsigned char/ {, l5 W, {. _+ b5 B3 H' j2 G6 g
#define uint   unsigned int        
' H% z# p1 M9 q( I1 C. R6 }#define FOSC    11059200UL
% w1 b% K! H9 ]; u* M1 O#define BAUD1                9600UL
3 X- L# M% N/ `' G9 b; N  o$ F#define BRT1    (65536 - FOSC / BAUD1 / 4)                                //FEE0
0 s7 ~8 n! ]% P  H& G' I2 h' ^+ T6 l- g% ]( ?$ \
0 |% m  n5 `$ J2 X5 [7 Z! s
uchar code *s ="Please input the following commands:\n"' M2 D" U) ]: X+ y. t8 Q, L
                 "Inport  p         (read port)\n"# ~* f# J( f6 ?0 ]( }& I6 d9 |) ]8 ?
                "Outport p nnn         (write port)\n"
4 }) ]% `0 e1 F6 w                " where p=0..3, nnn=0..255\n"
$ u4 X: u5 J! e: y                 "Help or ?  (display this text)\n";! o2 N. O- Z0 I- k. j4 e& {3 [8 A

9 w4 v( c2 o4 F2 {* E9 z' a1 n+ G2 ?. V: a- V8 T; \+ T
uchar help(){: w! |- Z, K! k  D7 h
  printf( "\n%s\n", Q );
/ k5 H. |9 ?9 P" X8 U" R3 b  return 0;
0 c4 P6 h9 N8 _}% e3 _9 h. i% c) v! v3 Y7 Z# Y
- _2 G3 U+ K% M+ h( I* Q3 y
0 p8 E4 ], [1 ~( y, h9 ]" ?
uchar Inport( uchar idata *rbuf ) {+ F, d# m0 v* t* \* F. ?! h
           uint p;
* _6 R. G# Q3 g$ m  \                uchar v;) R) l6 u7 r8 N! ^) B* Q
          if( sscanf( rbuf, "%i", &p ) != 1 )
+ S% p! C6 j3 f& m    return 1;                                                                                6 W; [( S3 [/ z& }
                    case 0: v=P0; break;               
- A% `0 m8 g( a1 d) i: ^2 G4 n                    case 1: v=P1; break;                ; g. k2 L- D  E+ g- O
                    case 2: v=P2; break;               
2 n0 l( N& {- K+ w                    case 3: v=P3; break;               
8 {. r4 D9 q& l2 A+ @0 E' A- j                    case 4: v=P4; break;                6 y- O8 @* f+ Q4 ?3 w) e: C! Y  H
                    case 5: v=P5; break;                * @; N& K7 \' c& a& b7 j0 o
                    case 6: v=P6; break;                3 u: x9 G0 `; P3 ]( g
                    case 7: v=P7; break;                * R$ A4 o0 |5 N2 G% c" K& E* N) u7 p

! e# L9 G1 Q6 F+ `& n% r1 {0 V        default: return 2;                        
9 U" C# x1 i% n  L          }
! U2 S3 f/ H( T9 _# u          printf( "Port P%d = %02X\n", p, (uint)v ); + |+ H7 W2 v6 F: o$ P
          return 0;3 u! S- N0 [3 M; {! M) X# l
}
: z  R2 P$ Q+ V. J: G  w' P# o$ j7 X! C% i2 G
/ l) ^8 A' f: [% x) p
uchar Outport( uchar idata *rbuf ) {% K9 l7 n+ o8 r& _
          uint p, v;
) P. o/ ^5 m! K7 i' V          if( sscanf( rbuf, "%i%i", &p, &v ) != 2 )! N0 m: J- g. _
                    return 1;                                        $ o# o& |" [7 ]
          switch( p ){
6 L+ h' a% w5 x1 h4 ~& _. w4 f                    case 0: P0=v; break;                                                
) m2 |$ F9 b$ y5 i; K0 _, o                    case 1: P1=v; break;                                                
3 U, P+ F5 z; q) M. S( q                    case 2: P2=v; break;                                                
6 z" [4 `7 Q9 n' }! R) h$ _: ?4 D: h                    case 3: P3=v; break;                                                4 [  [- Q9 b! M' W3 P
                    case 4: P4=v; break;                                                1 k+ l& e4 z( w" j3 d) z- V
                    case 5: P5=v; break;                                                
3 C; O! S/ Z% t: X  ~6 I                    case 6: P6=v; break;                                                ( r5 H, l1 P9 s0 s8 {9 c$ z; \3 ?
                    case 7: P7=v; break;                                                ( [4 c' e8 o7 J9 J5 U0 M

7 e& C  D3 x8 ^2 T) H1 |, ^                        default: return 2;                                                        1 M5 {% I9 b7 j- \
          }
- o, Q) H3 R& v          return 0;
3 l  X9 b6 a. |( J/ D/ z  D* N! m* o}
) u: G$ _. q) w0 [& o/ _. a% r4 u1 ?3 [7 C7 f; C
7 A+ h/ c( A7 |# a, \
void main( void ) {
, L0 q: C+ x0 T# euchar idata buf[41];" z4 m1 d( J7 x1 [
& \$ K; b: L; P- {
        uchar elevel;
0 s9 v0 B# U% M: k6 C# l        uchar mjs;* J% [8 d2 X2 Z6 ?0 _2 Y2 k7 v! Y
        Qport_init();                                                                                                4 e+ K" f, m8 U) x# a% K' f5 }

/ R9 U! `' y6 d5 {" L3 P: h, C//SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI( M5 V; y4 _8 s* B/ z4 P6 f
//      0   1   0   1   X   X   1  0
" l! c: Z+ [  K        SCON = TI_+REN_+SM1_;                                                                //0x52
: [3 M4 F( A! e) _* c% K) H/ t& N* T
//TMOD: T1_GATE  T1_C/T  T1_M1 T1_M0 T1_GATE  T0_C/T  T0_M1  T0_M0
6 n: \, h; q, m4 b1 V' q$ `4 R//         0        0      0     0     0        0       0      0
' X4 P4 @2 x3 g) s! ]7 r) P0 i9 z//, F" P6 o- m$ @9 T& T' n% k7 K* w) `
  TMOD = 0x00;" b% W, ~* i# y" _3 x' p" Y
//AUXR: T0x12 T1x12        UART_M0x6  T2R T2_C/T T2x12 EXTRAM S1ST29 I1 I# I8 C( z
//        1     1        0       0    0     0      0     0
  W6 n4 @6 b# l& u! _& W7 E
1 r: F4 W' h( I; ^  \        AUXR = 0xc0;
( u' r$ ?( s* _- ~        TL1 = BRT1;
) ~1 B6 e9 v" o  TH1 = BRT1 >> 8;
9 U* }& O9 r. S' J: b3 G. g  TR1 = 1;                                
/ s& U8 ~2 I6 |+ Z9 l1 v
: }& ~, g& b. M0 T7 r. q* |" F2 q$ a3 S5 i) [7 g: q2 k$ G
        for(;;){$ q2 Y8 n7 O5 Q5 f" p* ~: m- \
# w% D' t/ m5 X1 y0 y/ y# K
//                if(!P30) IAP_CONTR=0x60;                                                                                                                                                $ X1 N& U3 D  T- s
//                        WDT_CONTR|=0x10;                                                                        
! m2 j7 i( S/ |# m+ y
' S% F8 u' a4 l) ^7 ]* A" f# @                        for(mjs=0;mjs<=2;mjs++){
$ g7 x! d; X/ H, Z0 K2 L                                        DelayMs(200);' ~4 j' V* Q' s7 X7 j0 F
//                                        LED1=!LED1;
, D: @7 m: q* m2 ^$ K6 b                                        LED2=!LED2;, a4 W. d) ^1 a, p) r8 s1 Y+ i
                                        LED3=!LED3;
, E- q/ t* O" y9 W9 }8 b//                                        LED4=!LED4;+ ]; y' L8 A1 j( }
                                                }& J# G7 a2 C1 v8 {; `8 p
+ V- V/ v% `! A+ |/ R
                                        help();                                                                                                                        9 ?' l) h" r; t6 `+ t* v
                                        putchar('>');# n9 x: a5 K7 Z% @
                                        gets(buf,20);                                                        ) g; n% }$ |# Z9 V8 e& x" ~8 r
                                        switch( elevel = command( buf ) ){        
4 E$ d0 f& B3 O2 h& U* O& W                                                case 0: break;  _$ j8 M4 d9 q% l4 b" j
                                                default: printf( "Error %d\n\n", (uint)elevel );}( r4 z. H* B1 ~  m2 q
                }: T, h3 c1 V" R6 G  S. C
        }
; y5 q# g. F/ o9 \6 B( x' E+ y, w* q: ]" A) ^
//命令解析        3 @9 V# L! m2 @4 m9 I
#include<stdlib.h>
, T; I2 S  i$ t, e#include<types.h>6 E9 v- |, T0 @5 |
0 s. j# L4 S) s
typedef struct {
  ]+ H( M, X8 s& j2 F6 T& W0 d          uchar code *name;
$ y4 [' e0 R9 E1 w. ^0 }          uchar (code *func)(uchar idata *);$ {6 l2 v8 _6 K4 Q' y7 _
}comm_struct;
) [4 ^7 D. E# ^' t( Z, [  Q1 Z( `: ?+ c, @" _7 V0 [

9 p9 |5 b( J0 K4 X; L: ecomm_struct code comm_tab[] = {                        + ~# F. X& r8 e! m  r# p1 B' ?
                "Inport", Inport,
( E1 g+ l* b- M& @5 J  _+ j                "Outport", Outport,
1 [6 a* f9 t& x/ V# g! c, k; P                "help", help,3 P6 Q9 n5 l. N! r/ |, ]' W
                "?", help,: ^8 j. `1 z, y9 X/ E5 O+ |2 J
                "", NULL                                                        
# r' I7 |: ^: ]1 l2 k- x};
& y/ J! p4 z% q3 B8 u! l" t% C
2 ~9 U& m- l! A7 A; v# Q: Z0 Y3 R0 H# `/ O- S1 R/ v7 L; w
uchar command( uchar idata *buf ) {
) j! Y7 W7 U8 S! @          uchar i, j;                                        % `/ |5 C' G9 q1 |5 J
          for( i = 0;; )
1 s* K: o) ^3 A! y                    for( j = 0;; ){9 z8 d: i5 e$ Z' c9 t/ o& b' d
                      if( comm_tab[i].name[j] != 0 ){
% L2 r0 b9 H1 O1 \: n" _        if( ((comm_tab[i].name[j] ^ buf[j]) & 0x5F) == 0 ){
  H/ ]4 Y) x' i% a                                  j++;
, G9 _: L8 |& ^3 G' R) k- r: F                                                  continue;                                
0 }$ Y/ o0 h' e. o7 m                         }( T: ^+ e' N- H- d
                                i++;5 a1 a: ^  ~$ |# b0 P' D" D0 T
        break;                                  4 V' w5 i0 T0 h
                      }5 f; Z! W: E6 B4 Z% {# Z- a
                      if( j == 0 )        return 255;                        / }* w, B- s& @. k# A
                      return comm_tab[i].func( buf+j );        
7 B! \! f% x' `; ^/ X) R- T& f+ {                    }, p* l8 E0 |9 z' \0 @0 c9 M
}0 {  g% W. Y$ U. B) G2 Q0 O+ o

该用户从未签到

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-11-4 11:07 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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