|
6 Y0 ^# L; F: d2 T4 Z3 A#include <STC15F101W.h> // 包含 STC15F101W 单片机头文件
4 ?0 f# ]8 p. O1 \3 ]5 W! ~3 F3 ?' ^0 v$ L
// 定义引脚2 \# c. }/ }& ]- s( G& q
sbit P3_2 = P3^2;
5 l. v& O5 l5 V( X$ w( Z- D# H4 qsbit P3_3 = P3^3;2 x2 O' N7 v9 |2 [" I2 C2 k) r
, W+ o3 u) R2 V- [* x6 E1 B// 定义模式变量和计时器变量, B) |( c4 n- ^. \; F# H" A
unsigned char mode = 1;
% e, n- d. V! l! h. T0 I/ dunsigned int timer = 0;
' A3 T T1 a# w" @( q; { B" `& F* p1 Q
// 定义上一次的模式变量,用于断电记忆7 O6 F+ x/ n: g4 b9 N) c
unsigned char prevMode = 1; // 存储上一次的模式- h* r* X# e& T5 U! g" u. |! [
8 x6 p' C6 h. U
// 用于存储定时器中断计数
& _1 |- h- T+ nunsigned int interruptCount = 0;
, J# C3 O5 k6 C& I: _# }: s( _( @0 X) B
// 定时器中断服务程序5 [& ^4 x- s# n* P
void Timer0_ISR() interrupt 1/ m( u' C' ^! d6 X# M3 e
{
( T1 f0 P: \2 } switch (mode) {
$ g4 H1 `) _( g$ O' H) Y6 v" I' R$ ]4 P case 1:+ r& g7 O$ e3 l+ f( t8 d
P3_3 = !P3_3; // 切换 P3.3 的电平9 a" |# i( |$ S3 P- Z; H
interruptCount++; // 中断计数加 1/ u+ X1 n' x) n5 p& Z# k
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒/ P" h1 J4 h9 n* I, J" _4 K
interruptCount = 0;
$ g! V* \/ z+ J0 M3 S$ j1 J# M mode = 2; // 切换到下一个模式* A2 [1 t. @+ p. w
}9 `: d. z/ Z! G2 V
break;1 E( _* t+ K; E0 O
case 2:
+ K* b8 ]" F( ?4 J4 A, ?2 n2 x% Y! t P3_3 = !P3_3; // 切换 P3.3 的电平
2 W; Q% [; I9 @- y0 } interruptCount++; // 中断计数加 16 j! P9 u7 l+ Y
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
& g/ W# F. b/ [: V4 l4 v interruptCount = 0;
4 M' K3 a9 O# P; ~ mode = 3; // 切换到下一个模式5 U7 ^5 U% J" t+ r$ O9 {
} G3 I6 d; @2 y+ I
break;6 D( G9 U) b( V
case 3:) Y2 @6 r% z8 k% `- @( I2 U; r$ C
P3_3 = !P3_3; // 切换 P3.3 的电平3 {$ W5 C9 b$ g$ Q: D% j6 b7 m
interruptCount++; // 中断计数加 1- s4 S8 X3 D! ^. W( }. P
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒" f. u; U3 E6 e/ h
interruptCount = 0; 0 @1 f2 n- ]1 V; O- h
mode = 4; // 切换到下一个模式$ U5 v, z" I$ F; s
}
- i8 X ]3 ~! G) j break;! K* N& M' }8 Y1 _
case 4:
" F8 L- d9 U0 x% I P3_3 = !P3_3; // 切换 P3.3 的电平
. M% V8 l" e. C/ u$ W interruptCount++; // 中断计数加 1! [8 q! L& G) E
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒" ]9 q) l" {) ]. h; B+ @ Q; O
interruptCount = 0;
3 e5 k9 Z Q( ]" i/ Z, S" N mode = 5; // 切换到下一个模式6 q9 i w+ L* _4 n5 m7 U
}
! a0 H. Y1 |* R break;
" x1 ~6 P" [( O7 U case 5:
5 L5 ~6 A/ e6 h P3_3 = !P3_3; // 切换 P3.3 的电平1 c! c6 a, o# t% p0 x( ~
interruptCount++; // 中断计数加 1! E' k& e5 \- c. ?
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
" }2 i7 j6 l3 z! K$ Y interruptCount = 0; 6 ?- q) x1 m, F9 N8 J# L5 Z) f6 T
mode = 6; // 切换到下一个模式. x& W; q- T. E. n) G7 t2 k
}9 O5 z' S$ N$ j2 P1 |
break;
/ [" h6 e8 d5 {, O( g! W1 u case 6:% i: g- T7 ~9 `! H; v6 r$ k
P3_3 = !P3_3; // 切换 P3.3 的电平
$ {7 q7 ?3 r$ }) Q9 T! R/ d& | interruptCount++; // 中断计数加 1# `9 v& H7 z4 s1 y K+ [3 u( d
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
: B3 i2 @4 ?0 W! B interruptCount = 0;
# U+ \! y5 ]! o4 y+ t! G mode = 1; // 切换到第一个模式,开始新的循环
, {- C5 i1 o. m }
8 c ]/ Y0 Y2 X' N8 M3 u break;: ^4 Z1 C- G+ o2 I" ?' j1 ?
}
( c& S, i8 D6 }" L% v, l}5 i+ W7 h' O! M
( d, p$ r `7 Z3 O1 u4 r
// 初始化定时器& ^/ e- }( T- d7 v/ S1 A
void Init_Timer0()
; y2 o3 p; B4 H2 X) I5 Y+ g @% m{
F7 n# k3 b9 l: E9 T R TMOD = 0x01; // 设置定时器 0 为工作模式 1
4 o/ y; f8 Q' M2 v: P TH0 = (65536 - 50) / 256; // 设置定时器初值
\- r! i7 F, {3 o0 v: E TL0 = (65536 - 50) % 256; // 设置定时器初值% ?3 u6 g7 k: d
ET0 = 1; // 使能定时器 0 中断
8 a9 U; i. j. j2 P& a5 O TR0 = 1; // 启动定时器 0: \9 b/ p5 n! S. u
}
/ J! ]7 s" P2 E% ~6 b2 a
/ a: o! x8 U) Y* z, s6 T+ ^6 o// 主程序9 \( B% J5 ~# V" C' ]5 i
void main()
$ A" Z) l* n$ c/ d2 j: [6 C7 b{$ s e1 q' b+ D
// 初始化引脚和定时器
9 {! M- m! D/ U/ M P3M0 = 0x00; / f* F4 Q; K$ F+ \" Z3 n# G( T
P3M1 = 0x00;
7 ]' T: T) N: V! E! A9 x5 ] Init_Timer0();
1 ]0 R$ o! @6 a, x& B3 ] e# H! t5 F; L" h' c7 U1 j; W0 `
// 上电默认模式 1
/ a4 t; f, c" D* [' `5 _ mode = 1;
5 B" F# z, m2 @* _8 x
% ~1 @' ]/ g3 `) g3 B% f2 f& Y // 开启总中断
# s7 Q, M- L( E& X8 o3 a EA = 1;
, W: V' ?, o. S" ^, @( P* a: b6 E# a
while (1) {
% q4 O, `, Y& Y+ l9 x: j" C& x, N$ [( u if (P3_2 == 0) { // 检测 P3.2 按键按下
( o& ^' _' w( H* T S2 V2 q: } mode++; // 切换模式: j: n: O8 W2 }0 @
if (mode > 6) {
' |" ?) l( B V6 K' T" Q9 T, [ mode = 1; // 超出模式范围时,回到模式 1
3 v" F6 [9 @$ Q2 z) ^5 B( |) B; Y% t }
4 v$ q& z) c ?# g prevMode = mode; // 更新上一次的模式
! D+ Y% D7 @2 R& G$ G+ v: @$ T' ^ g }* e$ D \/ u1 T& A. P1 I
}
/ ^5 V d1 b) T$ G& c1 N2 r}
# o4 h2 A& K" ~' f4 f3 L8 S7 D
3 u: [3 V7 r3 f2 o0 q; ?3 v' u求指点,编译出错!9 T P9 Q9 K$ r Z0 K' H
0 Z2 _+ w p' Y; f# n# j |
|