|
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
|
|