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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
//在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)& M8 ^' q/ J) c8 n
#include"STC8AXX.h"1 B+ A# p/ ?. p: }& b; V) z1 e4 [; Z
#include<stdio.h>
7 K( Q2 l; L5 O9 r6 R% Q. r#include"types.h"* A$ t: e) K2 z. z4 [8 |/ ?
#include"Qport.h"1 G# k* t5 u3 [5 n* L' t/ _+ A- d! o
#include"delay.h"
0 a. Z! D) R' ]% v4 `9 Q& O5 F  m( ]
5 R) `, N0 J$ ^1 q6 S# c$ _1 L( u#define uchar  unsigned char) K5 S- m5 L- d' i
#define uint   unsigned int        1 E2 p8 p: s/ T# P8 Y
#define FOSC    11059200UL
7 G' [5 \% @9 M6 a9 V#define BAUD1                9600UL4 U, B8 b# W) R; A- u- p! T, V; {
#define BRT1    (65536 - FOSC / BAUD1 / 4)                                //FEE0
6 a2 F$ M  W% g  G- n& v6 r8 S" Z' f; V* U  D
: S3 w; U+ u: r+ K7 {. ^9 {" Q1 _
uchar code *s ="Please input the following commands:\n"
0 Y3 B! D! `8 f- t6 P. m                 "Inport  p         (read port)\n"( J. o/ T+ w' J; `, \
                "Outport p nnn         (write port)\n"% u* N) ^& B, h: p
                " where p=0..3, nnn=0..255\n"/ i2 x4 w9 L0 I
                 "Help or ?  (display this text)\n";6 j2 u/ z( M6 ^5 M4 g$ _3 e

) U+ E/ J) {: v9 m( G+ f! Z; t, Q4 J' L0 Q, D( W
uchar help(){
0 w# h9 W: R# A2 @0 X3 A  printf( "\n%s\n", Q );1 X0 K$ Z0 x8 e, Z1 g* D4 X& k
  return 0;
' ^* i% x( q& |  M6 u}) Z! _# z/ T; C9 r$ ~
8 k" z. {* P+ L# u$ j* s

) M) x' E5 }  X. luchar Inport( uchar idata *rbuf ) {+ p; \, ?% r$ S2 _% F
           uint p;
. k6 U3 y0 k7 a/ Q/ M& s6 ^                uchar v;* S3 x7 _- @9 B# S' a0 x
          if( sscanf( rbuf, "%i", &p ) != 1 )* M  |0 n5 D) O4 a$ e
    return 1;                                                                                8 B. ?! v9 J( F$ z% [2 S
                    case 0: v=P0; break;               
1 F1 I- I( _2 S9 J& e! C2 k                    case 1: v=P1; break;                $ }2 r2 @- g- `* @2 p8 w) \; R
                    case 2: v=P2; break;                0 k1 }& p- o8 y
                    case 3: v=P3; break;                7 S% H  o3 x  `6 V2 P7 T8 r
                    case 4: v=P4; break;                1 ?2 O; Z+ d/ |. j6 A
                    case 5: v=P5; break;                6 R5 `( C; ]# l) D- Q8 L8 F
                    case 6: v=P6; break;               
- D; W& ?& r7 L& ]5 D5 [                    case 7: v=P7; break;                " _. H  L9 S& C5 a. _5 \! W+ B. Q
. C0 j( m. @& `4 x3 o/ ^
        default: return 2;                        
# ?. i$ M3 H" J          }
; L% G) I& P7 z+ d$ I: s          printf( "Port P%d = %02X\n", p, (uint)v ); % \3 k0 Y6 c' w/ o$ K  n
          return 0;& B# r% a5 I) J  w& Q/ z
}! E# B. V: Q: Z; v' M5 n

