数码之家

 找回密码
 立即注册
搜索
查看: 1796|回复: 58

[C51] 求大佬写个STC8的定时+点灯的程序

[复制链接]
发表于 2024-7-31 20:22:10 | 显示全部楼层 |阅读模式
求大佬写个定时+点灯的程序

硬件这样吧,不知道有没有错,MCU用的STC8G1K08A-36I-DFN8
只要实现定时+点灯

1、开机后每灭20秒亮1秒,无操作0.5小时后关机或灯停止闪
2、K2断开0.5小时定时关机,闭合2小定时关机
3、K1触发一次重新计时0.5或2小时。

不知道能不能实现这些功能。

求大佬给个 keil能编译过的程序或编译好的固件也行




本帖子中包含更多资源

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

x
发表于 2024-7-31 20:25:33 | 显示全部楼层
直接到STC官网下载个例程,稍微改下就可以了
回复 支持 反对

使用道具 举报

发表于 2024-7-31 20:32:44 | 显示全部楼层
看不懂这是干啥,不过这写死了以后就不能改了吧,为毛不设计成通用的???

---------------
回复 支持 反对

使用道具 举报

发表于 2024-7-31 20:41:50 | 显示全部楼层
逻辑没有冲突,可以实现。
另外LED要加限流电阻。
回复 支持 反对

使用道具 举报

发表于 2024-7-31 20:56:28 来自手机浏览器 | 显示全部楼层
去米斯奇图形化看看…
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-31 20:57:14 | 显示全部楼层
guer 发表于 2024-7-31 20:25
直接到STC官网下载个例程,稍微改下就可以了

完全不懂代码 搞不定
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-31 21:04:03 | 显示全部楼层
路过羊圈的狼 发表于 2024-7-31 20:41
逻辑没有冲突,可以实现。
另外LED要加限流电阻。

LED只是一个输出,那里接其他芯片上用的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-31 21:04:25 | 显示全部楼层
触景情伤 发表于 2024-7-31 20:56
去米斯奇图形化看看…

米奇有stc8的??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-31 21:15:00 | 显示全部楼层
邪恶海盗 发表于 2024-7-31 20:32
看不懂这是干啥,不过这写死了以后就不能改了吧,为毛不设计成通用的???

--------------- ...

怎么个通用法?不懂代码,我想要实现的就是开机每20秒灯那里下拉1秒。K1位置XX时间无操作就关机会休眠。按下K2后YYY时间K1无操作关机。能实现就行了
回复 支持 反对

使用道具 举报

发表于 2024-7-31 21:47:29 | 显示全部楼层
jeromeli 发表于 2024-7-31 21:15
怎么个通用法?不懂代码,我想要实现的就是开机每20秒灯那里下拉1秒。K1位置XX时间无操作就关机会休眠。 ...

不懂这个目的到底是啥,没办法给建议...

----------------
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-31 22:01:25 | 显示全部楼层
邪恶海盗 发表于 2024-7-31 21:47
不懂这个目的到底是啥,没办法给建议...

----------------

相当于模拟一个按键, 没20秒按一下,K1无动作0.5小时后停止。如果有按键则重新开始计时
回复 支持 反对

使用道具 举报

发表于 2024-7-31 22:06:56 | 显示全部楼层
jeromeli 发表于 2024-7-31 22:01
相当于模拟一个按键, 没20秒按一下,K1无动作0.5小时后停止。如果有按键则重新开始计时 ...

这只是过程,不是目的...

-----------------------
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-31 22:08:43 | 显示全部楼层
邪恶海盗 发表于 2024-7-31 22:06
这只是过程,不是目的...

-----------------------

目的就是P3.2那里接其他芯片上做定时按键,每隔20秒按一下
回复 支持 反对

使用道具 举报

发表于 2024-8-1 10:23:22 | 显示全部楼层
本帖最后由 devcang 于 2024-8-1 11:37 编辑

供参考——现成的引脚、中断等,是仿真用的。



代码不长,为了代码好看,使用图片。。。


也是抄自STC-ISP工具(完整版)里面的例子:定时器、外部中断、省电模式,等。








本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2024-8-1 10:43:25 | 显示全部楼层
可以天问图形化的,在不行直接让AI写个
回复 支持 反对

使用道具 举报

发表于 2024-8-1 10:54:44 | 显示全部楼层
官方网站有很多资料可以参考
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-1 11:50:16 | 显示全部楼层
devcang 发表于 2024-8-1 10:23
供参考——现成的引脚、中断等,是仿真用的。

非常感谢等后天板子到了试试行不行
回复 支持 反对

使用道具 举报

发表于 2024-8-1 14:17:57 | 显示全部楼层
这个是AI写的,一个基础的示例,实际应用中可能需要根据具体的硬件和开发环境进行调整。
#include <REGX52.H> // 包含STC8系列单片机的寄存器定义

#define LED P3_2 // 定义LED接的端口
#define K1 P5_4 // 定义按键K1接的端口
#define K2 P3_3 // 定义按键K2接的端口

unsigned int timer = 0; // 定义定时器变量
unsigned char state = 0; // 定义状态变量,0表示开机,1表示K1触发,2表示K2触发

void Delay(unsigned int ms) { // 毫秒级延时函数
    unsigned int i, j;
    for (i = ms; i > 0; i--)
        for (j = 110; j > 0; j--);
}

