EDA365电子论坛网

标题: 那位大哥帮我写个51小代码,感谢! [打印本页]

作者: YJIHXK    时间: 2024-3-26 11:47
标题: 那位大哥帮我写个51小代码,感谢!
如附件图片功能所述
8 X. F! u8 U+ H7 n1 z# D; S: t

原理图.png (62.21 KB, 下载次数: 5)

原理图

原理图

作者: ce958www    时间: 2024-3-26 14:17
这个功能很简单呀
作者: YJIHXK    时间: 2024-3-26 14:30
ce958www 发表于 2024-3-26 14:17
/ o" Q$ W/ n; D) b这个功能很简单呀

) L; F' z$ C% P2 `3 G2 w3 H$ l可能是我太笨了,写不出来
. \/ Z: V# |% L, M( A
作者: YJIHXK    时间: 2024-3-26 16:33
ce958www 发表于 2024-3-26 14:17
! s- X6 c/ t: g8 K8 m* u6 t% a  _) g9 w这个功能很简单呀

* N) P- x. }$ ^' e; t& N能帮忙写一下吗
3 c- S. r) M+ v# D1 Q4 Q8 V
作者: YJIHXK    时间: 2024-3-30 11:02
等待好心人
作者: cyi8    时间: 2024-4-11 08:17
给你个思路吧,建立一个常数记录按钮按下的次数(记得做个按键防抖),然后写一条指令让这个常数大于4的时候直接归零,然后根据按键常数值转到子程序或者直接用IF指令分配按键次数执行指令,这个程序不难的,如果有思路还写不出来程序的话,兄弟你还是考虑一下是否适合学单片机了
作者: YJIHXK    时间: 2024-4-11 11:26
cyi8 发表于 2024-4-11 08:17, a3 a+ ^  o9 Y! @7 A% q
给你个思路吧,建立一个常数记录按钮按下的次数(记得做个按键防抖),然后写一条指令让这个常数大于4的时 ...
) ^9 B" N7 p9 \& i, Y
真心有点不适合学% x, W, M: b1 V& r0 S. n

作者: YJIHXK    时间: 2024-4-11 11:48
YJIHXK 发表于 2024-4-11 11:266 x, {! l- a! o* H
真心有点不适合学
' a& [" S$ [- w3 |' [) X
#include <STC15F101W.h>  // 包含 STC15F101W 单片机头文件: d2 r7 M! r; B' n' g& }* N
$ K% O4 f, k, u) ?
// 定义引脚
1 S5 `1 u: t. T% A6 t# K% Qsbit P3_2 = P3^2;
: N7 V1 b8 u# rsbit P3_3 = P3^3;8 B8 h9 |7 m5 H
: B' T4 g: q$ G& @; p: H
// 定义模式变量和计时器变量. ?! U0 X) S! m4 W8 T4 s
unsigned char mode = 1;
+ E, \! H& y4 _0 x4 eunsigned int timer = 0;
: m, V# g+ Q1 e8 w6 O" k5 G
& Q, t" }* ~8 Y9 @. ^9 C" B// 定义上一次的模式变量,用于断电记忆
$ M" _- ^2 M8 H. j4 T' |unsigned char prevMode = 1;  // 存储上一次的模式/ E6 I* V0 A, h! \* U3 B

6 B( E. t9 X( t( N8 x// 用于存储定时器中断计数; V: w5 S. {1 ]: C
unsigned int interruptCount = 0;+ N9 `+ n* s4 j6 a$ U# b
( g: W: R2 B5 b6 m4 \
// 定时器中断服务程序
1 _8 v" C& J5 p2 L- yvoid Timer0_ISR() interrupt 1  b/ h& d' ?4 u3 M! U
{
0 N9 l, f: S5 G' Y4 o7 F    switch (mode) {1 N( s6 N" u6 t/ g6 B
        case 1:
3 x+ ]$ O+ r6 c2 w. a  x            P3_3 = !P3_3;  // 切换 P3.3 的电平2 T; e# J  a3 @! o  b7 \, `
            interruptCount++;  // 中断计数加 1; O) e0 A2 V9 [/ B0 L8 L
            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒) A' N( S$ ^* p0 A0 ~0 T
                interruptCount = 0; ; _3 u7 \6 l8 @1 [+ T( F
                mode = 2;  // 切换到下一个模式
6 c7 Y5 o+ O1 O4 p  @  U- _            }: T) q  B: F# N5 F: T6 S
            break;
# L* x. Y( E' L4 a- M% H! F6 p        case 2:& S* ?3 V- e7 U. a+ P9 q
            P3_3 = !P3_3;  // 切换 P3.3 的电平
1 e. A9 h9 w1 s& P" ^            interruptCount++;  // 中断计数加 1
- C9 t3 `( R% v  g( a. Y; u3 g5 Y0 o            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒* X" V5 I  ~9 y+ U3 `
                interruptCount = 0; $ {3 J* d  e0 n
                mode = 3;  // 切换到下一个模式
" S2 X7 p7 N$ g6 h: M( ?, e3 y) u            }1 n& m9 y% W! F5 l
            break;# g) v0 U- C% `# k/ l
        case 3:: m8 |" {5 n& Z$ S7 y4 ]+ `' N8 j4 Z' K
            P3_3 = !P3_3;  // 切换 P3.3 的电平  ^; Z* U. A6 Y$ k- y1 ^5 ^# Q. u
            interruptCount++;  // 中断计数加 1
9 e6 O; B5 d* O& }            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒
. E0 Q! u7 x# t! c8 |# J) x! F2 _1 o                interruptCount = 0;
" I- A8 g) K9 ?3 I  t7 f                mode = 4;  // 切换到下一个模式
! l$ V# Y+ ?! t/ B9 e: l) O            }9 t- R" |$ k( b  |$ R  e
            break;, ^" L0 B5 P. H1 d( P; h: M
        case 4:2 \' C0 v6 ^% R
            P3_3 = !P3_3;  // 切换 P3.3 的电平
