xinzui 发表于 2023-4-3 16:31:30

用STC8G1K08做了个单键开关

本帖最后由 xinzui 于 2023-4-3 16:37 编辑

#include "Stc8g.h"
#include "intrins.h"
#include "String.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define FOSC 24000000UL
#define BRT1 (65536 - FOSC / 4 / 19200)
#define BRT2 (65536 - FOSC / 4 / 115200)

sbit IN = P5^4;
sbit OUT = P3^3;


bit IN_Check = 0;

uchar xdata Uart_RST = 0;
uint xdata Time_Base = 0;
uint xdata Time_SS = 0;

void SetIO()
{
/*---------------I/O 配置---------------*/
//PxMx配置I/O端口工作模式
//PxPU上拉电阻控制
//PxNCS施密特触发控制
    P0M0 = 0x00;
    P0M1 = 0xFF;
    P1M0 = 0x00;
    P1M1 = 0xFF;
    P2M0 = 0x00;
    P2M1 = 0xFF;
    P3M0 = 0x0C;
    P3M1 = 0xF0;
    P4M0 = 0x00;
    P4M1 = 0xFF;
    P5M0 = 0x00;
    P5M1 = 0xFF;
    P6M0 = 0x00;
    P6M1 = 0xFF;
    P7M0 = 0x00;
    P7M1 = 0xFF;
    P_SW2 |= 0x80;            //P_SW2^7置1,启用特殊功能寄存器
    P0PU = 0x00;
    P0NCS = 0x00;
    P1PU = 0x00;
    P1NCS = 0x00;
    P2PU = 0x00;
    P2NCS = 0x00;
    P3PU = 0x03;
    P3NCS = 0x00;
    P4PU = 0x00;
    P4NCS = 0x00;
    P5PU = 0x10;
    P5NCS = 0x00;
    P6PU = 0x00;
    P6NCS = 0x00;
    P7PU = 0x00;
    P7NCS = 0x00;
    P_SW2 &= 0x7F;            //P_SW2^7置0,停用特殊功能寄存器
    P0 = 0xFF;
    P1 = 0xFF;
    P2 = 0xFF;
    P3 = 0xFF;
    P4 = 0xFF;
    P5 = 0xFF;
    P6 = 0xFF;
    P7 = 0xFF;
}

//Uart调用
/*-----------------Uart发送字符-----------------*/
void UartSendChar(uchar ch)
{
    SBUF = ch;
    while(TI == 0);
    TI = 0;
}

/*----------------Uart发送字符串----------------*/
void UartSendStr(uchar *str)
{
    uint i = 0;
    do
    {
      UartSendChar(*(str + i));
      i ++;
    }while(i < strlen(str));
}



void SetTimer0()            //设T0为定时器模式
{
    AUXR |= 0x80;         //定时器时钟1T模式
    TMOD |= 0x03;
    TL0 = 0x01;             //设置定时初始值
    TH0 = 0x15;             //设置定时初始值
    TCON &= 0xEF;         //中断标志清除
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    TCON |= 0x10;         //启动定时器0
}

void Timer_0() interrupt 1
{
    Time_Base++;
    if(Time_SS)Time_SS--;
    if(Time_Base >= 200)         //秒计时
    {
      Time_Base = 0;
//      OUT =~ OUT;
    }
}

void SetTimer1()               //T1为波特率发生器1T模式 115200bps@24.000MHz
{
    TMOD &= 0x0F;                //设置定时器模式
    TL1 = BRT2;                   //设置定时初始值
    TH1 = BRT2 >> 8;            //设置定时初始值
}


void Timer_1() interrupt 3       //应用串口后复位不断电下载功能
{
    if(Uart_RST)
    {
      Uart_RST--;
    }else
    {
      IE &= 0xF7;
    }
}

void SetUart1()                  //串口1
{
    SCON |= 0x50;                //8位数据,可变波特率
    SCON &= 0xFC;                //清除中断标志
    AUXR |= 0x40;                //定时器1 波特率发生器 1T模式
}
void Uart_1() interrupt 4
{
    Uart_n = 0;
    RI = 0;
    if(!Uart_RST && SBUF == 0x7F)
    {
      Uart_n++;
      if(Uart_n >= 0x09)
      {
            Uart_n = 0;
            IAP_CONTR = 0x60;
      }
            }else
    {
      Uart_RST = 0xFF;
      Uart_n = 0;
/*---------------数据接收区--测试用-------------*/
      switch(SBUF)
      {
            case 0x31: Uart1SendStr("OK1\r\n");break;
            case 0x32: Uart1SendStr("OK2\r\n");break;
            case 0x33: Uart1SendStr("OK3\r\n");break;
            case 0x34: Uart1SendStr("OK\r\n");break;
            default:break;
      }
    }
}

void main()
{
    bit Bit_SS = 0;
    IN_Check = IN;
    SetIO();
    SetTimer0();
    SetTimer1();
    SetUart1();
    //中断设置
    IE |= 0x9A;               //中断允许
    while(1)
    {
      if(!IN && IN_Check)
      {
            Time_SS = 200;
            while(Time_SS)
            {
                if(IN)break; else continue;
            }
            if(OUT)
            {
                Time_SS = 200;
                while(Time_SS)
                {
                  if(IN)break; else continue;
                }
                if(!IN)
                {
                  OUT = 0;
                  UartSendStr("ON");
                  IN_Check = 0;
                }
            }
            else
            {
                Time_SS = 500;
                while(Time_SS)
                {
                  if(IN)break; else continue;
                }
                if(!IN)
                {
                  OUT = 1;
                  UartSendStr("OFF");
                  IN_Check = 0;
                }
            }
      }
      else
      {
            if(IN && !IN_Check)
            {
                Time_SS = 100;
                while(Time_SS)
                IN_Check = 1;
                UartSendStr("Complete");
            }
      }
    }
}



AI-32位8051 发表于 2023-4-4 08:56:55

楼主优秀,STC您因更精彩!

xinzui 发表于 2023-4-7 11:03:46

本帖最后由 xinzui 于 2023-4-7 11:26 编辑

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

xinzui 发表于 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 后就不再减了

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

xinzui 发表于 2023-4-7 18:11:24

C7应该并在R6上,防止上电时硬盘通一下电
页: [1]
查看完整版本: 用STC8G1K08做了个单键开关