void Timer0_Init() { // 定时器0初始化
    TMOD &= 0xF0; // 设置定时器模式
    TMOD |= 0x01; // 定时器0工作在模式1
    TH0 = (65536 - 500) / 256; // 定时器初值设置,这里设置为500ms中断一次
    TL0 = (65536 - 500) % 256;
    ET0 = 1; // 开启定时器0中断
    EA = 1; // 开启总中断
    TR0 = 1; // 启动定时器0
}

void Check_K1() { // 检测按键K1是否被触发
    if (K1 == 0) { // 检测到按键按下
        Delay(20); // 去抖动
        if (K1 == 0) {
            state = 1; // 设置状态为K1触发
            timer = 0; // 重置定时器
        }
    }
}

void Check_K2() { // 检测按键K2是否被触发
    if (K2 == 0) { // 检测到按键按下
        Delay(20); // 去抖动
        if (K2 == 0) {
            state = 2; // 设置状态为K2触发
            timer = 0; // 重置定时器
        }
    }
}

void Timer0_ISR() interrupt 1 { // 定时器0中断服务程序
    TH0 = (65536 - 500) / 256; // 重新加载定时器初值
    TL0 = (65536 - 500) % 256;
    timer += 1; // 定时器增加

    switch (state) {
        case 0: // 开机状态
            if (timer % 21 == 0) { // 每20秒
                LED = !LED; // 切换LED状态
            }
            break;
        case 1: // K1触发状态
            if (timer >= 30) { // 0.5小时后
                while (1); // 关机
            }
            break;
        case 2: // K2触发状态
            if (timer >= 120) { // 2小时后
                while (1); // 关机
            }
            break;
    }
}

void main() {
    Timer0_Init(); // 初始化定时器
    while (1) {
        Check_K1(); // 检查按键K1
        Check_K2(); // 检查按键K2
    }
}
回复 支持 反对

使用道具 举报

发表于 2024-8-1 14:23:23 | 显示全部楼层
已经有大佬了,我这种半吊子就不献丑了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-1 20:19:23 | 显示全部楼层
本帖最后由 jeromeli 于 2024-8-3 13:18 编辑
xueyuking 发表于 2024-8-1 14:17
这个是AI写的,一个基础的示例,实际应用中可能需要根据具体的硬件和开发环境进行调整。
#include  // 包含 ...
  1. #include <stc8g.h> // 包含STC8系列单片机的寄存器定义

  2. #define LED P3^2 // 定义LED接的端口
  3. #define K1 P5^4 // 定义按键K1接的端口
  4. #define K2 P3^3 // 定义按键K2接的端口

  5. unsigned int timer = 0; // 定义定时器变量
  6. unsigned char state = 0; // 定义状态变量,0表示开机,1表示K1触发,2表示K2触发

  7. void Delay(unsigned int ms) { // 毫秒级延时函数
  8.     unsigned int i, j;
  9.     for (i = ms; i > 0; i--)
  10.         for (j = 110; j > 0; j--);
  11. }

  12. void Timer0_Init() { // 定时器0初始化
  13.     TMOD &= 0xF0; // 设置定时器模式
  14.     TMOD |= 0x01; // 定时器0工作在模式1
  15.     TH0 = (65536 - 500) / 256; // 定时器初值设置,这里设置为500ms中断一次
  16.     TL0 = (65536 - 500) % 256;
  17.     ET0 = 1; // 开启定时器0中断
  18.     EA = 1; // 开启总中断
  19.     TR0 = 1; // 启动定时器0
  20. }

  21. void Check_K1() { // 检测按键K1是否被触发
  22.     if (K1 == 0) { // 检测到按键按下
  23.         Delay(200); // 去抖动
  24.         if (K1 == 0) {
  25.             state = 1; // 设置状态为K1触发
  26.             timer = 0; // 重置定时器
  27.         }
  28.     }
  29. }

  30. void Check_K2() { // 检测按键K2是否被触发
  31.     if (K2 == 0) { // 检测到按键按下
  32.         Delay(200); // 去抖动
  33.         if (K2 == 0) {
  34.             state = 2; // 设置状态为K2触发
  35.             timer = 0; // 重置定时器
  36.         }
  37.     }
  38. }

  39. void Timer0_ISR() interrupt 1 { // 定时器0中断服务程序
  40.     TH0 = (65536 - 500) / 256; // 重新加载定时器初值
  41.     TL0 = (65536 - 500) % 256;
  42.     timer += 1; // 定时器增加

  43.     switch (state) {
  44.         case 0: // 开机状态
  45.             if (timer % 21 == 0) { // 每20秒
  46.            LED = !LED; // 切换LED状态
  47.             }
  48.             break;
  49.         case 1: // K1触发状态
  50.             if (timer >= 30) { // 0.5小时后
  51.                 while (1); // 关机
  52.             }
  53.             break;
  54.         case 2: // K2触发状态
  55.             if (timer >= 120) { // 2小时后
  56.                 while (1); // 关机
  57.             }
  58.             break;
  59.     }
  60. }

  61. void main() {
  62.     Timer0_Init(); // 初始化定时器
  63.     while (1) {
  64.         Check_K1(); // 检查按键K1
  65.         Check_K2(); // 检查按键K2
  66.     }
  67. }
复制代码
报错这个是什么鬼??

Rebuild started: Project: STC8
Rebuild target 'Target 1'
compiling led.c...
led.c(54): error C141: syntax error near '=', expected ';'
Target not created.
Build Time Elapsed:  00:00:00

54行??红色那里就是54行
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-10 23:26 , Processed in 0.124800 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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