发表于
2008-1-14 14:20:55
利用上一篇的过零检测电路,过零信号接51单片机外部中断1(下降沿触发),单片机延时触发可控硅导通实现调速。


*感谢郭隆红网友帮我找出错误

部分程序:
/*********************************************************************
函数名称: void ISR_Int1OverZeroDetect() interrupt IE1_VECTOR
函数功能: 外部中断1过零信号捕获中断服务程序
入口参数:
返回 值:
*********************************************************************/
void ISR_Int1OverZeroDetect() interrupt IE1_VECTOR
{
switch(g_uchWindSpeed)//设置定时器延时
{
case 0:
{
TH1 = (65536 - 1800) / 256;
TL1 = (65536 - 1800) % 256;
break;
}
case 1:
{
TH1 = (65536 - 6000) / 256;
TL1 = (65536 - 6000) % 256;
break;
}
case 2:
{
TH1 = (65536 - 7000) / 256;
TL1 = (65536 - 7000) % 256;
break;
}
}
TR1 = 1; // 启动定时器1
/*********************************************************************
函数名称: void ISR_Timer1TriacsTrigger() interrupt TF1_VECTOR
函数功能: 定时器0触发可控硅中断服务程序
入口参数:
返回 值:
*********************************************************************/
void ISR_Timer1TriacsTrigger() interrupt TF1_VECTOR
{
TH1 = 0xFF; //定时器0延时200
TL1 = 0x38;
if(g_bTirggerFlag)
{
P2_5 = 1;
g_bTirggerFlag = 0;
TR1 = 0; // 关闭定时器0
}
else
{
P2_5 = 0;
g_bTirggerFlag = 1;
}
}
/*********************************************************************
函数名称: void Init_System(void)
函数功能: 系统初始化
入口参数:
返回 值:
*********************************************************************/
void System_Init(void)
{
TMOD = 0x11; //定时器0,1工作模式1, 16位定时方式
ET1 = 1; //使能定时器1溢出中断
EX0 = 1;
IT0 = 1;
EX1 = 0; //外部中断1禁止
IT1 = 1; //外部中断1下降沿触发中断
EA = 1; //全局中断使能
}