找回密码
 立即注册
查看: 960|回复: 4

用STC8G1K08做了个单键开关

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:451
  • 最近打卡:2025-05-01 23:07:16
已绑定手机

6

主题

40

回帖

259

积分

中级会员

积分
259
发表于 2023-4-3 16:31:30 | 显示全部楼层 |阅读模式
本帖最后由 xinzui 于 2023-4-3 16:37 编辑
  1. #include "Stc8g.h"
  2. #include "intrins.h"
  3. #include "String.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define ulong unsigned long
  7. #define FOSC 24000000UL
  8. #define BRT1 (65536 - FOSC / 4 / 19200)
  9. #define BRT2 (65536 - FOSC / 4 / 115200)
  10. sbit IN = P5^4;
  11. sbit OUT = P3^3;
  12. bit IN_Check = 0;
  13. uchar xdata Uart_RST = 0;
  14. uint xdata Time_Base = 0;
  15. uint xdata Time_SS = 0;
  16. void SetIO()
  17. {
  18. /*---------------I/O 配置---------------*/
  19. //  PxMx配置I/O端口工作模式
  20. //  PxPU上拉电阻控制
  21. //  PxNCS施密特触发控制
  22.     P0M0 = 0x00;
  23.     P0M1 = 0xFF;
  24.     P1M0 = 0x00;
  25.     P1M1 = 0xFF;
  26.     P2M0 = 0x00;
  27.     P2M1 = 0xFF;
  28.     P3M0 = 0x0C;
  29.     P3M1 = 0xF0;
  30.     P4M0 = 0x00;
  31.     P4M1 = 0xFF;
  32.     P5M0 = 0x00;
  33.     P5M1 = 0xFF;
  34.     P6M0 = 0x00;
  35.     P6M1 = 0xFF;
  36.     P7M0 = 0x00;
  37.     P7M1 = 0xFF;
  38.     P_SW2 |= 0x80;              //  P_SW2^7置1,启用特殊功能寄存器
  39.     P0PU = 0x00;
  40.     P0NCS = 0x00;
  41.     P1PU = 0x00;
  42.     P1NCS = 0x00;
  43.     P2PU = 0x00;
  44.     P2NCS = 0x00;
  45.     P3PU = 0x03;
  46.     P3NCS = 0x00;
  47.     P4PU = 0x00;
  48.     P4NCS = 0x00;
  49.     P5PU = 0x10;
  50.     P5NCS = 0x00;
  51.     P6PU = 0x00;
  52.     P6NCS = 0x00;
  53.     P7PU = 0x00;
  54.     P7NCS = 0x00;
  55.     P_SW2 &= 0x7F;              //  P_SW2^7置0,停用特殊功能寄存器
  56.     P0 = 0xFF;
  57.     P1 = 0xFF;
  58.     P2 = 0xFF;
  59.     P3 = 0xFF;
  60.     P4 = 0xFF;
  61.     P5 = 0xFF;
  62.     P6 = 0xFF;
  63.     P7 = 0xFF;
  64. }
  65. //  Uart调用
  66. /*-----------------Uart发送字符-----------------*/
  67. void UartSendChar(uchar ch)
  68. {
  69.     SBUF = ch;
  70.     while(TI == 0);
  71.     TI = 0;
  72. }
  73. /*----------------Uart发送字符串----------------*/
  74. void UartSendStr(uchar *str)
  75. {
  76.     uint i = 0;
  77.     do
  78.     {
  79.         UartSendChar(*(str + i));
  80.         i ++;
  81.     }while(i < strlen(str));
  82. }
  83. void SetTimer0()            //  设T0为定时器模式
  84. {
  85.     AUXR |= 0x80;           //  定时器时钟1T模式
  86.     TMOD |= 0x03;
  87.     TL0 = 0x01;             //  设置定时初始值
  88.     TH0 = 0x15;             //  设置定时初始值
  89.     TCON &= 0xEF;           //  中断标志清除
  90.     _nop_();
  91.     _nop_();
  92.     _nop_();
  93.     _nop_();
  94.     TCON |= 0x10;           //  启动定时器0
  95. }
  96. void Timer_0() interrupt 1
  97. {
  98.     Time_Base++;
  99.     if(Time_SS)Time_SS--;
  100.     if(Time_Base >= 200)         //  秒计时
  101.     {
  102.         Time_Base = 0;
  103. //        OUT =~ OUT;
  104.     }
  105. }
  106. void SetTimer1()                 //  T1为波特率发生器1T模式 115200bps@24.000MHz
  107. {
  108.     TMOD &= 0x0F;                //  设置定时器模式
  109.     TL1 = BRT2;                   //  设置定时初始值
  110.     TH1 = BRT2 >> 8;              //  设置定时初始值
  111. }
  112. void Timer_1() interrupt 3       //  应用串口后复位不断电下载功能
  113. {
  114.     if(Uart_RST)
  115.     {
  116.         Uart_RST--;
  117.     }else
  118.     {
  119.         IE &= 0xF7;
  120.     }
  121. }
  122. void SetUart1()                  //  串口1
  123. {
  124.     SCON |= 0x50;                //  8位数据,可变波特率
  125.     SCON &= 0xFC;                //  清除中断标志
  126.     AUXR |= 0x40;                //  定时器1 波特率发生器 1T模式
  127. }
  128. void Uart_1() interrupt 4
  129. {
  130.     Uart_n = 0;
  131.     RI = 0;
  132.     if(!Uart_RST && SBUF == 0x7F)
  133.     {
  134.         Uart_n++;
  135.         if(Uart_n >= 0x09)
  136.         {
  137.             Uart_n = 0;
  138.             IAP_CONTR = 0x60;
  139.         }
  140.             }else
  141.     {
  142.         Uart_RST = 0xFF;
  143.         Uart_n = 0;
  144. /*---------------数据接收区--测试用-------------*/
  145.         switch(SBUF)
  146.         {
  147.             case 0x31: Uart1SendStr("OK1\r\n");break;
  148.             case 0x32: Uart1SendStr("OK2\r\n");break;
  149.             case 0x33: Uart1SendStr("OK3\r\n");break;
  150.             case 0x34: Uart1SendStr("OK\r\n");break;
  151.             default:break;
  152.         }
  153.     }
  154. }
  155. void main()
  156. {
  157.     bit Bit_SS = 0;
  158.     IN_Check = IN;
  159.     SetIO();
  160.     SetTimer0();
  161.     SetTimer1();
  162.     SetUart1();
  163.     //  中断设置
  164.     IE |= 0x9A;                 //  中断允许
  165.     while(1)
  166.     {
  167.         if(!IN && IN_Check)
  168.         {
  169.             Time_SS = 200;
  170.             while(Time_SS)
  171.             {
  172.                 if(IN)break; else continue;
  173.             }
  174.             if(OUT)
  175.             {
  176.                 Time_SS = 200;
  177.                 while(Time_SS)
  178.                 {
  179.                     if(IN)break; else continue;
  180.                 }
  181.                 if(!IN)
  182.                 {
  183.                     OUT = 0;
  184.                     UartSendStr("ON");
  185.                     IN_Check = 0;
  186.                 }
  187.             }
  188.             else
  189.             {
  190.                 Time_SS = 500;
  191.                 while(Time_SS)
  192.                 {
  193.                     if(IN)break; else continue;
  194.                 }
  195.                 if(!IN)
  196.                 {
  197.                     OUT = 1;
  198.                     UartSendStr("OFF");
  199.                     IN_Check = 0;
  200.                 }
  201.             }
  202.         }
  203.         else
  204.         {
  205.             if(IN && !IN_Check)
  206.             {
  207.                 Time_SS = 100;
  208.                 while(Time_SS)
  209.                 IN_Check = 1;
  210.                 UartSendStr("Complete");
  211.             }
  212.         }
  213.     }
  214. }
