找回密码
 注册
关于网站域名变更的通知
查看: 474|回复: 7
打印 上一主题 下一主题

那位大哥帮我写个51小代码,感谢!

[复制链接]

该用户从未签到

跳转到指定楼层
1#
 楼主| 发表于 2024-3-26 11:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
如附件图片功能所述
& _6 y5 n  N2 P7 K( D

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

原理图

原理图

该用户从未签到

2#
发表于 2024-3-26 14:17 | 只看该作者
这个功能很简单呀

点评

能帮忙写一下吗  详情 回复 发表于 2024-3-26 16:33
可能是我太笨了,写不出来  详情 回复 发表于 2024-3-26 14:30

该用户从未签到

3#
 楼主| 发表于 2024-3-26 14:30 | 只看该作者
ce958www 发表于 2024-3-26 14:170 u! A+ c6 n3 R* h1 K
这个功能很简单呀
0 q3 v& _6 w$ E) W; g
可能是我太笨了,写不出来# h7 a* I* x$ w9 M) T

该用户从未签到

4#
 楼主| 发表于 2024-3-26 16:33 | 只看该作者
ce958www 发表于 2024-3-26 14:17
0 V& l% L* E# W9 p这个功能很简单呀
4 N- _" ^+ m2 l7 ~
能帮忙写一下吗
  a8 D' h! W6 c  T' @- q

该用户从未签到

5#
 楼主| 发表于 2024-3-30 11:02 | 只看该作者
等待好心人

该用户从未签到

6#
发表于 2024-4-11 08:17 | 只看该作者
给你个思路吧,建立一个常数记录按钮按下的次数(记得做个按键防抖),然后写一条指令让这个常数大于4的时候直接归零,然后根据按键常数值转到子程序或者直接用IF指令分配按键次数执行指令,这个程序不难的,如果有思路还写不出来程序的话,兄弟你还是考虑一下是否适合学单片机了

点评

真心有点不适合学  详情 回复 发表于 2024-4-11 11:26

该用户从未签到

7#
 楼主| 发表于 2024-4-11 11:26 | 只看该作者
cyi8 发表于 2024-4-11 08:17
) E- p& ?; ]8 }4 k给你个思路吧,建立一个常数记录按钮按下的次数(记得做个按键防抖),然后写一条指令让这个常数大于4的时 ...
( _! Z7 u, k+ }8 r! f: d
真心有点不适合学
9 ^1 D! x" c+ ]4 Z9 z; t

点评

#include // 包含 STC15F101W 单片机头文件 // 定义引脚 sbit P3_2 = P3^2; sbit P3_3 = P3^3; // 定义模式变量和计时器变量 unsigned char mode = 1; unsigned int timer = 0; // 定义上一次的模  详情 回复 发表于 2024-4-11 11:48

该用户从未签到

8#
 楼主| 发表于 2024-4-11 11:48 | 只看该作者
YJIHXK 发表于 2024-4-11 11:26
" h: o3 L- l5 ~2 z7 v8 g真心有点不适合学

