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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
//在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)8 ?! P! M  u$ C8 h) L) e2 B
#include"STC8AXX.h"
1 k3 C6 F, D. y5 [, x; q3 l#include<stdio.h>
6 K1 d2 e% n* a& D) A& A* @: d#include"types.h". p/ z# p" J8 p1 g6 o
#include"Qport.h"
. Y2 ?: y4 y- t* Y) H* ]9 C4 c. z9 T#include"delay.h"
5 E2 D4 e1 Z8 U% K% @4 ~4 C/ u2 `  v; f4 ~& o) l" z3 w( k
#define uchar  unsigned char
: P1 S% z# q8 }9 L#define uint   unsigned int        ; L; Z- I( Q0 J, Z
#define FOSC    11059200UL4 Q  e( r& Q  m; w4 ?. ~
#define BAUD1                9600UL
  c! Z3 X* P+ Y/ R) e#define BRT1    (65536 - FOSC / BAUD1 / 4)                                //FEE0
% H* L  l/ u& Z7 m5 I# P3 p' A( ?; Y/ n2 x* x# @) B

: H; O1 f5 m! [8 j0 ]) r- auchar code *s ="Please input the following commands:\n"
" j" U. X6 |( X% v                 "Inport  p         (read port)\n"5 a( X' B- n& M7 ?0 G; g( X
                "Outport p nnn         (write port)\n"
( K- }2 j! G3 d: U/ H                " where p=0..3, nnn=0..255\n"
, A. p5 ?+ p, S9 S                 "Help or ?  (display this text)\n";
+ M# R+ u! s$ K; f- W6 `! v& V# W6 h8 ]) \1 G! R9 o" B8 L6 N: |
+ M. q5 y) B: X+ R: m# o
uchar help(){
5 `& U# l1 K. f% s  printf( "\n%s\n", Q );5 U% ~6 ^8 ^1 f& b: o
  return 0;
! j) x* {$ c  E8 Z}, S- A! M& W+ G8 _
" `  `  i  v5 A2 D. D) G% H) I% U
" H0 ^1 P  e- Q  z. D( k4 j
uchar Inport( uchar idata *rbuf ) {
% g% N2 t1 G9 e6 z           uint p;& K/ S) P4 `5 t& |5 x
                uchar v;) S4 \* H8 L2 \) Z: s$ u
          if( sscanf( rbuf, "%i", &p ) != 1 )4 g3 Q7 S6 \+ y# u) C
    return 1;                                                                                ( c! w  C) L! r' L  i- e$ ~" e2 I* s
                    case 0: v=P0; break;               
8 x( w: o* `/ ]. W  i5 k: j                    case 1: v=P1; break;               
6 a: b1 F3 B+ E9 l+ R                    case 2: v=P2; break;                3 v$ @& K& H* L4 _
                    case 3: v=P3; break;                : P) q( z: _5 [/ y# f* ~
                    case 4: v=P4; break;               
. Q) m6 k3 t- p5 l1 w+ J7 k% q                    case 5: v=P5; break;                5 j3 e! p8 N: x
                    case 6: v=P6; break;                ( ^& c7 |4 z( c( S
                    case 7: v=P7; break;               
* I% O$ l9 o- ^# |. e- R) E4 [0 o  G1 i. F1 ^
        default: return 2;                        
9 R' w4 u' D+ p          }
6 u( A0 B& R# `) d          printf( "Port P%d = %02X\n", p, (uint)v );
$ Y3 v- e: r3 u; Y5 k* ~( V          return 0;
$ |8 `! _. Q  q7 x# j0 ^}
% T7 I: N# y& j+ Z+ H( r2 h4 R6 ^5 a! H" N
- T) v4 _+ j( j) H) I/ ]
uchar Outport( uchar idata *rbuf ) {
$ N' p$ D! ~* D3 f4 |5 }" u          uint p, v;
7 y7 W) W/ v! I          if( sscanf( rbuf, "%i%i", &p, &v ) != 2 )* ]# M. ^  B2 S5 E! A! n  e
                    return 1;                                        9 F, k% ?; _4 R8 N& |; f
          switch( p ){8 l4 }7 Q. S" |, T) C
                    case 0: P0=v; break;                                                
, i1 x2 @0 \; j3 @                    case 1: P1=v; break;                                                : [6 e& v0 c$ t
                    case 2: P2=v; break;                                                3 [$ t4 `  ]  u+ l3 a! j: D  H/ @; ?9 ^
                    case 3: P3=v; break;                                                . D. F) g! w1 p* J
                    case 4: P4=v; break;                                                