2 g/ Q9 }$ o9 E. J3 L0 M2 k3 p& q/ ]
uchar Outport( uchar idata *rbuf ) {1 E- ^0 k7 r  A$ I+ N" f
          uint p, v;- N  u# [  [8 A/ X9 V$ n: P
          if( sscanf( rbuf, "%i%i", &p, &v ) != 2 )
7 w8 z8 J# Q: B1 T                    return 1;                                       
6 P+ K" A8 \7 N8 I! y# q( X          switch( p ){
( [" i! |0 N) `- N                    case 0: P0=v; break;                                                8 M2 a5 I# w" Z, M7 b- h* ]# }
                    case 1: P1=v; break;                                                
2 {: N0 {, @' W" z# Z# ^  Y                    case 2: P2=v; break;                                                8 v3 C7 X( L/ W4 c# e1 C1 P
                    case 3: P3=v; break;                                                , z, a  @% g; u3 p+ G& a
                    case 4: P4=v; break;                                                0 |, @& ]' T, x( `4 a
                    case 5: P5=v; break;                                                ( m  j+ M) F4 k9 Q% y; ]3 N
                    case 6: P6=v; break;                                                7 f5 V( l6 v( K+ \$ o$ g
                    case 7: P7=v; break;                                                
7 g6 U5 @; j# C  r" E2 R, v& ]+ X6 j2 Y
                        default: return 2;                                                        ( g3 ^# _6 h2 X
          }
) U/ u; D( \- H3 T; l          return 0;
1 p5 |$ D$ w) b! Q& H}
9 R# K3 ?" }% g0 o( e) N, l7 f1 `! H8 _) E( o% G, |

1 k9 K, |1 J  w4 j/ u% Rvoid main( void ) {
' s4 o: A& d* R9 c' Fuchar idata buf[41];
: J% E! s% [. L$ k  M  V2 V4 K/ Z3 E% F, E, z5 O2 e, u
        uchar elevel;0 \$ H; T* C3 j: e5 r1 W* ~
        uchar mjs;; v5 P4 y3 }% Y7 n( d7 t
        Qport_init();                                                                                                
; `  J2 W/ |- i5 G( U& ~! w1 q
: P0 f7 h" N' g) x- j, i. l//SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI
. F! W4 Z4 j$ O$ h//      0   1   0   1   X   X   1  0 0 G  @& K* O$ |/ r0 n
        SCON = TI_+REN_+SM1_;                                                                //0x52" P6 o9 w9 N5 T7 ^+ }

5 k! m5 ~4 e9 M- F//TMOD: T1_GATE  T1_C/T  T1_M1 T1_M0 T1_GATE  T0_C/T  T0_M1  T0_M0
' L% }% H- C; y1 w, i. H/ W//         0        0      0     0     0        0       0      07 Y/ r& b6 c8 f+ _7 d) E
//) w/ Z5 F3 Y! K. C; J
  TMOD = 0x00;
% X+ Q$ ?9 F3 Q8 Y3 ~//AUXR: T0x12 T1x12        UART_M0x6  T2R T2_C/T T2x12 EXTRAM S1ST20 r; G7 ]* L, j0 k3 j9 v
//        1     1        0       0    0     0      0     02 s3 u1 N8 [  W* ^

$ a# E" t( ^+ s' a; x        AUXR = 0xc0;
! P# P( g6 A+ x* H) {2 {        TL1 = BRT1;$ S4 u2 O. h' y, p$ z8 L
  TH1 = BRT1 >> 8;
7 }1 R- S% E% ?- X* E  TR1 = 1;                                7 r+ l7 |% `. v( S5 T8 O

4 B1 L0 ?% {1 F, a& K" c
6 b; r* F4 }" l$ j: G        for(;;){3 I% L* x" P9 G- i
7 J6 {6 E) a$ v# C3 K
//                if(!P30) IAP_CONTR=0x60;                                                                                                                                                
) ^# c1 o4 K2 r  d, q; G! A  \//                        WDT_CONTR|=0x10;                                                                        
6 h$ ]( N$ h8 j. f% R5 t/ O
6 U. F: i# U  x: g$ [& }' L+ i% J                        for(mjs=0;mjs<=2;mjs++){
) h2 p) ^1 h0 m                                        DelayMs(200);
* E1 p% X9 C1 Z& x8 u//                                        LED1=!LED1;( ?) x3 j5 L" a& Z! O; z
                                        LED2=!LED2;
' t1 K! `5 R* |% W, V                                        LED3=!LED3;2 K. c7 g/ v) N
//                                        LED4=!LED4;# N3 p. C& r) P) t* l/ P6 w
                                                }- K# P! K1 @, t7 E" [- c
+ D5 z7 Z& U' ]6 S) U
                                        help();                                                                                                                        ' ]  J$ f# ?  s! H+ E% w  N
                                        putchar('>');
8 i0 t4 Q+ y% u' D- @$ j                                        gets(buf,20);                                                        
3 T* \5 c8 H* |: R, ~4 N                                        switch( elevel = command( buf ) ){        
. p* k* H; J5 g/ ?% ?. D                                                case 0: break;
  x! G6 T8 E/ q- x& }; w; r  p$ T                                                default: printf( "Error %d\n\n", (uint)elevel );}
