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;
}
过零检测触发外中断,延时控制可控硅导通角,实现不了,求指点
//包含文件,端口定义,程序开始
//************************************************
#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的,方便的话想请教下
谢谢你。
谢谢你