用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");
}
}
}
}
楼主优秀,STC您因更精彩! 本帖最后由 xinzui 于 2023-4-7 11:26 编辑
我3.5的移动硬盘开关是翘翘板开关,开关的时候老是不干脆,就想换了,用矿坛老哥3AG1的单键开关电路焊了几个,但同参数元件实在凑不齐,以至于效果不理想,干脆就自已设计了个,答应了国学芯用MM发个贴,就将着这个贴说一下程序吧~(不定期)
本帖最后由 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 后就不再减了
刚刚看到原来的程序还有些问题,边改边说~
C7应该并在R6上,防止上电时硬盘通一下电
页:
[1]