: X- ^8 Z9 j% L5 Z0 D                    case 5: P5=v; break;                                                
, z: W" e0 `: ]                    case 6: P6=v; break;                                                
* `2 F" I; c9 Y2 N( W6 \5 y                    case 7: P7=v; break;                                                
4 H# X' a1 X) V( O+ t1 {3 ^# B  D( _, C) u6 U
                        default: return 2;                                                        
- A  n  n; w! @. w+ O) A% w          }
9 x8 S# W% R9 f. m8 I          return 0;/ H/ h2 F$ [1 W, Y7 Z( s: j; J
}8 Q# p" `3 t- ?& w) F

" O9 i  o8 _9 W3 S. T  w6 T5 |  ]+ C" f5 o9 [6 L
void main( void ) {
+ S/ h8 D( m  n+ G! C* q/ Q3 euchar idata buf[41];
/ S- \; B, }3 r" V" X# _
) r! P- P& k/ i0 P        uchar elevel;
+ ?* {' m' V1 b' S+ H        uchar mjs;: b, [. x- z7 O9 s2 N
        Qport_init();                                                                                                ) G0 L4 }6 d4 B0 i+ a; d+ a, ]
5 n5 u# Z0 L7 P+ i, @
//SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI
3 ~: o  ]3 V4 m//      0   1   0   1   X   X   1  0 / w+ b- [0 r& L( G  T
        SCON = TI_+REN_+SM1_;                                                                //0x52, C! a0 e# x9 L1 s

' X; |6 f& X" A$ p) k" n6 M//TMOD: T1_GATE  T1_C/T  T1_M1 T1_M0 T1_GATE  T0_C/T  T0_M1  T0_M0
, J2 m8 f" x5 r//         0        0      0     0     0        0       0      0
8 R9 X3 D: t: A8 g8 r" f8 K//
: a* P! O! q" w6 C! \  TMOD = 0x00;
# T9 R* j1 k/ _9 R: c//AUXR: T0x12 T1x12        UART_M0x6  T2R T2_C/T T2x12 EXTRAM S1ST2
* x9 D  v' }" B! D% T+ Y//        1     1        0       0    0     0      0     0
% G# |( j7 u$ @& e
' E7 \6 F- }0 o+ r( d% ^$ ?        AUXR = 0xc0;! {$ {( J( e, l/ D& U' X
        TL1 = BRT1;
6 u/ N9 r6 O6 u% i' M  TH1 = BRT1 >> 8;
, j4 N& e7 x* G  Z- M7 v* l5 z  TR1 = 1;                                # P5 i. y+ J6 {2 Y+ r. a* H
' P$ p4 T( K3 I! X" J* \0 B' ?
/ `( O2 I0 w: ^/ q$ Q. N  m
        for(;;){% Z7 W/ y) H0 Y: `! @- L6 [0 J  i

$ ?' l2 H: }9 P: W7 |//                if(!P30) IAP_CONTR=0x60;                                                                                                                                                : }: _- U1 e4 M4 l* P
//                        WDT_CONTR|=0x10;                                                                        
# I; i1 [5 z! v# Z- O; @$ ?3 B  ?
+ w7 K9 f9 `! g% F                        for(mjs=0;mjs<=2;mjs++){# w1 g! ]; l/ k% O+ I' o
                                        DelayMs(200);- l  `3 r6 I' _% Q
//                                        LED1=!LED1;
+ U3 H. D! g6 j* q0 H) D                                        LED2=!LED2;
' i& g8 y; U/ G+ g' R                                        LED3=!LED3;# s, A: h/ z) M2 s# Y3 b4 z: a
//                                        LED4=!LED4;1 \2 R+ }5 t! M
                                                }3 n+ U. L" V- W* e  {$ l
