|
|
8 O3 I4 C9 L$ F% l#include <STC15F101W.h> // 包含 STC15F101W 单片机头文件- C3 L# P/ x, v Y$ E) m
' N' u) k# ^0 n// 定义引脚
& B' g! P7 b- ?sbit P3_2 = P3^2;# q/ k0 ^( y8 S0 `" H3 H
sbit P3_3 = P3^3;
( K- T3 P( w, m9 ~+ m( C! x {2 \" E4 S1 |3 Y0 m3 j6 _- @/ B3 y
// 定义模式变量和计时器变量 V# ?8 c D) m
unsigned char mode = 1;
u- ?$ i# l, `/ Q' G/ Xunsigned int timer = 0;
9 p" ~4 G2 g( o+ E
2 y& T, [; r8 b$ l1 P// 定义上一次的模式变量,用于断电记忆7 T I# B- a5 f5 D
unsigned char prevMode = 1; // 存储上一次的模式
. N7 p N- q% m: c( a$ ^- u4 _) I$ I- ~
// 用于存储定时器中断计数
$ V) `& c( J% d! |/ n) u% \3 c/ \unsigned int interruptCount = 0;
9 \9 D( y) w3 n7 U, h
5 W9 `" [+ N, V2 m// 定时器中断服务程序
) U: \5 X2 a2 ^3 ivoid Timer0_ISR() interrupt 1
1 L0 C( G/ F4 F{
/ m& Y4 S. y7 h& g* B* T switch (mode) {9 _% e7 @6 ?" Z. ?! D
case 1:
' T/ B) _2 S0 f7 \ P3_3 = !P3_3; // 切换 P3.3 的电平; [4 c( `8 }: K6 j) n; b! j; l
interruptCount++; // 中断计数加 1& y& j# u! i% U A. I) O
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒$ G, M! f J1 I, H y1 J
interruptCount = 0;
0 j9 X) a U- q# j$ z q mode = 2; // 切换到下一个模式
1 Q3 y7 o. r3 M& C T% b- n7 [ }
. V6 _$ G* y; G+ G2 F' W break;5 c f5 J6 [; Y/ D0 k
case 2:5 F% j6 `* {6 [* F, W
P3_3 = !P3_3; // 切换 P3.3 的电平. \$ G* E! V- r) `1 A
interruptCount++; // 中断计数加 1) g9 c& [8 O" e9 J) [$ @) W
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
- G7 C& C1 o5 L+ n interruptCount = 0;
0 O- K5 a+ V" K; M' f mode = 3; // 切换到下一个模式8 d! p& c. j* v# H( h& o5 Y
}
2 F1 L! r$ m% W2 F+ U @ break;# o g5 M {3 z. l, E N( u
case 3:
+ e' W n2 G! [7 w P3_3 = !P3_3; // 切换 P3.3 的电平
4 {2 U2 \9 i7 P2 K interruptCount++; // 中断计数加 18 U' a- ^( q! E+ K: |: Z! E) e
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
2 B1 Z6 m! U/ K interruptCount = 0;
^) f/ a- o( `6 X! @* x/ ~, H mode = 4; // 切换到下一个模式7 @9 ?3 j y" O* q9 {
}
9 p* F+ X9 x, f! \5 Y( p9 i break;+ q0 j0 \# c. J7 p4 Y" k" `, q
case 4:$ b. t; V$ M# x# D1 Z1 J8 R
P3_3 = !P3_3; // 切换 P3.3 的电平
+ z4 `# ^; U% p; w- N* | interruptCount++; // 中断计数加 1 I% R/ W8 f7 X# M4 _( a8 P. ^
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
( i7 T/ {. h1 V' M interruptCount = 0;
8 F m+ }( c+ \ [ mode = 5; // 切换到下一个模式
9 l! P7 I1 U- y$ n: T }
( A% C9 n& t0 t1 d* R& A break;
5 d5 a# Y$ X6 q' P" R0 l6 C7 S, F case 5:9 M3 L$ [+ p4 p! i9 w% H- b# d
P3_3 = !P3_3; // 切换 P3.3 的电平9 ^- z7 y- W2 S8 j% L2 O4 M
interruptCount++; // 中断计数加 1
9 J4 \) e% s- n, w0 p9 m% ]% w* M if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
. _6 {/ \" Z% M' w. O) H: B interruptCount = 0; ; a( B% e8 L5 g% Q: m( |8 b" i
mode = 6; // 切换到下一个模式
8 k* o. B8 j% W0 } }" ^- n; Q9 Q' L& q" @
break;
. W- p c" f* d ] case 6:" z5 n5 h* o6 @
P3_3 = !P3_3; // 切换 P3.3 的电平3 T2 S; q* o! P+ i. V7 h! N
interruptCount++; // 中断计数加 1+ h s2 ^& U9 w# I+ l& B
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒 ?5 j+ D# |5 h& D6 U$ m& n/ E) Y
interruptCount = 0;
+ f p1 e- E7 g I' {8 G" x8 g mode = 1; // 切换到第一个模式,开始新的循环" \6 E' X2 \7 G1 W
}
) @% Q# B8 y1 t8 x break;2 d% U: i8 {; v4 y$ n3 T4 }6 |
}: _3 ]4 }( m1 ]
}
' Y! t- G2 p0 Q, g+ o9 f/ O4 H7 p0 ]1 ]5 g7 ~* T$ C- N+ A$ ], n
// 初始化定时器7 |0 C! B# @0 p1 ^+ [+ B
void Init_Timer0()
: A( H; X! D- b( o( x{
0 T) o7 @8 U* J4 k- T4 u TMOD = 0x01; // 设置定时器 0 为工作模式 1* R3 d9 |1 j: M* W
TH0 = (65536 - 50) / 256; // 设置定时器初值% h! n7 u% A" ?; l" Y7 b$ y
TL0 = (65536 - 50) % 256; // 设置定时器初值
5 p7 q2 r5 S- f7 j ET0 = 1; // 使能定时器 0 中断
# J2 p6 I- d7 [+ Q" X0 T2 W' l! k TR0 = 1; // 启动定时器 05 n3 \8 b9 `" O; O
}9 ^- D( Z* y" o' D
. V( ~/ S0 x. a4 }+ }! e5 h$ H// 主程序' @" }, K* ^& w) [3 ` {, r0 U$ e: B' c
void main()3 G% L/ c0 Y, h, Q) o8 y" [1 Z, B
{% O; J. Q5 t6 x2 U
// 初始化引脚和定时器 y( v. M! B6 z5 v, C% n# H( w
P3M0 = 0x00;
7 n ?( I8 a8 n# F0 B; i7 W P3M1 = 0x00; / {1 @) A/ H. n- q) \
Init_Timer0(); " P* s) A. a5 M
9 H5 Z8 c ]- N2 A8 z // 上电默认模式 1+ S! ^5 X( z- e2 H! N
mode = 1; ' k8 ?; f, U, y5 g# b# ?+ W
. r0 E6 |5 u& n4 O5 P
// 开启总中断
# r( O f6 o5 @, k8 B2 ^; m, C EA = 1;
9 N9 }6 P4 }% s, ^/ u! I& n
9 l2 d( q0 r% Y7 V/ L while (1) {2 t1 t0 K' ^3 @# f
if (P3_2 == 0) { // 检测 P3.2 按键按下
4 C4 W" H* B$ L5 W3 y2 D mode++; // 切换模式5 s6 }4 f+ p9 N; Y. }8 C9 j( N
if (mode > 6) {
) i2 p" k. p* u- @$ R2 f! ~ mode = 1; // 超出模式范围时,回到模式 1
$ g$ z& o' X) {: r1 [3 m }/ }% D: r( q. j' S) ]6 j/ R% C
prevMode = mode; // 更新上一次的模式
$ [8 h; |' O: ]8 K: p2 S }
5 ^. B9 d$ W7 C& e5 `! {, K6 N* U }5 _9 h3 j- N8 w; ]8 c5 M
}
' H, H1 a ~% M# A" c8 a* E
( H# E, X3 p& D% e/ F/ R8 I2 S求指点,编译出错!. h* c1 M) Q$ |9 A
0 o/ c, z- T: z4 {$ z- j1 p
|
|