⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 晶闸管移相触发器.c

📁 当按下报警按钮时
💻 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 + -