5 i# K- p5 J/ ?( T* Z( O
                                        help();                                                                                                                        
' ?  i. d) F+ g: n. `                                        putchar('>');
0 p6 b  Z2 k4 N* G% x- w                                        gets(buf,20);                                                        
4 P: ?* H( x6 B; O3 y. @                                        switch( elevel = command( buf ) ){        
% P8 G: I) W! d6 n. S6 \0 L                                                case 0: break;5 |0 N5 l3 O2 V: g
                                                default: printf( "Error %d\n\n", (uint)elevel );}
4 t7 M0 X8 P1 Z                }
# H% x, R( b2 c5 I        }
0 n. \  R0 v4 o& \* K1 P5 m* M) e2 `* `2 Z
//命令解析        5 |; A- F5 A8 F* t# R% h
#include<stdlib.h>' P  Q( B( B3 Y
#include<types.h>
6 M0 ^; P8 H3 L- i
5 A5 `9 M" l- ?typedef struct {
2 ^, {+ z# [. `/ m! ~; \  d2 L          uchar code *name;
6 p( V3 r/ V0 _: U; a          uchar (code *func)(uchar idata *);
# r; K! j2 s' C$ d}comm_struct;
# n; R2 v: B- T0 T* r% F- P% x
* Q9 t- g4 z; p% r8 s' M5 [+ [$ b
" ?+ T# N2 C1 p% H6 r- b+ J* b0 U! ncomm_struct code comm_tab[] = {                        
  E. T) S3 Y- a: D. R                "Inport", Inport,1 C' ?7 P3 P0 R' v
                "Outport", Outport,
# d2 T; c+ W) z( f/ r2 [$ X                "help", help,
: G2 ^+ b/ M6 e+ x( r, ~; ]                "?", help,
8 V" w; c' ?/ s                "", NULL                                                        
" p/ w5 y1 S2 q};$ v$ ^) Q: d: H8 L6 `( ~& C
4 e& a4 {  A' s+ ?, ~6 v- l) F
; U) \$ B& g0 d8 J
uchar command( uchar idata *buf ) {0 \9 ]$ G9 }1 t0 ]5 X+ C
          uchar i, j;                                        ) S: w1 r, k& @# S0 x" @4 I$ |
          for( i = 0;; )6 P% d; @' F0 r: B1 h# O5 Z8 M8 N
                    for( j = 0;; ){: T; ?% Z7 ]/ }9 U" B" ]8 C; e% G4 s
                      if( comm_tab[i].name[j] != 0 ){3 B9 k1 }7 Z  L1 K6 L* Q
        if( ((comm_tab[i].name[j] ^ buf[j]) & 0x5F) == 0 ){4 H1 u6 p8 k( V4 a
                                  j++;
! a" B$ Z; |1 b, n; F/ e! o                                                  continue;                                
5 V( \- B" \2 x- A( ?- k9 |! B; b                         }% ]3 O+ ^5 s- o' G! h9 U
                                i++;
( o$ U& U% @, G, z7 D2 ~: [        break;                                 
' Q" {9 h% S9 W$ U1 z2 v                      }
' q. b( ^2 M# R/ ?" k1 M9 q8 Y# Y                      if( j == 0 )        return 255;                        2 Q( F2 J6 s0 X; w! n3 B
                      return comm_tab[i].func( buf+j );        9 G/ X7 a% |2 p5 ?
                    }
! p& Y1 n2 H- j}8 q: S- [3 s9 u2 R1 ?: a" j

该用户从未签到

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

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

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

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