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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
如附件图片功能所述
" q# k' E, b" }: T! N7 v

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

原理图

原理图

该用户从未签到

7#
 楼主| 发表于 2024-4-11 11:48 | 只看该作者
YJIHXK 发表于 2024-4-11 11:267 A+ |5 w8 j, c  E1 X
真心有点不适合学
$ 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

该用户从未签到

6#
 楼主| 发表于 2024-4-11 11:26 | 只看该作者
cyi8 发表于 2024-4-11 08:17! N. T( r* i7 {5 X& B" T4 W/ Q
给你个思路吧,建立一个常数记录按钮按下的次数(记得做个按键防抖),然后写一条指令让这个常数大于4的时 ...

* j" i9 p* ?* C. v真心有点不适合学3 {  x/ q$ U( N& 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

该用户从未签到

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

点评

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

该用户从未签到

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

该用户从未签到

3#
 楼主| 发表于 2024-3-26 16:33 | 只看该作者
ce958www 发表于 2024-3-26 14:174 F2 l/ c: H; T! v4 X2 `/ h
这个功能很简单呀

7 {* W5 ~' T7 C  n3 ^4 \能帮忙写一下吗
; f+ y+ g' t. l8 F. `; x& X

该用户从未签到

2#
 楼主| 发表于 2024-3-26 14:30 | 只看该作者
ce958www 发表于 2024-3-26 14:17
# w% [7 n" f. V' [  x. e这个功能很简单呀

$ l) N8 W& G  ~6 N" c可能是我太笨了,写不出来$ b4 K. ^5 E9 ?) n  \

该用户从未签到

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

点评

能帮忙写一下吗  详情 回复 发表于 2024-3-26 16:33
可能是我太笨了,写不出来  详情 回复 发表于 2024-3-26 14:30
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2026-4-18 22:54 , Processed in 0.093750 second(s), 28 queries , Gzip On.

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

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

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