|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
//在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)% b4 ?: U/ j T: n2 \
#include"STC8AXX.h"! v( |) F' H& N5 p
#include<stdio.h>
! w3 {& [% G. \! j7 p% \, n4 | H#include"types.h"
" p; O" U- s% p9 p8 h4 ` j#include"Qport.h"1 D. Y/ u% x6 F8 A5 C. Q- g. s
#include"delay.h"
3 ^3 @1 y0 \& b0 I
O! s( z) Q' Z9 R#define uchar unsigned char
; y* E1 |& k9 i# ?& @#define uint unsigned int
! S. O w2 g; n# X) `#define FOSC 11059200UL
0 F3 z& `/ M4 T2 Z& f#define BAUD1 9600UL
% L5 d! H. E1 H, o8 H#define BRT1 (65536 - FOSC / BAUD1 / 4) //FEE0
5 l0 Z6 ]3 U8 k* x; o4 r# k
* l# V( u6 O! ]1 x! q% _ X2 p
7 t- A9 C( y' B2 P- a4 e" Luchar code *s ="Please input the following commands:\n"* _% Q* Q' p" R2 X1 D# K- K, [/ Y
"Inport p (read port)\n"
( o$ ]6 c* w- Z, _ "Outport p nnn (write port)\n"# a8 E) J" g9 G: S+ c2 Z# j
" where p=0..3, nnn=0..255\n"" P0 L, T$ U) _
"Help or ? (display this text)\n";' t1 b. x# T) n3 C7 B% ]
/ ~2 N* f X6 T) b# t3 s' e' I1 ^# L; p3 M& h: j4 T/ R
uchar help(){) z# z1 s% i, A9 d
printf( "\n%s\n", Q );
8 d, J8 P* ?2 e4 I/ t; H return 0;* Z" V( @* _) Y) z4 G) {
}
) Z, [5 Y7 v, j1 q: E2 ~6 v# q; H* Z
R; A% |7 B5 Q1 F: p, K2 C
uchar Inport( uchar idata *rbuf ) {
, r, o6 ]/ {# T: Y uint p;; E3 \5 p9 l7 R# y( a
uchar v;9 y+ [6 {4 ~2 O/ _/ f
if( sscanf( rbuf, "%i", &p ) != 1 )
" @- ^0 F8 X y2 o# N4 i3 d! T4 K return 1;
r9 x X; p+ i! c; r D: ~! \ case 0: v=P0; break;
. n. r6 t5 b z) A case 1: v=P1; break;
/ a7 l/ t9 _- y4 e4 e1 s' C case 2: v=P2; break; 9 b$ _$ y w# x. N$ z/ K
case 3: v=P3; break;
' Q3 a: z* Q& t case 4: v=P4; break;
, j! D: M8 a7 F case 5: v=P5; break; : d% G' P N, ~8 r# h3 c' M1 k
case 6: v=P6; break;
( A* @+ e0 Z% I' y! E% m+ r case 7: v=P7; break; * _ E' p( @: d* F3 o* [3 \4 W: R1 w: Z
: x5 o# a4 @" v$ A3 h# w- D
default: return 2; $ W3 @) _: \( r* R
}, B. f1 B) |/ A) v0 v2 q
printf( "Port P%d = %02X\n", p, (uint)v );
: m+ V/ d5 v( d3 @& o" k2 r0 E return 0;6 F5 p3 _$ [3 H& Y1 H
}# X! e+ N' T, K# y# \
o3 L' X4 a+ f# X& k
1 s8 f. L1 v5 V5 m+ t% Yuchar Outport( uchar idata *rbuf ) {
! S2 T0 M) C$ G9 n6 }4 E/ \* }* ] uint p, v;3 F$ ~; \ ?0 ]/ S% p
if( sscanf( rbuf, "%i%i", &p, &v ) != 2 )
/ |& Y5 ~9 F" R& n) I6 ~5 L" W) Q2 n return 1;
" }4 e+ g% J- M+ n switch( p ){9 r! g% {7 Y5 K
case 0: P0=v; break; 3 {% T( X8 R2 g9 G: w/ B
case 1: P1=v; break; 3 v% o6 ?3 {: x, G: e
case 2: P2=v; break; $ ]- s5 c; O! d3 S
case 3: P3=v; break;
: I6 p" g+ Y# q: d9 r9 b1 T case 4: P4=v; break;
0 R* n) N' ]+ U2 y# C x: D4 P0 f. A case 5: P5=v; break; . \- d( [( E6 N! [
case 6: P6=v; break; ! ]1 r+ k. P! H
case 7: P7=v; break; . k* h! ^- M( H k5 z% ]1 A
8 z* s" k% f/ p) \! k
default: return 2;
! m( F: g. k! G2 w }6 t. G* Z+ F, |5 ~; Z; H
return 0;
* Y/ i( j' L% X/ _4 n}
3 K& _. {* B! S, T. O% M- Q3 G6 ?4 b L, {4 v
# R o v1 h; i/ _* s+ {& \void main( void ) {4 @' e+ y2 g% y; u* b7 [
uchar idata buf[41];
# F, O( S& J# z+ r; S- K7 I2 f0 c9 {% O/ N- K6 y
uchar elevel;
9 @" o9 K1 z+ ^' h1 u) U uchar mjs;
- |9 I: v4 u+ }( Y( O! o Qport_init(); 5 |1 c+ J: l7 R( u; [! E7 P
/ H O' {! a5 ^6 P) P
//SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI `- C$ t% p" h! C9 M+ T1 Y
// 0 1 0 1 X X 1 0 9 m8 I5 |# c0 P5 e4 e* S! c0 _
SCON = TI_+REN_+SM1_; //0x52
2 C9 [ K+ m- b0 y8 p; I: l9 D5 F; v
//TMOD: T1_GATE T1_C/T T1_M1 T1_M0 T1_GATE T0_C/T T0_M1 T0_M0
2 e8 a# t- M5 T! h// 0 0 0 0 0 0 0 0- I, g+ Q8 d+ p7 ~ I
//$ m3 O7 j. w& |2 i: `: j) a6 r5 }7 W
TMOD = 0x00;8 L* g- K/ `+ ? L5 c
//AUXR: T0x12 T1x12 UART_M0x6 T2R T2_C/T T2x12 EXTRAM S1ST2. p9 w5 y8 {! [: h$ R( D" ~) e
// 1 1 0 0 0 0 0 0+ F, x. ]* W, y* M* t# y
/ P& @( k& v( Y9 q* Q# ]; u
AUXR = 0xc0;
( n9 y; |/ N5 U TL1 = BRT1;( j1 m- a0 A' }6 ^8 w" ]" [
TH1 = BRT1 >> 8;
) p: i7 Y! s- }) o1 n3 s3 J7 s, h TR1 = 1;
/ C0 J1 h4 X9 p. ?
. v. C5 d/ V3 {8 [
, q- I) C& R6 w0 P for(;;){
9 d( H" I0 L+ ^0 A" c4 i
# c1 d# |' E8 a1 f' M. |" [; O// if(!P30) IAP_CONTR=0x60;
) x+ t& C8 Q) J9 D3 t! [" w8 Y4 W$ }% q// WDT_CONTR|=0x10; ' d$ N& f2 N1 K& w7 l) K' M
: y. P0 S9 x4 X1 T6 e
for(mjs=0;mjs<=2;mjs++){
( Y+ q4 o- f1 J% m1 s% L DelayMs(200);
+ R' ^( c2 h! }" t// LED1=!LED1;% A3 T7 ` L( d; u# c& n3 _
LED2=!LED2;7 {# \! `$ f4 g8 w p% V& a# f ^# l
LED3=!LED3;8 \3 b, w3 q- ?, h5 X9 g4 i4 {
// LED4=!LED4;
0 Q' Z. R* B& X5 A9 |( ` }% H, N; a; S7 I
! a' C) M" r; ~ q8 G( c* F0 D help(); ; B6 m4 x5 @; n
putchar('>');% _* D: i$ y* E; U* w6 ~& F
gets(buf,20); 6 s. h/ X4 o3 K$ g
switch( elevel = command( buf ) ){ / B) Q% B: }4 [; O3 {( C% u
case 0: break;6 b# r* j! X5 Z: ?& E; q5 r- g* Z( l
default: printf( "Error %d\n\n", (uint)elevel );}
p0 p7 r; p$ q) E7 i: t K }
/ z1 K( v1 Q9 Q# _ Q7 X% ` }" _8 P% L7 Z# B8 ~# E' x' N
6 G2 P* z3 A8 g
//命令解析 ; y( D4 _: P: t+ q
#include<stdlib.h>- F6 [! c7 r( \9 O2 ~$ X. T6 z
#include<types.h>
, Q. m# e+ G5 M ]- w( s X& \! @; r7 c4 M" o$ y( M+ O1 k* J; ?% v
typedef struct {
) E( S' ?. b4 N9 b uchar code *name;! E3 |! n( h) Z; C3 o. q1 z
uchar (code *func)(uchar idata *);
2 P# v2 {7 ]* V8 e6 d) {}comm_struct;% l! {, ~# ?% w0 o7 k9 Z
7 T. y% Z0 P6 W, C5 ~2 r9 T
# n) z; A/ P* v4 `- Jcomm_struct code comm_tab[] = { # A# f+ x/ E) B/ z4 y. d/ f( E
"Inport", Inport,
# [ x$ s/ V; y. I% B5 I "Outport", Outport,9 t8 b9 p! ]3 a# M% R
"help", help,+ p- [' n# `* K# e
"?", help,
4 y! y! L, R l5 @' X/ e" T$ C "", NULL % _) ~, u; A/ }& v g5 F3 g
};$ W0 E8 Z, g. _
9 J2 ~0 l: f6 Y" Q* N. T
. o* [) c) d+ Buchar command( uchar idata *buf ) {
( o$ ?# e, i5 C! @# u: T uchar i, j;
, n/ J& h2 v' L) w( ~ for( i = 0;; )
7 |1 p# c" ~8 d# L for( j = 0;; ){& O. u2 f/ r6 P j+ w
if( comm_tab[i].name[j] != 0 ){
# q9 d H I. B5 z! b2 h2 d, v$ @ if( ((comm_tab[i].name[j] ^ buf[j]) & 0x5F) == 0 ){
7 d8 ]1 j0 `, ?1 S j++;- a- L) l S$ ~6 n. m7 d
continue; % _9 w% k6 {; D& j0 n8 ~& f
}
+ |9 w5 v% t% n& e6 U i++;0 {3 B* n+ \' `
break; ; G# B0 v7 `4 g
} F4 R- Q* {, g/ d. `2 E4 A a9 d
if( j == 0 ) return 255; ! V6 ^# j* L0 A$ a8 h& K
return comm_tab[i].func( buf+j ); . S. z- T/ z5 s+ J: b4 ?' e
}$ p# N6 O$ E: o4 w# Q5 z
}5 d. q8 z) F* n1 N& x7 Q( _
|
|