' X: o+ }3 l3 G5 f0 x                }
( `/ m# Q4 m+ \8 l) M) M        }
" _0 ?9 W# R* X. }/ Q" G) s
3 P9 J- ~4 u% ?9 c, w//命令解析        
9 g: s5 n, c% V2 [( J9 [#include<stdlib.h>
, a% z+ B, B( e  R% \#include<types.h>
% U4 l& }3 f; b: U' o0 ]/ N  `8 ~( M1 }5 X5 K8 O# e
typedef struct {
3 M( |5 S: E: d- F) @          uchar code *name;. _6 @& W% z3 }& n
          uchar (code *func)(uchar idata *);) u- p& J9 B/ H
}comm_struct;
- |! b. h$ k, [* w0 }
  P% m$ t1 I+ _+ |" x
0 ?; D3 Q9 Q: R' y! O, P2 Ecomm_struct code comm_tab[] = {                        
* H. {4 G( ?) I: O( a6 i5 e: n                "Inport", Inport,' L; l  W5 [) U0 j! S8 V6 E
                "Outport", Outport,
' d2 m& }4 Z" C, ^                "help", help,
: n, T: y& b3 k6 l                "?", help,
. O5 D" k, o" T* h/ @* b                "", NULL                                                        
4 v+ ^  E5 G5 m* T};' @* u/ M. b, f6 C0 v+ N

2 S4 H/ S" a* t  _9 U% K! e+ a8 n+ s
uchar command( uchar idata *buf ) {
" \5 u* T! P0 b( s7 ]! Q          uchar i, j;                                        0 h, N$ ^8 e4 M1 X
          for( i = 0;; )
' G& L8 y8 `  ]7 {% _                    for( j = 0;; ){
: N! f( D! L0 C4 M8 U                      if( comm_tab[i].name[j] != 0 ){2 \' o; f5 J8 m& x' I2 z' o
        if( ((comm_tab[i].name[j] ^ buf[j]) & 0x5F) == 0 ){
* A3 A! e+ ^; ?( p                                  j++;( o* `: f# b1 Z* K/ z- s
                                                  continue;                                
: }/ c, ^6 |. Y: [                         }  ?- s* k7 \" U: a+ L/ \3 e# z; D- j
                                i++;
7 u% V: z! ^. P+ u8 k        break;                                 
5 ^; o4 j% r, B' k                      }
2 N3 E' J( E  a5 D                      if( j == 0 )        return 255;                        
% z) q& M6 g2 J# e3 ?                      return comm_tab[i].func( buf+j );        5 e* c$ a. i$ L" B/ b4 s
                    }
7 e8 R% ~/ Z( `( l: O# u7 ]) D}2 S$ J) e$ q$ i  i% x

该用户从未签到

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-8-11 16:46 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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