数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1840|回复: 15

[C51] 新手小白求助论坛会写单片机程序的大神帮帮忙。谢谢。

[复制链接]
发表于 2023-7-8 09:18:35 | 显示全部楼层 |阅读模式
500家元
本帖最后由 kbh 于 2023-7-8 19:00 编辑

就是按照这个图纸写一段代码STC15F104W用的直接可以烧写的代码:
单片机上电时》8脚延时3秒》输出一个1秒低电平》结束
当按下3号引脚开关时》7脚延时3秒》输出一个1秒低电平》结束
当再次按下3号引脚开关时》6脚延时3秒》输出一个1秒低电平》结束
当再次按下3号引脚开关时》5脚延时3秒》输出一个1秒低电平》结束
当再次按下3号引脚开关时》回到8脚延时3秒》输出一个1秒低电平》结束
掉电后可以记忆当前模式。






附件: 您需要 登录 才可以下载或查看,没有账号?立即注册
发表于 2023-7-8 09:18:36 | 显示全部楼层
kbh 发表于 2023-7-12 12:07
能不能按照我要求写完整啊?你这样不符合要求我怎么给你悬赏?
  1. //用户程序运行时的IRC频率为11.0592MHz
  2. /***
  3. 1.程序在STC15W408AS中测试运行正常、测试时按键为P3.7端口
  4. 2.程序步骤:上电-->3s后8脚低1s后高-->按键1次-->3s后7脚低1s后高-->按键2次-->3s后6脚低1s后高-->按键3次-->3s后5脚低1s后高-->循环
  5. 3.没有掉电记忆功能,每次系统上电皆依上述步骤运行
  6. ***/


  7. #include <stc15.h>
  8. #include <intrins.h>

  9. typedef unsigned char u8;
  10. typedef unsigned int u16;

  11. sbit kh = P3 ^ 5;  //按键端口
  12. bit flag0, flag1;  //不循环执行标志、计时等待标志
  13. u8 n, count, ts;

  14. //-----------------------------------------------
  15. void delay_ms(u16 value) //@11.0592MHz
  16. {
  17.     u8 i, j;

  18.     while(value > 0)
  19.     {
  20.         _nop_();
  21.         _nop_();
  22.         _nop_();
  23.         i = 11;
  24.         j = 190;

  25.         do
  26.         {
  27.             while (--j);
  28.         }
  29.         while (--i);

  30.         value--;
  31.     }
  32. }
  33. //----定时器0初始化函数-----------------------------
  34. void Timer0_Init(void)  //50毫秒@11.0592MHz
  35. {
  36.     AUXR &= 0x7F;   //定时器时钟12T模式
  37.     TMOD &= 0xF0;   //设置定时器模式
  38.     TL0 = 0x00;    //设置定时初始值
  39.     TH0 = 0x4C;    //设置定时初始值
  40.     ET0 = 1;     //使能定时器0中断
  41. }
  42. //----定时器0中断函数-------------------------------
  43. void TM0_Isr() interrupt 1
  44. {
  45.     if(count++ > ts) //定时ts*50ms
  46.     {
  47.         count = 0;
  48.         flag1 = 0;
  49.         TR0 = 0;
  50.     }
  51. }
  52. //----定时器0启动函数-------------------------------
  53. void T0_enable(u8 t) //t值仅为1或3,1为1秒延时,3为3秒延时
  54. {
  55.     TL0 = 0x00;
  56.     TH0 = 0x4C;
  57.     TR0 = 1;
  58.     flag1 = 1;

  59.     if(t == 1)
  60.     {
  61.         ts = 20;
  62.     }

  63.     if(t == 3)
  64.     {
  65.         ts = 60;
  66.     }
  67. }
  68. //----按键函数----------------------------------
  69. void key_out()
  70. {
  71.     if(kh == 0)
  72.     {
  73.         delay_ms(10);

  74.         if(kh == 0)
  75.         {
  76.             flag0 = 1;
  77.             n++;

  78.             if(n > 3)
  79.                 n = 0;
  80.         }

  81.         while(!kh);
  82.     }
  83. }
  84. //----主函数----------------------------------------
  85. void main ()
  86. {

  87.     P3M0 = 0x0f;
  88.     P3M1 = 0x00;
  89.     EA = 1;
  90.     Timer0_Init();
  91.     kh = 1;
  92.     flag0 = 1;
  93.     flag1 = 1;
  94.     n = 0;
  95.     count = 0;

  96.     while(1)
  97.     {

  98.         key_out();

  99.         if((flag0 == 1) && (n == 0))
  100.         {
  101.             T0_enable(3);

  102.             while(flag1) P3 = 0xff;

  103.             T0_enable(1);

  104.             while(flag1) P33 = 0;  //上电3秒后P3.3(pin-8)低电平1秒

  105.             P3 = 0xff;      //低电平1秒后全部高电平
  106.             flag0 = 0;
  107.         }
  108.         else if((flag0 == 1) && (n != 0))
  109.         {
  110.             switch(n)
  111.             {
  112.                 case 1:
  113.                     T0_enable(3);

  114.                     while(flag1) P3 = 0xff;

  115.                     T0_enable(1);

  116.                     while(flag1) P32 = 0;  //上电3秒后P3.2(pin-7)低电平1秒

  117.                     P3 = 0xff;      //低电平1秒后全部高电平
  118.                     flag0 = 0;
  119.                     break;

  120.                 case 2:
  121.                     T0_enable(3);

  122.                     while(flag1) P3 = 0xff;

  123.                     T0_enable(1);

  124.                     while(flag1) P31 = 0;  //上电3秒后P3.1(pin-6)低电平1秒

  125.                     P3 = 0xff;
  126.                     flag0 = 0;
  127.                     break;

  128.                 case 3:
  129.                     T0_enable(3);

  130.                     while(flag1) P3 = 0xff;

  131.                     T0_enable(1);

  132.                     while(flag1) P30 = 0;  //上电3秒后P3.0(pin-5)低电平1秒

  133.                     P3 = 0xff;
  134.                     flag0 = 0;
  135.                     break;

  136.                 default:
  137.                     P3 = 0xff;
  138.             }
  139.         }

  140.     }
  141. }
