微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机移相触发可控硅

51单片机移相触发可控硅

时间:10-02 整理:3721RD 点击:
//************************************************
//包含文件,端口定义,程序开始
//************************************************
#include<reg51.h>
#define  uchar  unsigned char
#define  uint  unsigned int
int dw ;
sbit DQ =P1^4;
sbit moc30=P3^7;//可控硅位
unsigned char flag;
unsigned char realtemp;
//uchar temp1;
//行扫描数组
uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,
0xbf,0x7f};//row0--row7
//数码管显示的段码
uchar code table[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,
0x6F,0x40,0x39,0x00,0x78,0x79};//,-,C,kong,t,e
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,
0x06,0x07,0x08,0x08,0x09,0x09};//小数显示查询表
uchar dispbuf[8];      //显示缓冲区   
uchar  temper[2];      //存放温度的数组  
//************************************************
//延时函数
//************************************************                    
void delay (unsigned int us)  
{
  while(us--);
}
//************************************************
//DS18B20复位函数
//************************************************
void reset(void)  
{
  uchar x=0;
  DQ = 1;
  delay(8);            //稍做延时
  DQ = 0;
  delay(80);           //精确延时 大于 480us
  DQ = 1;              //拉高总线
  delay(14);
  x=DQ;
  delay(20);
}
//************************************************
//DS18B20读一个字节
//************************************************
uchar readbyte(void)
{
  uchar i=0;
  uchar dat=0;
  for (i=8;i>0;i--)
  {
    DQ = 0;
    dat>>=1;
    DQ = 1;
    if(DQ)
    dat|=0x80;
    delay(4);
   }
  return(dat);
}

//************************************************
//DS18B20写一个字节
//************************************************
void writebyte(unsigned char dat)
{
  uchar i=0;
  for (i=8; i>0; i--)
  {
   DQ = 0;
   DQ = dat&0x01;
   delay(5);
   DQ = 1;
   dat>>=1;
   }
delay(4);
}
//************************************************
//读取温度值
//************************************************
void readtemp(void)
{
  uchar a=0,b=0;
  uint t=0;
  reset();
  writebyte(0xCC);      //跳过序列号
  writebyte(0x44);      //启动温度转换
  reset();
  writebyte(0xCC);
  writebyte(0xBE);      //读9个寄存器,前两个为温度
  a=readbyte();         //低位
  b=readbyte();         //高位
if(b>0x0f)                   //不能使用b^7==1来判断
                {        a=~a+1;
                        if(a==0)
                         b=~b+1;
                        else b=~b;
                    flag=10;
                 }
      else flag=12;
  temper[0]=a&0x0f;
  a=a>>4;               //低位右移4位,舍弃小数部分
  temper[1]=b<<4;       //高位左移4位,舍弃符号位
  temper[1]=temper[1]|a;
  }
//************************************************
//扫描显示函数
//************************************************
void scan_disp()               
{
   unsigned char i,value;  
   for(i=0;i<8;i++)
          {
           P2 = 0xff;                  //关显示
           value =table[dispbuf[i]];   //取一行显示数据  
           if(i==3)
           value|= 0x80;
           P0 = value;
           P2 = scan[i];               //取row0--row7行扫描数据
           delay(50);                  //延时50us
           }
}
//************************************************
//设定显示函数
//************************************************
//************************************************
//按键测试与控制温度设定函数
//************************************************
//************************************************
//实时温度显示码处理函数
//************************************************
void dat_pre()
{          
       uchar temp;
       readtemp();              //读18B20          
               temp=temper[0];
               dispbuf[4]=ditab[temp];
       dispbuf[5] = 11 ;        //显示 C
       temp = temper[1];        //取整数部分
       realtemp=temp;           //获取实时温度数据
               dispbuf[1] = temp/100;
               dispbuf[3] = temp%10;
       temp = temp/10;
       dispbuf[2]= temp%10;            //取余不变,除法变为余数
              dispbuf[0]=flag;
}
//************************************************
void temp_pro()
{
int temp;
temp=temper[1] ;
if(temp<15)
dw=0  ;
if(15<temp&temp>20)
dw=1;
if(20<temp&temp<25)
dw=2;
if(25<temp&temp<30)
dw=3 ;
if(30<temp&temp<35)
dw=4 ;
if(35<temp&temp<37)
dw=5 ;
if(temp>37)
dw=6;
}
//************************************************
//定时计数器中断,输出波形发生函数
//************************************************
//************************************************
//主函数
//************************************************
void main()                                           // 主函数
{    TMOD=0X01;
      EX0=1;
      ET0=1;
      IT0=1;
      EA=1;
      moc30=1;
  while(1)
     {
      scan_disp(); //显示,读键扫描
           dat_pre();
      temp_pro();
if(dw==0)      //(15a0)
{
TL0=0xA0;
TH0=0x15;
}
  if(dw==1)     
{      //不同的档位,改变导通角延时8ms(e0c0)
TL0=0XC0;
TH0=0XE0;
}
if(dw==2)
{      //不同的档位,改变导通角延时4ms(f060)
TL0=0X60;
TH0=0XF0;
}
if(dw==3)
{      //不同的档位,改变导通角延时3ms(f448)
TL0=0X48;
TH0=0XF4;
}       
if(dw==4)
{      //不同的档位,改变导通角延时2ms(f830)
TL0=0X30;
TH0=0XF8;
}
if(dw==5)
{      //相对平稳些不同的档位,改变导通角延时1ms(64536=fc18)
TL0=0X18;
TH0=0XFc;
}
if(dw==6)
{      //不同的档位,改变导通角延时0ms  (65536=1000)
TL0=0X00;
TH0=0X10;
}
}
}
interrupt0()  interrupt 0
{
TR0=1;
moc30=1;
}
time0()  interrupt 1
{
TR0=0;
moc30=0;
}
过零检测触发外中断,延时控制可控硅导通角,实现不了,求指点

好像是触发脉冲宽度不够

干的好!

冒昧问下 ,小编当时控制的是调光还是调速   我正在做一个电机调速的,220V  120W的,方便的话想请教下

谢谢你。

谢谢你

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top