1 }' K* w: V& t            interruptCount++;  // 中断计数加 1  n! m, X0 d4 E1 n1 [2 w5 n. @! v
            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒
. F% S) W' v( x9 \6 M9 I3 j6 Z                interruptCount = 0; 0 B) y% {' H% d. Y& ~8 Z  [$ ^
                mode = 5;  // 切换到下一个模式7 H1 ]% [  |: W# I5 u( y8 @0 O- H
            }
( T- \1 b/ N3 S7 U9 Y            break;( [2 h$ {2 G" ?' [! k! k+ o* G* g! }" m
        case 5:
  X0 J4 ^9 O5 }/ Z7 S1 L            P3_3 = !P3_3;  // 切换 P3.3 的电平
, D& o  t4 N8 p' f- g4 ?# C' I            interruptCount++;  // 中断计数加 1
9 B: Y# P0 [: V" j1 n            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒
6 M2 |  b7 l  Q                interruptCount = 0;
$ n$ |9 A- v) G  c; p9 g                mode = 6;  // 切换到下一个模式
) u6 d3 U! W9 T: Z* i            }
" \% Y& K: A; z" B            break;- R6 d% t& O% o3 {( b7 J: I1 I
        case 6:; f4 s# `! a/ e2 y# I. X
            P3_3 = !P3_3;  // 切换 P3.3 的电平
8 P! x1 }9 n1 f# H! O4 }6 e& y8 V$ M* t            interruptCount++;  // 中断计数加 1' _* h8 Z( I: N  P5 j! }: ^
            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒4 t7 Z# ~3 q  d6 t/ q
                interruptCount = 0; ( A  T+ [) J0 f; E1 u/ v5 K
                mode = 1;  // 切换到第一个模式,开始新的循环
, i% ~6 g8 Z7 {! O) s/ s2 _            }
; g+ _1 B- f0 Q8 f& w8 Z  U0 Q            break;
: Z5 z0 z5 N  ], a, w    }
/ _' s* n, o& t4 Z: T) G}7 g3 e& c- L  K# G9 {

3 J% {5 B& L" b// 初始化定时器- [% N1 H$ |" S7 w
void Init_Timer0()( u3 m: T6 m3 f
{! d3 X; P& z$ |$ Q  V. l
    TMOD = 0x01;  // 设置定时器 0 为工作模式 1: K3 {8 s; G) O$ Q( f& p9 w
    TH0 = (65536 - 50) / 256;  // 设置定时器初值9 p) k" R1 F: z5 k7 i
    TL0 = (65536 - 50) % 256;  // 设置定时器初值* d2 [1 j2 E! u' _1 A
    ET0 = 1;  // 使能定时器 0 中断
* c( H' m! U* G: e" m/ K9 [    TR0 = 1;  // 启动定时器 0
- p( P2 N6 H7 l5 `+ k9 Z8 g}, Y/ f  v4 Z/ w0 o# i6 y

2 L+ G" N* e8 `// 主程序. n+ @7 I& I1 O! X8 Q
void main()$ q& ?% ]. f/ W. b6 w0 m
{; [) x. \% f  D
    // 初始化引脚和定时器7 l$ d0 E/ A3 {5 A* e
    P3M0 = 0x00;
/ z6 u! i" W" s; J, `/ k! j& M, T    P3M1 = 0x00; % J. X* a2 F6 a0 w; `
    Init_Timer0(); # f/ ~. K1 ^8 M. Y% Z- t! R: C
0 I  ]( a6 k3 \- w
    // 上电默认模式 1+ o$ d; y! W% A5 ~+ V0 j5 F
    mode = 1;
: J) Z9 H! L' s# f: r# ~5 o$ K8 @2 o, K9 m+ Z
    // 开启总中断
( T2 _! R, X. ^( t" A" v7 N    EA = 1;
9 N! O1 m4 }- H2 z  _- n
  g& i) F% u1 |: ]' O: t; X1 D    while (1) {
8 r6 r6 k& T7 C        if (P3_2 == 0) {  // 检测 P3.2 按键按下
' K  b; Z: o+ q( z& l+ Q            mode++;  // 切换模式3 t) o% y$ X9 r% V6 w  y1 }
            if (mode > 6) {
$ v1 L+ l+ o$ t* g                mode = 1;  // 超出模式范围时,回到模式 1. P( I4 Z* \4 P' d9 ]; Z
            }' p, d- f0 i! U1 K( o3 B( A$ X
            prevMode = mode;  // 更新上一次的模式
+ L  e' {1 L) V- [, ?; w        }
! x. a! g5 V, ]+ y6 L8 X    }- [/ W( M* |5 |4 a# Q8 Y
}
& R9 W+ V4 `2 Y$ g0 e+ s% O9 F
' Y1 X! s, q( I' M: n求指点,编译出错!- k  n3 |+ P1 ?$ {

4 M( n: E! B  u; q9 j: ?* o




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2