* m: i7 m  H: Z3 ^#include <STC15F101W.h>  // 包含 STC15F101W 单片机头文件
  {5 j  j( M4 @' n& |* D
* }0 F1 z4 W+ G3 R) l, O// 定义引脚- P/ o4 Z# _7 V) A
sbit P3_2 = P3^2;
: T& K- e. H$ d8 Csbit P3_3 = P3^3;
7 g' A* h6 o& j/ a: t
( d" W$ s$ Q. M0 n1 q/ Q// 定义模式变量和计时器变量& d, D' R7 j" k- D2 x
unsigned char mode = 1;
6 l9 M4 O7 L5 {+ |! g6 Vunsigned int timer = 0;
' D. g6 [$ u6 J4 y& W4 E7 s( O& r2 s+ W( Y# Q" J- G
// 定义上一次的模式变量,用于断电记忆
7 l: L, J) \' q) Zunsigned char prevMode = 1;  // 存储上一次的模式
; X- K, _" H% ^6 r4 W6 @+ R6 G- E; C6 r: {, p
// 用于存储定时器中断计数
9 @5 y' K) M+ w7 L! J8 L1 tunsigned int interruptCount = 0;4 Q, a+ T# p) Z. s9 ^4 V
! v3 r4 p0 c1 w$ y1 |, \2 E
// 定时器中断服务程序
) l9 M, k0 A. }% nvoid Timer0_ISR() interrupt 14 a3 p8 X) G7 m2 d7 Z
{- R6 @) ^% p0 H$ I9 P+ H
    switch (mode) {
2 |- R& k% p/ ?( S6 B        case 1:
' B+ ]2 g" u. _. v            P3_3 = !P3_3;  // 切换 P3.3 的电平
' k% V" s2 ]+ i8 S( H            interruptCount++;  // 中断计数加 1
0 j* S/ q* O1 j2 y            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒% ]+ v8 ~/ W8 ?4 T2 s1 |, r5 k
                interruptCount = 0; % U7 V  w1 n8 D2 }1 z, Z# C4 i, k6 n
                mode = 2;  // 切换到下一个模式
5 E  {$ u: s! r& v2 n* t            }
. y; x1 O/ G% o. s; b- [, c            break;: G, K( F, c3 i4 v2 ~5 J
        case 2:
1 u9 X0 l1 T) Y: Y" r. x2 l            P3_3 = !P3_3;  // 切换 P3.3 的电平
; Q8 M8 w) p  o. a% A- k: [            interruptCount++;  // 中断计数加 1% L0 H) {+ D: r. B% q0 W
            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒0 c! I! P% L5 G$ i
                interruptCount = 0;
5 c2 W: n5 h6 M% s9 P                mode = 3;  // 切换到下一个模式- t( ?2 Q8 C8 `& H% s3 p' f
            }# z, o4 ^% z: T, d/ @$ I1 m0 C5 [/ f
            break;
% k1 N) @1 N- F6 g9 h        case 3:# C- j# A8 a! F0 I0 D
            P3_3 = !P3_3;  // 切换 P3.3 的电平* E/ s/ o- e3 @: {7 c* ]
            interruptCount++;  // 中断计数加 1
6 i# |4 V2 }9 R0 ]; x5 A9 r            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒
0 J- W/ c1 d6 f2 o0 V# d! a                interruptCount = 0; 1 M* j  |0 |4 M  j
                mode = 4;  // 切换到下一个模式( S7 O- q2 f) p* L, L- D3 j# n
            }
* Y# [: K* C4 K7 ?& D* M6 J  z            break;
9 P' ?. P& d* @% f        case 4:- l' v3 I9 r" b3 h# N, X3 a0 W6 ]# a
            P3_3 = !P3_3;  // 切换 P3.3 的电平: L6 V8 X- c6 l& ]( |* V
            interruptCount++;  // 中断计数加 12 f4 ]  y9 B. w2 \0 f: A: a
            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒
7 Q) }9 M3 N! C. c% [                interruptCount = 0; " C3 Y$ b& q- p. S2 Z1 X
                mode = 5;  // 切换到下一个模式
  d/ [( R, L  l6 G! [" M            }- s  h8 G( h* m2 R# m9 P4 U3 o
            break;
3 S% k6 S- P- p) K6 b& V        case 5:+ T. `: e0 @3 G. q
            P3_3 = !P3_3;  // 切换 P3.3 的电平' y7 E4 }' m6 m3 Q$ t7 E$ v
            interruptCount++;  // 中断计数加 1
; ]/ R6 W' N1 f: F# s' ~+ T+ m            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒
. r7 `1 o; v$ e7 P! v: x  I" l                interruptCount = 0;
# E" S7 ~2 Q4 }" a                mode = 6;  // 切换到下一个模式# H* L- q, d$ z- d. |! G; L9 u
            }4 c, |9 w2 \0 f! U4 |% ^' m& w/ Q& n6 U
            break;
) v8 R  z6 R6 X        case 6:
" R6 r7 U) `2 d$ z' t' i            P3_3 = !P3_3;  // 切换 P3.3 的电平
; _: C! e) o8 z5 H. q, b; d! P            interruptCount++;  // 中断计数加 1
( k3 J7 Q" W  k* f            if (interruptCount == 50) {  // 中断计数达到 50,即 0.5 秒4 q3 V9 A4 g+ r7 {+ {; h
                interruptCount = 0;
7 J1 u2 Z6 C" I                mode = 1;  // 切换到第一个模式,开始新的循环
9 z' K" `+ b+ F( ~4 ]: \: ~            }
- M0 M# H, y# o+ F            break;. P7 q: c" V3 A* Z; A1 D- H
    }
