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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
如附件图片功能所述
9 D, g5 ?& T* d7 c0 ^, b  _. \

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

原理图

原理图

该用户从未签到

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:17
3 H5 P5 [* i% s3 @1 R这个功能很简单呀
: B* R$ T5 j7 c' Y) P0 e! ^
可能是我太笨了,写不出来
5 H; U* c/ w# V, _6 U" t

该用户从未签到

4#
 楼主| 发表于 2024-3-26 16:33 | 只看该作者
ce958www 发表于 2024-3-26 14:17* q) c7 h8 d5 c' G$ O, H; N
这个功能很简单呀

+ h7 n. g) A1 D$ p能帮忙写一下吗
7 y- L+ _3 f9 h* v

该用户从未签到

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" g' o% E5 k- `
给你个思路吧,建立一个常数记录按钮按下的次数(记得做个按键防抖),然后写一条指令让这个常数大于4的时 ...
" s- i; L0 d2 a# v$ C1 g
真心有点不适合学3 j1 l6 H5 p( L

点评

#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
( ?6 g. M2 R4 c6 h真心有点不适合学

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-15 05:02 , Processed in 0.125000 second(s), 27 queries , Gzip On.

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

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

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