复制代码



单键开关

单键开关
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2025-04-30 10:59:33

25

主题

1154

回帖

2391

积分

超级版主

积分
2391
发表于 2023-4-4 08:56:55 | 显示全部楼层
楼主优秀,STC您因更精彩!
STC官网:https://www.stcai.com/
QQ:2593903262
微信号:18106296598
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:451
  • 最近打卡:2025-05-01 23:07:16
已绑定手机

6

主题

40

回帖

259

积分

中级会员

积分
259
发表于 2023-4-7 11:03:46 | 显示全部楼层
本帖最后由 xinzui 于 2023-4-7 11:26 编辑

我3.5的移动硬盘开关是翘翘板开关,开关的时候老是不干脆,就想换了,用矿坛老哥3AG1的单键开关电路焊了几个,但同参数元件实在凑不齐,以至于效果不理想,干脆就自已设计了个,答应了国学芯用MM发个贴,就将着这个贴说一下程序吧~(不定期)

移动硬盘一键开关

移动硬盘一键开关
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:451
  • 最近打卡:2025-05-01 23:07:16
已绑定手机

6

主题

40

回帖

259

积分

中级会员

积分
259
发表于 2023-4-7 11:13:58 | 显示全部楼层
本帖最后由 xinzui 于 2023-4-7 11:25 编辑

void Timer_0() interrupt 1
{
    Time_Base++;
    if(Time_SS)Time_SS--;
    if(Time_Base >= 200)         //  秒计时
    {
        Time_Base = 0;
//        OUT =~ OUT;
    }
}
这里跟 Time_Base 有关的都是跟本程序无关的
里面有用的只有

void Timer_0() interrupt 1
{
    if(Time_SS)Time_SS--;
}
这一点~就是一个 2.5ms 的定时器0中断,过 2.5ms 进次中断Time_SS减一,Time_SS 到 0 后就不再减了

刚刚看到原来的程序还有些问题,边改边说~

回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:451
  • 最近打卡:2025-05-01 23:07:16
已绑定手机

6

主题

40

回帖

259

积分

中级会员

积分
259
发表于 2023-4-7 18:11:24 来自手机 | 显示全部楼层
C7应该并在R6上,防止上电时硬盘通一下电
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 15:39 , Processed in 0.131379 second(s), 75 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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