$ a% r- |4 K9 U% D0 H8 X% }: U. R}
+ N* q: o+ L( p% O' m- T# {5 w& [8 q; R3 e
// 初始化定时器
9 {! ]; V: j3 }9 R9 H/ kvoid Init_Timer0(), W+ |5 t5 J, \3 O) B  _6 ]; b0 s* |
{
# }6 [+ [2 K/ J4 W# e3 D  R    TMOD = 0x01;  // 设置定时器 0 为工作模式 18 P- K* V: C: b
    TH0 = (65536 - 50) / 256;  // 设置定时器初值
- x0 U6 V, P2 W: P" p    TL0 = (65536 - 50) % 256;  // 设置定时器初值
. r5 @( `. Z# z; P& Y7 ]5 Z7 v    ET0 = 1;  // 使能定时器 0 中断, i% m/ L  G' W/ X6 ?
    TR0 = 1;  // 启动定时器 0; S! C" }( t( u" ?4 k" e
}9 V4 m3 _7 w5 ~3 a1 N

0 w0 c# c) J7 n% z  {0 W// 主程序, p1 E0 @- v. i
void main()
2 @/ L' b' b& A  \8 \  S& w7 v{- j1 d7 U& y+ L% |2 O) Y
    // 初始化引脚和定时器- R/ {; w) Y! i8 H, @& D4 x% Z# c
    P3M0 = 0x00; - G* I. Y6 N" C. |3 t
    P3M1 = 0x00; 4 m# }( y& A( q( P$ t
    Init_Timer0(); 3 m% D5 z! l! A' _. V
% L+ V7 f! B7 s
    // 上电默认模式 1
0 a0 a$ I- v- r. i: ~7 s    mode = 1;
3 x* S+ c# P5 B2 c; i) V
" J1 J1 d8 H9 `    // 开启总中断
: `+ a8 p; k5 b  `    EA = 1;   V) X3 ~- P7 }' Y% P! Y

2 k' W# j  m; ^" f. G    while (1) {
' F/ z8 ^6 q0 N; I: F3 p6 H% l        if (P3_2 == 0) {  // 检测 P3.2 按键按下
8 Q: Y; A4 c* O: E, M$ H            mode++;  // 切换模式
6 e6 i- K8 b  O3 @5 C% m6 [            if (mode > 6) {5 }' @: k: ^) `7 p$ w& Z* P3 t
                mode = 1;  // 超出模式范围时,回到模式 1
6 u) N9 k, W8 i: @+ f1 J- W            }' e& o, L6 f& Z  v, t$ i5 R
            prevMode = mode;  // 更新上一次的模式
, W5 V- `: v. }( a) q0 ]        }
8 e- A5 p) L+ A/ F  F    }/ v1 I% ]  Y& v5 V
}
6 f$ T+ B; d* L; z$ |* K2 m, L# {9 Z# m( }, H
求指点,编译出错!8 t9 W2 @: n: \. U, Q. _

4 n+ {" ]! f% m7 ]6 w# i
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-13 10:01 , Processed in 0.171875 second(s), 28 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表