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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
//在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)
1 C# J. q/ Z0 f/ ^#include"STC8AXX.h"8 ~% f3 j5 E2 s; L
#include<stdio.h>
; v& I! O' X0 [  z2 k7 [3 C#include"types.h"& L# V; L( i; r( j% E# r9 O
#include"Qport.h"( o; e2 U. g7 j& v
#include"delay.h"* |( Z" h* _; w' r3 s: S

, \& U# T# Z8 q; g: f$ F  _+ D. R$ E#define uchar  unsigned char, z2 {9 c8 |$ {
#define uint   unsigned int        $ H% w1 u* \) u% T; d; K8 P
#define FOSC    11059200UL
: O) V6 s3 b2 l#define BAUD1                9600UL- W; v0 P( \/ y& q
#define BRT1    (65536 - FOSC / BAUD1 / 4)                                //FEE0( R% t- d+ g: Y' H% H+ }1 @" J$ M0 r

( n6 O( ^0 E" F& y: N" \0 o+ D3 `  m2 R$ W: {
uchar code *s ="Please input the following commands:\n"
$ }+ I4 A2 c) }) ~& b3 X                 "Inport  p         (read port)\n"1 C6 N! j4 }1 r5 N
                "Outport p nnn         (write port)\n"
' e+ X/ B, T- ?" Q: [) T0 _                " where p=0..3, nnn=0..255\n"
4 F( {. A' c& [- ~9 N" d' j- f                 "Help or ?  (display this text)\n";3 \4 ^( y3 K& d; b
- v7 R! L) c3 b3 Y
7 ], W/ u+ {1 r1 g2 r- [: b% E
uchar help(){1 G3 t* g1 q& |" r4 n
  printf( "\n%s\n", Q );/ O* Y9 I8 J& m6 e( l; A. e
  return 0;
9 @' ?; j5 [' I4 l}
4 o* s1 l7 u/ ^7 C, N  E$ m/ {. x0 I+ d# n9 G' Z7 t

" E, S+ O( ]- s# |* N8 Ouchar Inport( uchar idata *rbuf ) {
% Q7 j/ m$ r1 J           uint p;( y' i' j7 E) c$ u' ^
                uchar v;
  I# _& |. T( g% o# q; f! Q          if( sscanf( rbuf, "%i", &p ) != 1 )
, A& I/ ^7 i+ ~* J6 B! X0 f    return 1;                                                                                7 {/ Z$ x+ @* V" N/ Q; C
                    case 0: v=P0; break;                ' D4 W- j  a( G2 Y& T& {) U
                    case 1: v=P1; break;               
; g4 ]: ?9 ^+ E( A1 c                    case 2: v=P2; break;                . e% Y2 D9 K7 S* G7 N" h
                    case 3: v=P3; break;               
9 L0 A) |0 P* Y! e: n                    case 4: v=P4; break;               
9 R; {, r) F- g" A                    case 5: v=P5; break;                0 W9 T$ ^5 l+ T7 v& v. E4 ]) x
                    case 6: v=P6; break;               
' N9 _6 I* n  ^  a' ^                    case 7: v=P7; break;                ! ~+ ]8 X5 y2 n& p: i5 f

9 }; B/ a, l0 w% A        default: return 2;                        & n9 ^2 _7 Q! a+ K) ^' _# b+ q
          }( B/ Q2 E1 j; t. r
          printf( "Port P%d = %02X\n", p, (uint)v ); 6 S' [7 v  E' ]3 J& d
          return 0;$ c  u6 w8 [- c- L6 N% H
}
8 M) ~; l6 ^; y' b; j0 P; W  z- O- H' [& V
5 N6 x$ C2 V+ C2 q0 h* g& p
uchar Outport( uchar idata *rbuf ) {
9 o4 I' P. h% H7 P3 t, w" ?          uint p, v;$ _; \, W5 l9 C+ H: O/ u+ x
          if( sscanf( rbuf, "%i%i", &p, &v ) != 2 )& T$ q: n' [8 x$ ~/ e. l
                    return 1;                                       
- W- C8 ]; V1 X. ~+ s          switch( p ){. h* p) j1 @1 d& W; @4 g  [
                    case 0: P0=v; break;                                                
7 r  P! U% g% n, \                    case 1: P1=v; break;                                                ; t, I# L6 W0 o8 _6 Y2 P( c
                    case 2: P2=v; break;                                                % M. ^% p+ p. T( X' B8 o, P) D( c# E( w
                    case 3: P3=v; break;                                                
. w+ i- U  f2 C/ n5 O3 ]1 F                    case 4: P4=v; break;                                                
) R4 O% ?% K! M' {$ U: l% [                    case 5: P5=v; break;                                                
- J; X3 S0 q" e4 I1 z5 @1 X. M- j. m                    case 6: P6=v; break;                                                
1 \- C; x& J5 y9 O0 i) Z# K9 Z                    case 7: P7=v; break;                                                
) v) @' K% D" y$ l, u. p- ^# q' S: p( F& S8 K! H
                        default: return 2;                                                        
4 G$ [8 _) R6 P          }
  Y9 Q* _1 b8 M( n" K# f          return 0;1 Z8 H. q2 J( t* m7 A7 `7 c
}5 m+ r1 O8 s- C+ N1 _1 r+ ~" m
9 W6 u( _: \: e! m/ A
. U+ S2 X. D: H7 ~/ @
void main( void ) {+ j4 l) A) B( g/ ?/ U  ^) k6 i" G
uchar idata buf[41];
$ _3 Y5 h% r$ Q2 k# S* Z
3 Y$ I; V( [3 H/ e4 f+ `8 \. _        uchar elevel;) x  _3 L1 [8 U+ k+ h9 N4 L4 y
        uchar mjs;
; S- y5 w$ q( Y) j7 F7 @        Qport_init();                                                                                                . ~& @+ i! m3 C; ?- e
8 n/ ?, I0 h  g9 R- n# P
//SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI
4 e: y  H2 Z, w2 r5 ~$ I1 {//      0   1   0   1   X   X   1  0 , o* W. @: ?, R
        SCON = TI_+REN_+SM1_;                                                                //0x52& H* v" n2 B0 d/ Z: a

5 ?) @# I2 h% B( A$ o' s  N//TMOD: T1_GATE  T1_C/T  T1_M1 T1_M0 T1_GATE  T0_C/T  T0_M1  T0_M0
. i7 S9 n; O, F) }# t3 o% h//         0        0      0     0     0        0       0      0
7 y2 A! \3 L7 s$ o+ d//% i" y, D# k7 |: Z
  TMOD = 0x00;
/ F6 k1 |9 W8 y3 ?# O//AUXR: T0x12 T1x12        UART_M0x6  T2R T2_C/T T2x12 EXTRAM S1ST2. K! |, \+ @% U) N* G4 x% W1 B  N0 L
//        1     1        0       0    0     0      0     0
# }4 F/ Y$ b/ L. B( i
7 y: M/ M9 B7 h8 i        AUXR = 0xc0;
! k$ T/ z, V( k        TL1 = BRT1;$ j# S" x  @$ A* {
  TH1 = BRT1 >> 8;4 E. S4 R' w4 J7 U  m! \( B; r
  TR1 = 1;                                : \/ X# G5 P( h. k' A

# N+ T# j6 s8 y! V3 V+ u8 `. S4 l
        for(;;){
- b9 @; H- b( U
3 v' P. C" P# y6 y8 v, E$ `//                if(!P30) IAP_CONTR=0x60;                                                                                                                                                
8 _- o) F9 ]0 s) s//                        WDT_CONTR|=0x10;                                                                        
' v9 @3 T% P/ S# G9 Z4 H! x! f/ Q2 d. E
                        for(mjs=0;mjs<=2;mjs++){
- @& |0 v/ t& v* S3 ~                                        DelayMs(200);
: ~/ e7 u* k. i" l" u. }" q//                                        LED1=!LED1;
' c8 E/ m3 x, Y- A  }" j                                        LED2=!LED2;. E" I3 z8 E3 ?1 x- b4 F0 z
                                        LED3=!LED3;
4 D% g- F1 j; p% c//                                        LED4=!LED4;4 ]: n0 l7 b$ @$ [1 b  Q
                                                }
2 Y1 {3 N. g. I- o0 h3 L/ y; t$ D* W( u  H, C/ L! Y
                                        help();                                                                                                                        5 u8 v' M5 r4 }. }
                                        putchar('>');8 w2 N4 @% |, ^5 P# T: J: g
                                        gets(buf,20);                                                        
0 Q8 G2 I! ?, i7 W. U, p6 I                                        switch( elevel = command( buf ) ){        
* p0 I# y1 t& M0 Y; ]                                                case 0: break;
, E/ ^3 |: b. }                                                default: printf( "Error %d\n\n", (uint)elevel );}
6 E, ]9 b( \. h  x' K6 c7 q) J. [4 g                }
7 O6 b- C& E; x; L: G        }$ p* x- z' h0 A! c
5 m: h* h+ N- h, `
//命令解析        & {( w  f. ^+ `
#include<stdlib.h>
3 x; ~3 @  y6 N' {* \# H* j#include<types.h>
7 l. _- a4 L1 h1 F4 k9 Z3 i5 A* a1 w8 h* z$ m
typedef struct {1 w: R1 }& i/ A# V
          uchar code *name;
2 H# j6 h5 s0 P% T) L0 }6 b. g1 t, l          uchar (code *func)(uchar idata *);
* R" o0 w0 j: S  d/ C}comm_struct;
8 S" Y" [+ Q  k- d  N/ ]+ a: I0 g. w9 t; ?8 h
7 x! u9 M4 E4 B5 N+ {8 c. Y
comm_struct code comm_tab[] = {                        
3 M* `6 E$ `" \8 P                "Inport", Inport,) e, b  a( ~$ z0 d
                "Outport", Outport,
" o  I" o: ~/ I1 C2 S6 a  z* F                "help", help,
2 y3 Y8 {! a* N+ ]' ^+ l9 B' B  L# ?                "?", help,, J$ Q' c+ n" \; t# H3 z" x
                "", NULL                                                        # c& r1 d9 j9 I! y
};
$ H! n$ I1 i, z' }+ S% t8 E& G* k9 y# n

" {1 l% h, j& |7 Zuchar command( uchar idata *buf ) {( e$ K2 m- |  f
          uchar i, j;                                       
0 ^+ q5 t/ K$ l3 ?% P          for( i = 0;; )3 k+ x5 l8 U% {8 M
                    for( j = 0;; ){( D6 ^, z+ {' y6 V# ^( r
                      if( comm_tab[i].name[j] != 0 ){
" u4 Y, w( [% v        if( ((comm_tab[i].name[j] ^ buf[j]) & 0x5F) == 0 ){" f  Q0 t+ z# A# i
                                  j++;7 a: r$ z9 g! K9 Z1 }
                                                  continue;                                4 ?) V( u6 q9 i
                         }3 B' V( p  v) ^( p* c5 x
                                i++;5 V: O8 r$ Z7 L  l7 w* Q
        break;                                  0 [" Y. [' V/ r3 L- G% o
                      }
, B- b( |- n/ K2 a- R# n: A$ Z                      if( j == 0 )        return 255;                        
$ U5 n  P$ L1 t+ m0 a$ V7 K                      return comm_tab[i].func( buf+j );        
  J# l, w- X! B! A& L( @+ W                    }7 C: ^) W0 T, U1 B5 G% w0 `
}# i" q# f) d1 W& d, Q! n1 V

该用户从未签到

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

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

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

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