|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
//在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)& M8 ^' q/ J) c8 n
#include"STC8AXX.h"1 B+ A# p/ ?. p: }& b; V) z1 e4 [; Z
#include<stdio.h>
7 K( Q2 l; L5 O9 r6 R% Q. r#include"types.h"* A$ t: e) K2 z. z4 [8 |/ ?
#include"Qport.h"1 G# k* t5 u3 [5 n* L' t/ _+ A- d! o
#include"delay.h"
0 a. Z! D) R' ]% v4 `9 Q& O5 F m( ]
5 R) `, N0 J$ ^1 q6 S# c$ _1 L( u#define uchar unsigned char) K5 S- m5 L- d' i
#define uint unsigned int 1 E2 p8 p: s/ T# P8 Y
#define FOSC 11059200UL
7 G' [5 \% @9 M6 a9 V#define BAUD1 9600UL4 U, B8 b# W) R; A- u- p! T, V; {
#define BRT1 (65536 - FOSC / BAUD1 / 4) //FEE0
6 a2 F$ M W% g G- n& v6 r8 S" Z' f; V* U D
: S3 w; U+ u: r+ K7 {. ^9 {" Q1 _
uchar code *s ="Please input the following commands:\n"
0 Y3 B! D! `8 f- t6 P. m "Inport p (read port)\n"( J. o/ T+ w' J; `, \
"Outport p nnn (write port)\n"% u* N) ^& B, h: p
" where p=0..3, nnn=0..255\n"/ i2 x4 w9 L0 I
"Help or ? (display this text)\n";6 j2 u/ z( M6 ^5 M4 g$ _3 e
) U+ E/ J) {: v9 m( G+ f! Z; t, Q4 J' L0 Q, D( W
uchar help(){
0 w# h9 W: R# A2 @0 X3 A printf( "\n%s\n", Q );1 X0 K$ Z0 x8 e, Z1 g* D4 X& k
return 0;
' ^* i% x( q& | M6 u}) Z! _# z/ T; C9 r$ ~
8 k" z. {* P+ L# u$ j* s
) M) x' E5 } X. luchar Inport( uchar idata *rbuf ) {+ p; \, ?% r$ S2 _% F
uint p;
. k6 U3 y0 k7 a/ Q/ M& s6 ^ uchar v;* S3 x7 _- @9 B# S' a0 x
if( sscanf( rbuf, "%i", &p ) != 1 )* M |0 n5 D) O4 a$ e
return 1; 8 B. ?! v9 J( F$ z% [2 S
case 0: v=P0; break;
1 F1 I- I( _2 S9 J& e! C2 k case 1: v=P1; break; $ }2 r2 @- g- `* @2 p8 w) \; R
case 2: v=P2; break; 0 k1 }& p- o8 y
case 3: v=P3; break; 7 S% H o3 x `6 V2 P7 T8 r
case 4: v=P4; break; 1 ?2 O; Z+ d/ |. j6 A
case 5: v=P5; break; 6 R5 `( C; ]# l) D- Q8 L8 F
case 6: v=P6; break;
- D; W& ?& r7 L& ]5 D5 [ case 7: v=P7; break; " _. H L9 S& C5 a. _5 \! W+ B. Q
. C0 j( m. @& `4 x3 o/ ^
default: return 2;
# ?. i$ M3 H" J }
; L% G) I& P7 z+ d$ I: s printf( "Port P%d = %02X\n", p, (uint)v ); % \3 k0 Y6 c' w/ o$ K n
return 0;& B# r% a5 I) J w& Q/ z
}! E# B. V: Q: Z; v' M5 n
2 g/ Q9 }$ o9 E. J3 L0 M2 k3 p& q/ ]
uchar Outport( uchar idata *rbuf ) {1 E- ^0 k7 r A$ I+ N" f
uint p, v;- N u# [ [8 A/ X9 V$ n: P
if( sscanf( rbuf, "%i%i", &p, &v ) != 2 )
7 w8 z8 J# Q: B1 T return 1;
6 P+ K" A8 \7 N8 I! y# q( X switch( p ){
( [" i! |0 N) `- N case 0: P0=v; break; 8 M2 a5 I# w" Z, M7 b- h* ]# }
case 1: P1=v; break;
2 {: N0 {, @' W" z# Z# ^ Y case 2: P2=v; break; 8 v3 C7 X( L/ W4 c# e1 C1 P
case 3: P3=v; break; , z, a @% g; u3 p+ G& a
case 4: P4=v; break; 0 |, @& ]' T, x( `4 a
case 5: P5=v; break; ( m j+ M) F4 k9 Q% y; ]3 N
case 6: P6=v; break; 7 f5 V( l6 v( K+ \$ o$ g
case 7: P7=v; break;
7 g6 U5 @; j# C r" E2 R, v& ]+ X6 j2 Y
default: return 2; ( g3 ^# _6 h2 X
}
) U/ u; D( \- H3 T; l return 0;
1 p5 |$ D$ w) b! Q& H}
9 R# K3 ?" }% g0 o( e) N, l7 f1 `! H8 _) E( o% G, |
1 k9 K, |1 J w4 j/ u% Rvoid main( void ) {
' s4 o: A& d* R9 c' Fuchar idata buf[41];
: J% E! s% [. L$ k M V2 V4 K/ Z3 E% F, E, z5 O2 e, u
uchar elevel;0 \$ H; T* C3 j: e5 r1 W* ~
uchar mjs;; v5 P4 y3 }% Y7 n( d7 t
Qport_init();
; ` J2 W/ |- i5 G( U& ~! w1 q
: P0 f7 h" N' g) x- j, i. l//SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI
. F! W4 Z4 j$ O$ h// 0 1 0 1 X X 1 0 0 G @& K* O$ |/ r0 n
SCON = TI_+REN_+SM1_; //0x52" P6 o9 w9 N5 T7 ^+ }
5 k! m5 ~4 e9 M- F//TMOD: T1_GATE T1_C/T T1_M1 T1_M0 T1_GATE T0_C/T T0_M1 T0_M0
' L% }% H- C; y1 w, i. H/ W// 0 0 0 0 0 0 0 07 Y/ r& b6 c8 f+ _7 d) E
//) w/ Z5 F3 Y! K. C; J
TMOD = 0x00;
% X+ Q$ ?9 F3 Q8 Y3 ~//AUXR: T0x12 T1x12 UART_M0x6 T2R T2_C/T T2x12 EXTRAM S1ST20 r; G7 ]* L, j0 k3 j9 v
// 1 1 0 0 0 0 0 02 s3 u1 N8 [ W* ^
$ a# E" t( ^+ s' a; x AUXR = 0xc0;
! P# P( g6 A+ x* H) {2 { TL1 = BRT1;$ S4 u2 O. h' y, p$ z8 L
TH1 = BRT1 >> 8;
7 }1 R- S% E% ?- X* E TR1 = 1; 7 r+ l7 |% `. v( S5 T8 O
4 B1 L0 ?% {1 F, a& K" c
6 b; r* F4 }" l$ j: G for(;;){3 I% L* x" P9 G- i
7 J6 {6 E) a$ v# C3 K
// if(!P30) IAP_CONTR=0x60;
) ^# c1 o4 K2 r d, q; G! A \// WDT_CONTR|=0x10;
6 h$ ]( N$ h8 j. f% R5 t/ O
6 U. F: i# U x: g$ [& }' L+ i% J for(mjs=0;mjs<=2;mjs++){
) h2 p) ^1 h0 m DelayMs(200);
* E1 p% X9 C1 Z& x8 u// LED1=!LED1;( ?) x3 j5 L" a& Z! O; z
LED2=!LED2;
' t1 K! `5 R* |% W, V LED3=!LED3;2 K. c7 g/ v) N
// LED4=!LED4;# N3 p. C& r) P) t* l/ P6 w
}- K# P! K1 @, t7 E" [- c
+ D5 z7 Z& U' ]6 S) U
help(); ' ] J$ f# ? s! H+ E% w N
putchar('>');
8 i0 t4 Q+ y% u' D- @$ j gets(buf,20);
3 T* \5 c8 H* |: R, ~4 N switch( elevel = command( buf ) ){
. p* k* H; J5 g/ ?% ?. D case 0: break;
x! G6 T8 E/ q- x& }; w; r p$ T default: printf( "Error %d\n\n", (uint)elevel );}
' X: o+ }3 l3 G5 f0 x }
( `/ m# Q4 m+ \8 l) M) M }
" _0 ?9 W# R* X. }/ Q" G) s
3 P9 J- ~4 u% ?9 c, w//命令解析
9 g: s5 n, c% V2 [( J9 [#include<stdlib.h>
, a% z+ B, B( e R% \#include<types.h>
% U4 l& }3 f; b: U' o0 ]/ N `8 ~( M1 }5 X5 K8 O# e
typedef struct {
3 M( |5 S: E: d- F) @ uchar code *name;. _6 @& W% z3 }& n
uchar (code *func)(uchar idata *);) u- p& J9 B/ H
}comm_struct;
- |! b. h$ k, [* w0 }
P% m$ t1 I+ _+ |" x
0 ?; D3 Q9 Q: R' y! O, P2 Ecomm_struct code comm_tab[] = {
* H. {4 G( ?) I: O( a6 i5 e: n "Inport", Inport,' L; l W5 [) U0 j! S8 V6 E
"Outport", Outport,
' d2 m& }4 Z" C, ^ "help", help,
: n, T: y& b3 k6 l "?", help,
. O5 D" k, o" T* h/ @* b "", NULL
4 v+ ^ E5 G5 m* T};' @* u/ M. b, f6 C0 v+ N
2 S4 H/ S" a* t _9 U% K! e+ a8 n+ s
uchar command( uchar idata *buf ) {
" \5 u* T! P0 b( s7 ]! Q uchar i, j; 0 h, N$ ^8 e4 M1 X
for( i = 0;; )
' G& L8 y8 ` ]7 {% _ for( j = 0;; ){
: N! f( D! L0 C4 M8 U if( comm_tab[i].name[j] != 0 ){2 \' o; f5 J8 m& x' I2 z' o
if( ((comm_tab[i].name[j] ^ buf[j]) & 0x5F) == 0 ){
* A3 A! e+ ^; ?( p j++;( o* `: f# b1 Z* K/ z- s
continue;
: }/ c, ^6 |. Y: [ } ?- s* k7 \" U: a+ L/ \3 e# z; D- j
i++;
7 u% V: z! ^. P+ u8 k break;
5 ^; o4 j% r, B' k }
2 N3 E' J( E a5 D if( j == 0 ) return 255;
% z) q& M6 g2 J# e3 ? return comm_tab[i].func( buf+j ); 5 e* c$ a. i$ L" B/ b4 s
}
7 e8 R% ~/ Z( `( l: O# u7 ]) D}2 S$ J) e$ q$ i i% x
|
|