新闻  |   论坛  |   博客  |   在线研讨会
可控硅触发控制的C51程序
534779918 | 2008-04-29 13:28:19    阅读:2268   发布文章

#include  <C:\Keil\C51\INC\REG52.h> 
#include  <C:\Keil\C51\INC\stdlib.h> 

unsigned  int Frequency;
unsigned char Chnnl;
    unsigned long I_Scale , V_Scale , A_Scale ;

    unsigned char code Show_S2[10] = {'0','1','2','3','4','5','6','7','8','9'};
    unsigned char Index1[13];  //
    unsigned char Index3[5];    //
    unsigned char Re_value[5];  // 被取模变量数组

    unsigned char Hex_H , Hex_L;
unsigned int  Hex_e0;

                sbit Clock_clk  = P1^0 ; // ADC Max186 接口
                sbit CS1_Out    = P1^1 ;
            sbit Dout_Data  = P1^2 ;
                sbit Dout_Input  = P1^3 ;

    sbit Start_Up    = P3^2;  // 过零同步入口,关于这个接口变量是中断入口
            // 表面上看没有必要定意, 我在程序中并没应用,是因为我删除其内容
            // 请记住它有重要意义 !!!.如果你应用到产品上关系到你的产品能否成攻
            // 如果你应用到一般产品上可以不要其内容.

    sbit Control_Out = P3^4;  // 可控硅触发控制信号

                bit Power_OFF  = 0;    // 关闭 PWM 5KV 电源
      bit STOP        = 1 ;

    char bdata Max_Temp _at_ 0x20;

sbit a0 = Max_Temp^0;
sbit a1 = Max_Temp^1;
sbit a2 = Max_Temp^2;
sbit a3 = Max_Temp^3;
sbit a4 = Max_Temp^4;
sbit a5 = Max_Temp^5;
sbit a6 = Max_Temp^6;
sbit a7 = Max_Temp^7;

void New_Main(void);    // 主程序
void Tmod_Step(void);  // 初始化函数
void Time0_Serve(void); // 可控硅触发延时中断程序
void Int0_Serve(void);  // 同步过零触发中断服务程序
void COM1_Serve(void);  // COM1  中断函数
void SBUF_Char(unsigned char Temp);  // 发送数据
void SBUF_Scale(unsigned long Temp01,unsigned long Temp02,unsigned long Temp03); // 发送检测数据
void Switch_Gate(void);              // ADC 通道切换函数
void Model_Data(unsigned int Temp);  // 取模函数
  int Max_186(unsigned char Temp1);  // ADC Max186 采样程序

void main () // Main 主程序这样使用主要防止堆栈溢出
{
    while(STOP)Tmod_Step();
while(1)New_Main();   
}

/****************************** 主程序 ******************************
* 名称: New_Main
* 说明: ?
* 功能:
* 调用: 键盘输入函数
* 输入: 无
* 返回值:
*********************************************************************/
void New_Main(void)
{
  ES = 1;
  if (Index1[12] == 'A')        // 上位机命令
  {
    Index1[12] = ' ';
            Switch_Gate();            // ADC 通道切换函数
    SBUF_Scale (I_Scale , V_Scale , A_Scale);  // 送上位机计算处理
  }

  if (Index1[12] == 'B')        // 上位机命令
  {
    Index1[12] = ' ';
                Hex_e0 = atoi(Index3); // 字幅串数组变量转换函数(该 Hex_e0 变量是可控硅触发角)
          // 并接上位机可控硅触发角
    Power_OFF = 1;            // 启动可控硅触发     
  }

  if (Index1[12] == 'C')        // 上位机命令
  {
    Index1[12] = ' ';
    Power_OFF = 0;            // 关闭可控硅触发
  }

return ;
}

/************************ COM1  中断函数 ****************************
* 名称: COM1_Serve
* 说明: 接收 'A' 'B' 'C' 命令并和上位机之间全部以 ASCII 方式通信
* 功能: 接收上位机数组 Index1[12] 含有命令
* 调用: 无
* 输入: 无
* 返回值: Index1[] 命令数组
*********************************************************************/
void COM1_Serve(void) interrupt 4
{
unsigned char j = 0 ;
        RI = 0;
        ES = 0;
    switch (SBUF)
  {
      case 'A':
      for (j = 0 ; j  <= 12 ; j++)
          {
        while(!RI);
                  RI = 0;
              Index1[j] = SBUF;    // 接收数组 Index1[12] 含有命令
          }
    Index3[0] = Index1[0];    // 接收到字幅串数组 Index3[x]
    Index3[1] = Index1[1];
    Index3[2] = Index1[2];
    Index3[3] = Index1[3];
    Index3[4] = Index1[4];
                        break;
  default:;
            break ;
      }
          TI = 0;
          ES = 1;
return ;
}

