|
|
$ U b; c7 s- w5 `
#include <STC15F101W.h> // 包含 STC15F101W 单片机头文件5 ]' M2 t; `+ c% j2 @
[0 `0 i2 L) W7 P# j/ I. x6 M
// 定义引脚: O5 b/ C+ j4 ?9 ^2 u) X
sbit P3_2 = P3^2;: H3 ~; r8 y. M/ ?8 L
sbit P3_3 = P3^3;; j' E! f7 G) b) F& l% B
7 ~3 U4 K0 Z" }+ q0 m6 |" e. i
// 定义模式变量和计时器变量- o) i3 T R: x4 n( [. l8 ]
unsigned char mode = 1;
& O, b: c* r+ K3 u; ~7 Zunsigned int timer = 0;
6 q" E9 Z3 l% b6 J' b! x* ]7 S+ w- b, U" u U& M. K0 L! q& J) {. F s
// 定义上一次的模式变量,用于断电记忆. W1 O* I% O5 ]$ @: p2 Z& M F
unsigned char prevMode = 1; // 存储上一次的模式
7 l5 p- _$ Q0 S* g; B# R
" k5 A" o3 D. V% Y/ K# K2 ?// 用于存储定时器中断计数- ?6 K( L. e$ o# a% m5 x
unsigned int interruptCount = 0;
3 i) x+ @5 h1 k1 s0 X2 n2 T5 G2 m3 Z0 h8 X! A' q6 k x) l" M
// 定时器中断服务程序
2 D: ~5 p. |+ P( x9 W" `6 t* Lvoid Timer0_ISR() interrupt 1/ X( l; h: r5 @% i, ^. ?
{$ I% `4 g. j7 }& \- \
switch (mode) {
X( a) G& V" R1 Q0 J/ E case 1:
0 c) n- n. F1 X3 o2 D P3_3 = !P3_3; // 切换 P3.3 的电平
/ W/ G' F+ v0 f y) A interruptCount++; // 中断计数加 14 M! L4 C' m$ k0 m$ |
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒9 j& N( l& k2 U& R5 k+ `
interruptCount = 0; - w0 B: y! H6 x1 n0 }6 Y
mode = 2; // 切换到下一个模式
1 G: V( f- s# \2 N% N }
5 q' c9 {/ a+ n1 F, _/ y break;1 V% M5 s! n; [ v- B+ f
case 2:
# L$ Q# G' S) b4 E0 T P3_3 = !P3_3; // 切换 P3.3 的电平
' b m* J2 t k interruptCount++; // 中断计数加 1
. {$ V0 u9 Y+ v8 e( n if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
' q5 i; U) M* J- X4 a0 U/ s interruptCount = 0;
8 E5 q1 p- L1 C2 j0 x& B- S1 f mode = 3; // 切换到下一个模式+ r# `! Y; Y; n5 m- O4 y4 D
} J1 T9 _ F! w7 I- p) A
break;
* }! X: n+ [' j- B/ T1 j case 3:
3 g$ J* D ^9 J& k# l6 w P3_3 = !P3_3; // 切换 P3.3 的电平8 [0 s# `, I' P& p# u
interruptCount++; // 中断计数加 1
( r3 p, `! ]4 [1 c if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒: P2 N4 c% f( e% r4 h
interruptCount = 0;
7 b% s* n: i: S9 L( H mode = 4; // 切换到下一个模式, Q m" q8 O! a% }* i. t8 m$ k
}
F/ k: y" h5 w$ ~8 k- X1 T | break;
- L$ S6 z: p) g' \9 j4 }% r case 4:
3 P* d* E! S, @. b5 b( u P3_3 = !P3_3; // 切换 P3.3 的电平
: p5 ~: _5 I3 u interruptCount++; // 中断计数加 1" n2 k8 E: A' X$ H
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
; v/ P( u" B+ z0 [$ w interruptCount = 0; $ j/ b' A8 |3 f* F g/ Q8 D4 V
mode = 5; // 切换到下一个模式
7 M1 t }& d& P3 W0 k8 B }
( }7 c, N# j# o9 q* f2 N e break;
2 U( ~: o% q' W7 ~8 W. b! q case 5:4 N, ^3 Y) h8 g6 m0 C. S
P3_3 = !P3_3; // 切换 P3.3 的电平
7 }: H6 N" r- V5 s! V& c interruptCount++; // 中断计数加 1
6 G9 y0 F' ?4 t' V9 k5 l3 V% g6 E if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
& W# F" L. d9 ^% Y0 m7 k interruptCount = 0;
2 o+ U- `7 e# ^% ^ mode = 6; // 切换到下一个模式
9 {+ P5 N/ e8 C/ t2 h; ? } d/ s& X: x2 V
break;
! [/ V1 R) I) A, J7 E+ o1 d case 6:+ ^; L: |: E {& r4 W9 e
P3_3 = !P3_3; // 切换 P3.3 的电平
1 O, t( Z# c5 [, A2 P6 ^3 f% N' J! _ interruptCount++; // 中断计数加 1
/ l8 T# l$ {1 {5 J& \2 F5 I if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒, R' r' s7 U" E' j3 X* M
interruptCount = 0; * K/ P7 S T1 s, G( x7 G" ?6 K
mode = 1; // 切换到第一个模式,开始新的循环
. Z* v& N8 w }1 U: @ }3 z% {0 V. {. W1 [/ ~9 o1 a
break;
! x9 b/ t8 d6 j% T6 Z }
7 |! n. h- ~2 v}
" R4 x e* \+ s# L
( R6 N4 y" D$ {5 R0 B+ A# H// 初始化定时器
! P$ B* B" y K4 i, J3 Nvoid Init_Timer0()7 f: y( A* ?; O2 ]7 z: m( s
{
' M1 o5 A: S5 \2 O* V7 i" B2 ^ TMOD = 0x01; // 设置定时器 0 为工作模式 1
% l2 \" D4 m5 `/ K TH0 = (65536 - 50) / 256; // 设置定时器初值
" n& M0 G; m9 J! ^0 z TL0 = (65536 - 50) % 256; // 设置定时器初值
/ R$ v- G6 g) I* e ET0 = 1; // 使能定时器 0 中断4 p4 F4 x% n' ?( E) B
TR0 = 1; // 启动定时器 0
$ W, g, D3 O9 y' h# V/ E}
1 x. u9 b+ t+ `& d; I6 e e6 X5 i' U ^& L. X$ U5 z
// 主程序
9 I0 A' Q. d. G1 p% B5 lvoid main()
& s) N. Q9 y$ U3 [{8 V4 I x' ?* M% }! i
// 初始化引脚和定时器
" k" I# v9 u: @/ n+ N* F P3M0 = 0x00; " b! h8 G9 c% x0 U, p, H
P3M1 = 0x00; - ~: E' q, ]9 e9 E% T) n
Init_Timer0(); $ `/ T% o8 f5 |) q+ n7 z
- G$ }4 N; V$ G( B+ m4 O8 v% W2 t
// 上电默认模式 1
; H8 p* R0 \. U' Q0 f* l mode = 1;
; A; M* _9 Y, {$ _7 j% Q: _6 f& Y: u, E; D; w0 Q
// 开启总中断1 y" v. R$ z9 \: Z# W+ x+ t: W1 R
EA = 1;
- x6 O, b: _3 @. u. F/ X' a J. ?
6 `6 K+ L3 N5 m8 n9 }0 t while (1) {; j a# _4 I- [
if (P3_2 == 0) { // 检测 P3.2 按键按下
" j4 Q9 Y1 x' f% s7 g# M/ l mode++; // 切换模式# O" P: [5 ^# [* x6 q( X. k
if (mode > 6) {. }. A! I5 R. M) ?# n2 [- L
mode = 1; // 超出模式范围时,回到模式 1
+ G0 S, H7 [) H/ M; T# C }" ? q6 f% J# c" z8 {
prevMode = mode; // 更新上一次的模式7 |" x$ V" P* v/ q, I' { T
}& ?. _3 Z2 I; X4 S& h% n) j
}
* R9 R5 p% }4 x0 E}$ w$ F6 i1 w6 K; | X1 }: J2 w
# L: E7 t3 G% \ [& g1 Y! Q" p0 e求指点,编译出错!3 x! @# ^. S: k. r& B. h
; f; }" I) I* K3 y" w: u! K
|
|