|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
//在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)! v0 n$ I+ |$ i) U p
#include"STC8AXX.h"
* Y6 O& V" y- G# M2 a6 l$ E" N$ V#include<stdio.h>
3 V+ r. ]8 }5 H- M' G#include"types.h"( z( ?" i+ N/ R( ~ z: g' a
#include"Qport.h"
& _. T, o* ]+ L" O. d#include"delay.h"
}! @ @+ t8 ]; X7 h. n7 {# H' d+ V0 j1 u) ]5 C/ u$ j* E( Q
#define uchar unsigned char
" x p$ f$ n- @; b6 }* b# z#define uint unsigned int
6 G: Z$ q- Q2 J- d- m; O7 g3 {#define FOSC 11059200UL
. _$ z3 [2 h, l$ p0 @#define BAUD1 9600UL
; q8 f2 f! q+ G4 Z# z5 |#define BRT1 (65536 - FOSC / BAUD1 / 4) //FEE0: M# s. ?3 m$ [5 h z
) L( \' u( S5 m- M5 f
, W- @0 p& d" H- vuchar code *s ="Please input the following commands:\n"( J5 s. P+ I ?
"Inport p (read port)\n": H, \" X5 W. f0 Q$ i8 e; b6 _
"Outport p nnn (write port)\n"2 W1 L8 G* X }. m
" where p=0..3, nnn=0..255\n") a% s3 h$ Q" X l. ^" G% z
"Help or ? (display this text)\n";
: ]9 _; k+ ^# `6 X7 B3 k( O7 u
1 N3 S8 x, y: A7 I5 R, M3 U8 @# G" p( [1 z! H
uchar help(){
9 ~0 [& v* C% C. d* j- c' ]+ Q printf( "\n%s\n", Q );
; E ~3 [# X" n" g3 [ return 0;
$ j) ^8 ^3 { a, @, M1 m}
' `4 ?$ z v7 q, O* W2 t( y G
3 `! [( D, w! E
, c4 R2 j9 }1 [7 Ouchar Inport( uchar idata *rbuf ) {7 n! o& V2 [3 w- C7 i7 w9 M4 G
uint p; ?- R& s I! k+ h( p
uchar v;4 {: \8 q: T. S# P
if( sscanf( rbuf, "%i", &p ) != 1 )
& I- H X1 _. q# _2 B7 h return 1;
4 a- g* A3 Y+ E, g case 0: v=P0; break;
) }, |; I, F' I) ? case 1: v=P1; break; + R/ o3 ?+ I6 H% G! |$ Y
case 2: v=P2; break;
; _# A# Q$ {! X; I& h2 v case 3: v=P3; break; 9 Q) `. R4 K- y- x8 Z M
case 4: v=P4; break;
+ O1 u. \' G6 } case 5: v=P5; break; 1 Y F* D/ l% o4 K0 R- \. m# i2 i
case 6: v=P6; break; 0 [# R! s9 d2 @
case 7: v=P7; break;
1 n$ u2 g }! E4 E- N+ a1 e
/ z* g3 r$ }' T9 {/ T$ E7 t" H6 t default: return 2;
+ E7 D- }8 r8 ^ }
# ~& X2 Q! U3 Y9 v& ? printf( "Port P%d = %02X\n", p, (uint)v ); ; y( }7 s1 Y2 E* C! r
return 0;' F# Y7 m/ J5 C- E) d
}
l' \3 v5 m$ n- K" s$ t/ k: e4 P) g
Y) [# r; A6 ^
uchar Outport( uchar idata *rbuf ) {7 V* c$ L D1 p7 G" a Q: [
uint p, v;
' s2 W* z' Q9 y p if( sscanf( rbuf, "%i%i", &p, &v ) != 2 )- M1 J: i; Y# a9 p1 b% W% m2 K3 y
return 1;
$ Q2 v+ Q# l* B3 \; [- J6 C1 l switch( p ){
9 F$ u3 E2 k+ |# l `7 } case 0: P0=v; break; 8 V+ ^4 L* f" O t3 g I v" [9 D- o( ?
case 1: P1=v; break; " [ B0 k0 N& x$ u5 t
case 2: P2=v; break; 5 Y. G* u$ c! E& s/ h3 ~+ [/ E
case 3: P3=v; break; 4 i- A8 p' m t& i1 |
case 4: P4=v; break; 1 w4 I- H. C' a) W
case 5: P5=v; break; " h" x5 A) p1 |3 y% v3 J2 O
case 6: P6=v; break; 2 U- A! M0 [( S! q& o& H
case 7: P7=v; break; 2 u9 z0 _3 N& B, ^
4 ~# [, C; t$ _, H* s default: return 2;
7 W8 P+ ~4 S+ _0 q# d5 M }- P4 P, H& A" Y! S$ H4 ~* d$ D- w
return 0;
+ J1 b0 N; v n9 A3 b2 n} Y7 _6 Z0 H }/ V
/ g" N; Z3 _) ]+ o8 `8 X7 }; g5 s' H+ W; L5 U
void main( void ) {
6 L$ ?$ g) o4 d0 iuchar idata buf[41];9 h7 ~" u: ~4 m0 h( _5 z8 a
7 w& P% ^& z! Z' z- E4 _3 [ ?
uchar elevel;( ^: ?. `6 H, [0 ^6 N* W/ N
uchar mjs;# c) [6 K" ?3 y) B
Qport_init(); & z$ n* r1 s5 E1 i# w+ r9 t
) }3 e+ o ?" D
//SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI C! L2 b2 ~* j( A! M. _2 u6 _
// 0 1 0 1 X X 1 0 ; O; b5 p2 O( r8 H, [) t. C$ M
SCON = TI_+REN_+SM1_; //0x52
1 M. }* {: n, V O) N. ~$ n3 T) `4 C- |# q
//TMOD: T1_GATE T1_C/T T1_M1 T1_M0 T1_GATE T0_C/T T0_M1 T0_M0
, D8 \: x6 D3 [" ^! w/ u! l& t// 0 0 0 0 0 0 0 05 ?9 w% P0 d1 N+ B: Y7 w/ T; w
//6 v. o9 Z( @5 [7 `6 L, d+ w
TMOD = 0x00;
7 X& \1 F: u/ @9 H2 Y/ m* b//AUXR: T0x12 T1x12 UART_M0x6 T2R T2_C/T T2x12 EXTRAM S1ST2. ~ @! o" x8 z" T: N. }
// 1 1 0 0 0 0 0 0
5 s. G+ b0 ?# o- x" y/ @7 t# @/ m/ O2 _1 F% [
AUXR = 0xc0;
8 N) H3 I7 S( i# x# [, n& H. { TL1 = BRT1;
- P0 w3 q$ A3 [9 a+ }7 { TH1 = BRT1 >> 8;
e8 d" |1 X. u& v; k0 V) u# P$ } TR1 = 1; % Y+ E: o6 `& O8 ~/ a
1 z# Q Q5 u$ c8 G
- e+ U3 l q5 H6 k. e1 F- o
for(;;){7 h/ j5 g8 U) O
6 q, L8 S# |8 e7 _2 b0 E
// if(!P30) IAP_CONTR=0x60;
0 q0 d0 f$ Z/ i5 K# N+ ?// WDT_CONTR|=0x10; # U1 k, n* i" z( [& ~# |
* W1 k' E% w/ L+ j' Z: S
for(mjs=0;mjs<=2;mjs++){
- V0 v; w- z0 n5 M DelayMs(200);
) H/ h9 t/ _$ x1 [- `4 `) B// LED1=!LED1;% C! I5 H {# i& E$ c7 Y$ d
LED2=!LED2;
& `2 U& Q2 c2 Q3 D LED3=!LED3;
, I. O" f& K! f: r* P. A// LED4=!LED4;2 \+ G/ P8 j! @0 n
}, z0 f' c& H( ~6 S+ Z1 D
% T3 H+ s* Z( Z3 y/ S help();
7 P% Z; y$ _, T) i putchar('>');$ U* D! Q* o) h
gets(buf,20);
) j1 G& m" h% Y switch( elevel = command( buf ) ){
6 O, T# F' v; A5 u case 0: break;
* S- W, l* ~2 y default: printf( "Error %d\n\n", (uint)elevel );}+ }1 S5 _+ O) U( B4 g
}9 ]1 ~' D6 v# t- C% m1 W4 h0 w& k
}
( ?$ w/ I$ R/ u! x1 z3 R4 a8 c! Q2 A( U4 o7 a, D5 A {2 R1 g. K
//命令解析
: M! J- g: n8 D5 d$ {0 p#include<stdlib.h>
8 Y' p- \" d/ y' [; M#include<types.h>
6 q0 r7 p- z, v: [" A3 _, S1 U( O9 m1 Y
typedef struct {. H* w( q8 r! k0 W/ E
uchar code *name;5 N2 H# s) N+ _
uchar (code *func)(uchar idata *);
6 P+ \( p$ G1 u# G; R5 G* A}comm_struct;+ q! }. E* G4 l. D
4 ?0 B1 e, f4 M' g' |
( p. m$ @' _, V: Jcomm_struct code comm_tab[] = {
4 {% f( Y* A5 z; o4 C& N, T4 z2 ] "Inport", Inport,/ p0 h' h! [& @4 u& ]& t* H: T
"Outport", Outport,
5 ^8 x" E7 X+ P7 b& o "help", help,7 p& ^3 c! [6 `! G
"?", help,7 m$ Z) C8 \% h ] l
"", NULL 4 ~5 Q% I7 z. w( O( o
};
- ~/ {. Z" e' t8 [) \- R4 k7 K" Z A0 J
% \6 f& \% H" B( e$ v1 S
uchar command( uchar idata *buf ) {2 w; d: g( G# f# w3 M
uchar i, j; * d9 ]7 ^ m1 l9 a
for( i = 0;; )
6 W1 j. l, b- J! Q! E; D for( j = 0;; ){5 W/ C3 w0 p7 _8 v0 s5 r- ^( f
if( comm_tab[i].name[j] != 0 ){3 U* A- z+ X$ }( A2 \0 x5 A
if( ((comm_tab[i].name[j] ^ buf[j]) & 0x5F) == 0 ){! K4 L( P) P6 E8 H R
j++;
5 J1 V; \2 r8 E+ h0 i; S* N continue;
4 ^- u$ \( t3 a. h# v4 ?: ^: [ }1 }3 V/ X8 O* z! R
i++;/ i1 H1 D" A4 W
break;
7 o' A7 s( s4 L' A" _0 S% q }
9 H6 L# ?1 R3 _ if( j == 0 ) return 255; ( i% C( u \2 S4 z# r" n" h
return comm_tab[i].func( buf+j ); 9 U9 B' W$ W9 E
}
! ~6 T9 o6 ^4 R}
2 M {6 m$ W( C |
|