|
4 J0 ? L0 a. A. i#include <STC15F101W.h> // 包含 STC15F101W 单片机头文件7 r6 H! g3 T5 F2 |) A' v' O+ c6 B
' f% E- w+ g! O9 A9 o
// 定义引脚
, `* D& T, @% P3 k: }1 qsbit P3_2 = P3^2;. }# o1 z2 \7 m6 b! f/ v, X
sbit P3_3 = P3^3;
0 }8 C* j+ ^ c- k/ s, Q: N) g1 @2 f6 h( m! r
// 定义模式变量和计时器变量0 f9 l3 v: m/ M: Y1 ^
unsigned char mode = 1; 5 I: f3 d8 g( [) K0 d" b, A) m
unsigned int timer = 0;
& J& V+ p1 S/ P; D; |+ S) X3 h: c7 g$ H* {! N; [
// 定义上一次的模式变量,用于断电记忆
# }0 m, T' ]- C+ [8 \2 _unsigned char prevMode = 1; // 存储上一次的模式
9 [9 F6 y m3 d( q' i( I' g5 R& F3 I* ?. F
// 用于存储定时器中断计数
[. q' ]' W1 l2 w( Iunsigned int interruptCount = 0;0 \8 |( D9 E8 X1 t; ]! _' ]5 s
K: A- ?* @! m7 o// 定时器中断服务程序
$ }9 o* q, A# V/ r4 b7 xvoid Timer0_ISR() interrupt 1
+ K. {3 R$ I/ w E( L8 P{3 z; J9 z1 E0 d0 `
switch (mode) {: }2 j: J0 ~/ b, v4 @
case 1:; i, V( ~2 D! o$ R# g
P3_3 = !P3_3; // 切换 P3.3 的电平/ s5 f4 y' ?3 A" L6 C
interruptCount++; // 中断计数加 1
. P+ J* `( ^4 o! o' g) X if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒7 V' w: M* ?- d4 O
interruptCount = 0; ; F' Z* z9 U" e/ R" k, u$ g+ |
mode = 2; // 切换到下一个模式6 F/ D0 e% g- E" L, ~
}, h! o" ?- W* F, H
break;
! ~6 d! G: G1 h0 G3 r C/ K( ~ case 2:
" b( U3 P" x* V P3_3 = !P3_3; // 切换 P3.3 的电平( A4 G# ^# i% a) z) D9 h; E+ u8 {
interruptCount++; // 中断计数加 1
2 O0 [% b* ^/ y; l, n) P if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒: R" Z; {$ i7 s& T! I
interruptCount = 0; 6 I1 |$ P8 N6 r/ P
mode = 3; // 切换到下一个模式
7 }/ q4 V1 Y) D, S( Z }
2 {# F9 r* S6 G# ^) G break;
- O# c* }/ Z0 l case 3:
6 p4 D6 u- U! K6 B P3_3 = !P3_3; // 切换 P3.3 的电平
( w1 v. H6 T, T5 v( O [! y+ M5 C interruptCount++; // 中断计数加 1
$ S6 O% x! c2 E if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒, g! T: Z0 S+ J+ U
interruptCount = 0;
; i! ~9 \* {9 U. R% ] mode = 4; // 切换到下一个模式4 K; S& S' ?' `- I5 a* ^# U
}* A, k3 E* ?+ x9 i3 k, F! S
break;; Z: c3 O$ |+ ], h" L
case 4:
5 C& i, }# ~0 `8 A8 y- O P3_3 = !P3_3; // 切换 P3.3 的电平
3 `( _* l: g4 q+ K0 X interruptCount++; // 中断计数加 1
/ {# w9 t6 b& }5 }- T. B5 K if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
' w0 O3 |& V* c; g interruptCount = 0; 5 ]6 \, A4 G9 ^* c ^! F
mode = 5; // 切换到下一个模式1 d6 I. d8 m9 f
}7 d1 W, `* T" Y# g
break;5 o `6 |9 g) H# R* C2 `" v
case 5: v+ {) g! n! R$ @7 I
P3_3 = !P3_3; // 切换 P3.3 的电平
+ S* e5 N4 j( k2 Q interruptCount++; // 中断计数加 1
F& `+ y/ o8 `9 ]: _7 t) w9 e* { if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
- Z4 @( d9 I( ~% T, p5 ? interruptCount = 0;
5 c) }! Q6 g: k9 n) s, N; N( a mode = 6; // 切换到下一个模式1 y% n* e1 w( y" A5 E4 k! |
}. d/ D" ?* S/ o& a
break;% _; A; u5 T8 s( L" I8 K4 D4 Y( ^& e
case 6:; D" q1 U6 [9 S4 L8 w" @
P3_3 = !P3_3; // 切换 P3.3 的电平
5 C. C9 J7 @ N E- j$ i/ o- |5 [ interruptCount++; // 中断计数加 1
% Y T8 _" e4 H6 ^. C if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒9 v4 ]* p1 s3 K I5 {/ X" ^
interruptCount = 0;
) p* w6 F# G+ |7 j3 E mode = 1; // 切换到第一个模式,开始新的循环6 H5 L' C: O, @" p; c
}
5 y* b, w' X# k0 q: _ break;* k7 _* p/ p7 {8 s% C2 v
}
# P% Y( F; y ?% B0 }2 p C( |) m}
" t- J: J# ^5 n% g
8 h% ^3 a% q4 B. a/ }0 j+ W' E// 初始化定时器
4 l' z. P2 t3 Qvoid Init_Timer0()
- z4 t0 b: U" H+ c1 g7 n{
3 r. Q( X& M6 R% N/ A2 m1 N TMOD = 0x01; // 设置定时器 0 为工作模式 1# c. V9 u; G% V% T
TH0 = (65536 - 50) / 256; // 设置定时器初值1 P8 T4 K* V2 V7 [6 z
TL0 = (65536 - 50) % 256; // 设置定时器初值1 m$ ?. t0 L" M: E+ ^
ET0 = 1; // 使能定时器 0 中断2 Z6 g% S0 H8 b1 I4 i8 k% P* O: h
TR0 = 1; // 启动定时器 0. p9 i0 l' m2 M ]5 Q, q
}2 x6 m7 f" t6 a! x) t
6 o& U/ d6 n% Z/ S// 主程序
8 @ T3 W* P; v" G1 vvoid main()5 M% w# H- I5 m
{
0 S' Y2 o. `% e1 T: g- I# J+ `7 ^ // 初始化引脚和定时器
: N1 _" v" _' Z2 s \0 j* A# {: n P3M0 = 0x00; 6 \2 a9 r7 U/ W4 ^
P3M1 = 0x00; % O1 [+ Z9 J( ?: s* B
Init_Timer0();
9 p( V$ B$ Z2 e3 T
8 g) K1 d8 S1 u! u# k; T0 J4 S // 上电默认模式 1# j, b0 J1 ^$ z2 p* ?9 A! U z
mode = 1;
/ E2 ^$ @- R$ E+ }" ]3 u9 c- K6 C3 A* x5 _: j0 H a
// 开启总中断
& z# c* A" s+ c3 l+ Q0 J x EA = 1; / l2 M; Q# U# N$ ?* A8 a1 L) w
+ ~: b; i( B* ^- a while (1) {
% Y9 B" \. M5 X' I* b" X3 V0 d6 N if (P3_2 == 0) { // 检测 P3.2 按键按下
9 F' G/ ^+ ~3 G+ b; @, ~0 | mode++; // 切换模式
4 d" ~( C5 P8 V h" I3 J if (mode > 6) {! r: u2 M7 E$ M6 q. |0 q/ ~
mode = 1; // 超出模式范围时,回到模式 18 e) {+ _. k8 \. w, l9 Z
}
! K& |0 ?4 P/ ]/ Z/ } prevMode = mode; // 更新上一次的模式$ L% ^: F8 H+ c5 F; _1 r
}0 s: ]) ]! T- s c/ d7 r3 f6 p
}, z: M7 E5 S8 `. K
}# }8 c4 M* P( p' t0 h" k
6 K! S5 c, A4 ^% P: N+ Z+ [
求指点,编译出错!
/ H9 `! i& O6 M0 u! U
& ?' `+ r+ s" i( ]/ }) k! P$ o |
|