/********************** 发送数据 *************************
* 名称: SBUF_Scale(Temp01,Temp02,Temp03)
* 说明:
* 功能:
* 调用: Model_Data(Temp)      取模函数
* 调用: SBUF_Char(Temp)  字符发送函数
* 输入:
* 输入:
* 返回值: 无
**********************************************************/
void SBUF_Scale(unsigned long Temp01,unsigned long Temp02,unsigned long Temp03)
{
ES = 0;
    SBUF_Char('_');
                  Model_Data(Temp01) ;
        SBUF_Char(Show_S2[Re_value[3]]) ;
        SBUF_Char(Show_S2[Re_value[2]]) ;
      SBUF_Char(Show_S2[Re_value[1]]) ;
    SBUF_Char(Show_S2[Re_value[0]]) ;
                  Model_Data(Temp02) ;
    SBUF_Char('_');
        SBUF_Char(Show_S2[Re_value[3]]) ;
        SBUF_Char(Show_S2[Re_value[2]]) ;
    SBUF_Char(Show_S2[Re_value[1]]) ;
    SBUF_Char(Show_S2[Re_value[0]]) ;
                  Model_Data(Temp03) ;
    SBUF_Char('_');
        SBUF_Char(Show_S2[Re_value[3]]) ;
        SBUF_Char(Show_S2[Re_value[2]]) ;
    SBUF_Char(Show_S2[Re_value[1]]) ;
    SBUF_Char(Show_S2[Re_value[0]]) ;
    SBUF_Char('O');  // OK 是上位机确定完整收到标识 
    SBUF_Char('K');
ES = 1;
return;
}

/************************ ADC 通道切换函数 ***************************
* 名称: Switch_Gate()
* 说明: 交叉数据采样
* 功能: 通道切换交叉启动 ADC
* 调用: Max_186(Temp1) ADC 返回本次采样结果
* 输入: 无
* 返回值: I_Scale , V_Scale ,A_Scale
*********************************************************************/
void Switch_Gate(void)
{
    Frequency = 0;
      I_Scale = 0;
      V_Scale = 0;
      A_Scale = 0;
                    Chnnl = 'A';

  for (;Frequency  <= 3071;)  // (1024 * 3) - 1 总采样次数,关于这个数根据你要求的采样精度而定
      {     
    switch (Chnnl)
  {
      case 'A':
    I_Scale += Max_186(0x8f); // Max_186 启动通道号 0
    Chnnl = 'B';
                break;
      case 'B':
    V_Scale += Max_186(0xcf); // Max_186 启动通道号 1
    Chnnl = 'C';
                break;
      case 'C':
    A_Scale += Max_186(0x9f); // Max_186 启动通道号 2
    Chnnl = 'A';
                break;
  }
            }

  I_Scale /= 1024.0;  // 计算 1024 次采样结果平均值
  V_Scale /= 1024.0;
  A_Scale /= 1024.0;
return;
}

/*  ******* ADC Max186 采样程序 ********  */
int Max_186(unsigned char Temp1) // Max186 Temp1 通道号
{
unsigned char i;
unsigned  int Max_186;
  Max_Temp = Temp1;

    CS1_Out = 0;

Dout_Data = a7;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a6;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a5;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a4;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a3;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a2;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a1;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a0;Clock_clk = 1;Clock_clk = 0;

    for (i = 0 ; i  <= 15 ; i++)
        {
    Clock_clk = 1;
    Clock_clk = 0;
    Max_186  <  <= 1;
    if (Dout_Input) Max_186 |= 0x01;
        }

    CS1_Out = 1;

Frequency ++; 
  Max_186 >  >  = 4;
  return(Max_186);
}

/************************ 发送数据 **********************
* 名称: SBUF_Char(Temp)
* 说明:
* 功能: 发送数据
* 输入: Temp
* 返回值: 无
********************************************************/
void SBUF_Char(unsigned char Temp)
{
              SBUF = Temp;
    while(!TI);
            TI=0;
return;
}

/*********************    接同步过零触发中断服务  *******************
* 名称: Int0_Serve
* 说明: Hex_e0 变量为过零角
* 功能: 同步中断函数
* 调用: 无
* 输入: 过零同步入口 Start_Up
* 返回值: 无
*********************************************************************/
void Int0_Serve(void) interrupt 0
{
              Hex_H = (Hex_e0 / 256);
              Hex_L = (Hex_e0 - (Hex_H * 256));
        TH0 = Hex_H;
        TL0 = Hex_L;
  if (Power_OFF == 1)TR0 = 1;
return;
}
/*************************    可控硅触发延时中断    *****************
* 名称: Time2_Serve
* 说明:
* 功能: 可控硅触发
* 调用: 无
* 输入: 无
* 返回值:
*********************************************************************/
void Time0_Serve(void) interrupt 1
{
unsigned char Timer;
  TF0 = 0;
  TR0 = 0;
    if (Power_OFF == 1)Control_Out = 0;  // 可控硅触发控制信号
  for (Timer = 0 ; Timer  <= 50 ; Timer++);
    if (Power_OFF == 1)Control_Out = 1;
return;
}

/************************ 取模函数 **********************************
* 名称: Model_Data
* 说明: 按位取模存入数组
* 功能: 按位取模
* 调用: 无
* 输入: Temp 被取模变量
* 返回值: Index1[] 数组
*********************************************************************/
void Model_Data(unsigned int Temp)
{
        Re_value[4] = (Temp / 10000) % 10;  // 得 10000,  万位数
        Re_value[3] = (Temp / 1000) % 10;  // 得 1000,  千位数
        Re_value[2] = (Temp / 100) % 10;    // 得 100,  百位数
        Re_value[1] = (Temp / 10) % 10;    // 得 10,  十位数
        Re_value[0] = (Temp / 1) % 10;      // 得 1, 个位数
return;
}

/* *********  初始化函数 ********* */
void Tmod_Step(void)
{
  STOP = 0;
  PCON = 0x80;
  TMOD = 0x21;
  TCON = 0x00;
  SCON = 0x50;
  TH0  = 0xff;
  TL0  = 0x00;
  TH1  = 0xf9;
  TR1  = 1;
  IP  = 0x12;
  IE  = 0x93;
  return;
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客