复制代码



回复

使用道具 举报

 楼主| 发表于 2023-7-8 16:56:50 | 显示全部楼层
本帖最后由 kbh 于 2023-7-8 17:47 编辑

拜托各位高手
回复

使用道具 举报

发表于 2023-7-8 17:52:02 | 显示全部楼层
专业强的技术求取
回复

使用道具 举报

发表于 2023-7-9 19:04:25 | 显示全部楼层
#include <reg52.h>

#define SWITCH_PIN P3_3
#define OUTPUT_PIN P1_0

unsigned char mode = 0;

void delay(unsigned int ms) {
    unsigned int i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--);
}

void switchPressed() {
    if (mode == 0) {
        mode = 1;
        delay(3000);
        OUTPUT_PIN = 0;
        delay(1000);
        OUTPUT_PIN = 1;
    } else if (mode == 1) {
        mode = 2;
        delay(3000);
        OUTPUT_PIN = 0;
        delay(1000);
        OUTPUT_PIN = 1;
    } else if (mode == 2) {
        mode = 3;
        delay(3000);
        OUTPUT_PIN = 0;
        delay(1000);
        OUTPUT_PIN = 1;
    } else if (mode == 3) {
        mode = 4;
        delay(3000);
        OUTPUT_PIN = 0;
        delay(1000);
        OUTPUT_PIN = 1;
    } else if (mode == 4) {
        mode = 0;
        delay(3000);
        OUTPUT_PIN = 0;
        delay(1000);
        OUTPUT_PIN = 1;
    }
}

void main() {
    SWITCH_PIN = 1;  // 设置3号引脚为输入
    OUTPUT_PIN = 1; // 设置1号引脚为输出
    EA = 1;         // 允许全局中断

    if (SWITCH_PIN == 0) {
        mode = 1;  // 上电时,如果3号引脚按下,则初始模式为1
    }

    while (1) {
        if (mode == 0) {
            delay(3000);
            OUTPUT_PIN = 0;
            delay(1000);
            OUTPUT_PIN = 1;
        }

        if (SWITCH_PIN == 0) {
            switchPressed();
        }
    }
}


给钱给钱

回复

使用道具 举报

发表于 2023-7-9 20:17:49 | 显示全部楼层
nemesis_126 发表于 2023-7-9 19:04
#include

#define SWITCH_PIN P3_3

好像没有实现掉电存储,不知道stc单芯片能不能实现
回复

使用道具 举报

发表于 2023-7-9 20:28:36 | 显示全部楼层
eir 发表于 2023-7-9 20:17
好像没有实现掉电存储,不知道stc单芯片能不能实现

stc15没ADC无法自己进入掉电模式
回复

使用道具 举报

 楼主| 发表于 2023-7-10 09:22:16 来自手机浏览器 | 显示全部楼层
nemesis_126 发表于 2023-7-9 19:04
#include

#define SWITCH_PIN P3_3

虽然我不懂程序,但是你这明显跟我要求不符啊。我要求是8765脚,根据3脚轻触开关轮流输出。你这1脚输出明显是不对的啊。
回复

使用道具 举报

发表于 2023-7-10 10:43:24 | 显示全部楼层
有iap就可以,每次按键就存储一下!
回复

使用道具 举报

发表于 2023-7-10 18:36:35 来自手机浏览器 | 显示全部楼层
我是来学习的,那串代码复制后怎么变成bin还不会
回复

使用道具 举报

发表于 2023-7-10 20:02:09 | 显示全部楼层
leafeg 发表于 2023-7-10 10:43
有iap就可以,每次按键就存储一下!

能这样写,但eeprom有寿命,直接用stc8最好,价钱一样
回复

使用道具 举报

 楼主| 发表于 2023-7-12 12:07:30 来自手机浏览器 | 显示全部楼层
nemesis_126 发表于 2023-7-9 19:04
#include

#define SWITCH_PIN P3_3

能不能按照我要求写完整啊?你这样不符合要求我怎么给你悬赏?
回复

使用道具 举报

 楼主| 发表于 2023-7-12 14:12:36 | 显示全部楼层

最佳答案
虽然不能记忆但是你的是最接近我要求的。
回复

使用道具 举报

发表于 2023-7-13 18:04:13 | 显示全部楼层
破天一见 发表于 2023-7-10 18:36
我是来学习的,那串代码复制后怎么变成bin还不会

编译,编译完成即可
回复

使用道具 举报

发表于 2023-7-13 22:08:15 来自手机浏览器 | 显示全部楼层
宏达工控 发表于 2023-7-13 18:04
编译,编译完成即可

安装包体积最小的软件,编译用哪个名字的软件呢,就是导入,复制粘贴,编译最简化的
回复

使用道具 举报

发表于 2023-7-14 10:47:29 | 显示全部楼层
破天一见 发表于 2023-7-13 22:08
安装包体积最小的软件,编译用哪个名字的软件呢,就是导入,复制粘贴,编译最简化的 ...

看你用啥系列方便,C51使用Keil C51
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-11-21 17:04 , Processed in 0.171601 second(s), 12 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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