📄 晶闸管移相触发器.c
字号:
/*-------------------单片机控制的晶闸管移相触发器------------------------------*/
/*---------------------------------包含头文件----------------------------------*/
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
/*------------------------------------定义变量---------------------------------*/
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P3_5=P3^5;
uint TimerBuf[2]={0XFF,0X70};
static uint TrigCounter=0 ;
/*-------------------------------------声明函数---------------------------------*/
void int_0();
void timer_0();
void timer_2();
void StartDelay_1ms();
void serial();
void initi_serialcom();
void initial();
/*----------------------------------------主程序---------------------------------*/
void main()
{
initial(); //中断定时器初始化
initi_serialcom(); //串口初始化
while(1)
{
if(TrigCounter>6000)
{
ET2=0; //屏蔽定时器2中断
T2CON=0X08; //定时器2外部控制捕获
RCAP2H=TimerBuf[1]; //定时
RCAP2L=TimerBuf[0];
TrigCounter=0;
}
}
}
/*-----------------------------------初始化程序--------------------------------*/
void initial()
{
EA=1; //开总中断
EX0=1; //中断0开中断
IT0=0; //中断0电平触发
ET2=0; //屏蔽定时器2中断
T2CON=0X08; //定时器2外部控制捕获
RCAP2H= TimerBuf [1]; //定时
RCAP2L= TimerBuf [0];
TrigCounter =0;
}
/*-------------------------------------中断0服务程序--------------------------*/
//功能:定时器2开中断,启动定时器2
void int_0() interrupt 0
{
EX0=0; //屏蔽中断0
ET2=1; //允许定时器2中断
P2_1=0; //二极管发光
}
/*------------------------------定时器2中断服务程序-----------------------*/
//完成过零点的捕获并延时发触发脉冲
void timer_2() interrupt 5
{
if(EXF2) //判断产生中断的事件
{
TR2=1; //如果是过零点则开始定时
EXF2=0;
TimerCounter++;
}
else //如果是定时时间到则发触发脉冲
{
TF2=0;
TR2=0;
P2_0=1; //发触发脉冲
StartDelay_1ms(); //脉冲宽度
}
}
/*-------------------------用定时器0定时来实现脉冲的宽度-----------------*/
void StartDelay_1ms()
{
TMOD=0X01; //定时器0工作方式1
TH0=0XFF; //定时1ms
TL0=0XD0;
ET0=1; //允许定时器0中断
TR0=1; //启动定时器0
}
/*-------------定时器0中断服务程序,定时时间到停止发脉冲-------------*/
void timer_0() interrupt 1
{
P2_0=0;
}
/*---------------------------------串口初始化程序--------------------------------*/
void initi_serialcom()
{
SCON=0X50; //串行口工作于方式1
TMOD=TMOD|0X20; //定时器1工作于方式2
TH1=0XE8; //波特率1200K
ET1=0; //屏蔽定时器0中断
ES=1; //允许串口中断
TR1=1; //启动定时器1
clear(); //初始化接收缓冲区
}
/*---------------------------------------串口接收程序-------------------------------*/
void serial() interrupt 4
{
if(RI)
{
RI=0;
TimerBuf[cnt++]=SBUF;
if(cnt>STRSIZE-1)
anlMsgSerial();
}
}
/*---------------------------------对接收的数据进行处理-------------------------*/
void anlMsgSerial()
{
if(TimerBuf[1]>aghmin)
{
reload();
}
if(TimerBuf[1]==aghmin)
{
if(TimerBuf[0]>aglmin)
reload();
}
clear();
}
/*----------------------------------初始化接收缓冲区------------------------------*/
void clear()
{
cnt=0; //初始化接收缓冲区
memset(TimerBuf,'\0',STRSIZE);//缓冲区清0
}
/*------------------------------------定时器重装初值-------------------------------*/
void reload()
{
RCAP2H=TimerBuf[1];
RCAP2L=TimerBuf[0];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -