本帖最后由 momolf0727 于 2010-12-6 17:12 编辑
用892051写的程序老师跑飞,麻烦高手给我看看吧,非常感谢
/*******************************************************************************************************
MCU:AT89C2051
晶振:12MHz
定时器0:定时中断每3s轮流显示调节电压与最低工作电压与输出频率为200Hz的方波
定时器1:定时中断5s
******************************************************************************************************/
#include <AT89C2051.H> //包含头文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//---------------------------------------I/O口及参数定义------------------------------------------------
sbit VREG28 = P1^4; //28V电压调节
sbit VREG14 = P1^5; //14V电压调节
sbit P_control = P1^6; //单双P控制信号
sbit Vol_1428 = P1^7; //电压输出控制,14V或者28V
sbit Wai_control = P3^0; //外搭铁
sbit Nei_control = P3^1; //内搭铁
sbit Wai_p = P3^2; //外搭铁判断
sbit Nei_p = P3^3; //内搭铁判断
sbit Vreg_control = P3^4; //调节电压14V与28V切换
sbit Vr_Vm = P3^5; //Vreg与Vmin切换控制
sbit Dect_f = P3^7; //F探测信号
uchar ZT,RZT; //面板状态与5s标志位
uint flag=0;
uint Cnt_T1=200,Cnt_T0=5; //定时器T0与T1中断常数
//------------------------------------------延时程序----------------------------------------------------
void delay(uint xms) //延时xsm毫秒
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//------------------------------------------初始化程序--------------------------------------------------
void init(void)
{
P1=0x2f; //初始13V
Wai_control=1; //关闭外打铁
Vreg_control=0; //初始14V
Vr_Vm=0; //初始显示调节电压
TMOD=0x11; //T0,T1工作方式1
TL0=(655235-500)%256; //定时器T0 0.5ms溢出一次
TH0=(65535-500)/256; //
// TL1=(65535-50000)%256; //定时器T1 50ms溢出一次
// TH1=(65535-50000)/256; //
TR0=1;
// TR1=0; //启动定时器T0
ET0=1;
// ET1=0;
EA=1; //开总中断
}
//-----------------------------------------14V调节电压函数-----------------------------------------------
void Vol_reg14(void)
{
while(Dect_f==1)
VREG14=0;
while((Dect_f==0)&&(flag<50000))
{
VREG14=1;
_nop_();
_nop_();
if(Dect_f==0)
flag++;
}
RZT=P1&0x0f; //读取面板
}
//-----------------------------------------28V调节电压函数-----------------------------------------------
void Vol_reg28(void)
{
while(Dect_f==1)
VREG28=0;
while((Dect_f==0)&&(flag<50000))
{
VREG28=1;
_nop_();
_nop_();
if(Dect_f==0)
flag++;
}
RZT=P1&0x0f; //读取面板
}
//--------------------------------------------14V外搭铁--------------------------------------------------
void wai14(void)
{
VREG28=0;
VREG14=1;
Vol_1428=0; //13V
Vreg_control=0;
delay(10);
Nei_control=1; //关闭内搭铁
Nei_p=1; //关闭内搭铁判断
delay(10); //延时5ms
Wai_control=0; //搭铁置外
Wai_p=1; //关闭外搭铁判断
delay(10); //延时5ms
while((Dect_f==1)&&(ZT==RZT))
{
_nop_();
_nop_();
_nop_();
Vol_reg14();
_nop_();
_nop_();
_nop_();
}
}
//--------------------------------------------14V内搭铁--------------------------------------------------
void nei14(void)
{
VREG28=0;
VREG14=1;
Vol_1428=0; //13V
Vreg_control=0;
delay(10);
Wai_control=1; //关闭外搭铁
Wai_p=1; //关闭外搭铁判断
delay(10); //延时5ms
Nei_control=0; //搭铁置内
Nei_p=1; //关闭内搭铁判断
delay(10); //延时5ms
while((Dect_f==1)&&(ZT==RZT))
{
_nop_();
_nop_();
_nop_();
Vol_reg14();
_nop_();
_nop_();
_nop_();
}
}
//--------------------------------------------28V外搭铁--------------------------------------------------
void wai28(void)
{
VREG28=1;
Vol_1428=1; //输出电压由14V档打到28V档
Vreg_control=1; //负载由14V档打到28V档
delay(10);
Nei_control=1; //关闭内搭铁
Nei_p=1; //关闭内搭铁判断
delay(10); //延时15ms
Wai_control=0; //置外
Wai_p=1;
delay(10); //延时15ms
while((Dect_f==1)&&(ZT==RZT))
{
_nop_();
_nop_();
_nop_();
Vol_reg28();
_nop_();
_nop_();
_nop_();
}
}
//--------------------------------------------28V内搭铁--------------------------------------------------
void nei28(void)
{
VREG28=1;
Vol_1428=1; //输出电压由14V档打到28V档
Vreg_control=1; //负载由14V档打到28V档
Wai_control=1; //关闭外搭铁
Wai_p=1; //关闭外搭铁判断
delay(10); //延时15ms
Nei_control=0; //置内
Nei_p=1;
delay(10); //延时15ms
if(Dect_f==1)
while((Dect_f==1)&&(ZT==RZT))
{
_nop_();
_nop_();
_nop_();
Vol_reg28();
_nop_();
_nop_();
_nop_();
}
}
//-----------------------------------------------总函数--------------------------------------------------
void main(void)
{
init(); //调用初始化
while(1)
{
ZT=P1&0x0f;
RZT=ZT;
flag=0;
switch(ZT)
{
case 0x0e: //电压:14V,搭铁:自动
VREG28=0; //
VREG14=1; //
Vol_1428=0; //13V
Vreg_control=0;
delay(10);
Nei_p=1; //关闭内搭铁判断
Nei_control=1; //关闭内搭铁
delay(10); //延时5ms
Wai_p=0; //先判断外搭铁
delay(1);
if(Dect_f==1) //调节器通
{
wai14();
}
else
{
Wai_p=1; //关闭外搭铁判断
Wai_control=1; //关闭外搭铁
delay(10); //延时5ms
Nei_p=0; //再判断内搭铁
delay(1);
if(Dect_f==1)
{
nei14();
}
}
break;
case 0x0d: //电压:28V,搭铁:自动
VREG28=1;
Vol_1428=1; //26V
Vreg_control=1; //负载由14V档打到28V档
Nei_p=1; //关闭内搭铁判断
Nei_control=1; //关闭内搭铁
delay(10); //延时5ms
Wai_p=0; //先判断外搭铁
delay(1);
if(Dect_f==1) //调节器通
{
wai28();
}
else
{
Wai_p=1; //关闭外搭铁判断
Wai_control=1; //关闭外搭铁
delay(10); //延时5ms
Nei_p=0; //再判断内搭铁
delay(1);
if(Dect_f==1)
{
nei28();
}
}
break;
case 0x06: //电压:14V,搭铁:外
wai14();
break;
case 0x0a: //电压:14V,搭铁:内
nei14();
break;
case 0x09: //电压:28V,搭铁:内
nei28();
break;
case 0x05: //电压:28V,搭铁:外
wai28();
break;
case 0x0b: //电压:自动,搭铁:外
Nei_control=1; //关闭内搭铁
Nei_p=1; //关闭内搭铁判断
delay(10); //延时15ms
Wai_control=0; //置外
Wai_p=1;
delay(10);
VREG28=0;
VREG14=0; //16V
Vol_1428=0;
Vreg_control=0;
delay(10);
if(Dect_f==1)
{
wai28();
}
else
{
wai14();
}
break;
case 0x07: //电压:自动,搭铁:内
Wai_control=1; //关闭外搭铁
Wai_p=1; //关闭外搭铁判断
delay(10); //延时5ms
Nei_control=0; //置内
Nei_p=1;
VREG28=0;
VREG14=0; //16V
Vol_1428=0;
Vreg_control=0;
delay(10);
if(Dect_f==1)
{
nei28();
}
else
{
nei14();
}
break;
case 0x0f: //电压:自动,搭铁:自动
VREG28=0;
VREG14=1;
Vol_1428=0; //13V
Vreg_control=0;
delay(10);
Nei_p=1; //关闭内搭铁判断
Nei_control=1; //关闭内搭铁
delay(5);
Wai_p=0; //先判断搭铁,外
delay(5);
if(Dect_f==1) //调节器是外搭铁?
{
Wai_control=0; //搭铁置外
delay(10); //延时5ms
Wai_p=1;
VREG14=0; //再判断电压,16V
delay(10);
if(Dect_f==1) //调节器通?
{
wai28();
}
else
{
VREG14=1;//13V
delay(5);
wai14();
}
}
else //不是外搭铁再判断是否是内搭铁?
{
Wai_control=1; //关闭外搭铁
Wai_p=1; //关闭外搭铁判断
delay(10); //延时5ms
Nei_control=1;
Nei_p=0; //开启内搭铁判断
delay(10);
if(Dect_f==1) //调节器通?
{
Nei_control=0;
Nei_p=1;
VREG14=0; //16V
delay(10);
if(Dect_f==1)
{
nei28();
}
else
{
nei14();
}
}
}
break;
}
}
}
//----------------------------------定时器0中断函数----------------------------------------------
void Timer0(void) interrupt 1 //定时器T0中断
{
TL0=(65535-500)%256; //定时器T0 0.5ms溢出一次
TH0=(65535-500)/256; //
Cnt_T0--;
if(Cnt_T0==0) //0.5ms到
{
Cnt_T0=5;
P_control=~P_control; //输出方波信号
}
}
/*/----------------------------------定时器1中断函数-----------------------------------------------
void Timer1(void) interrupt 3 //定时器T1中断
{
TL1=(65535-50000)%256; //定时器T1 50ms溢出一次
TH1=(65535-50000)/256; //
Cnt_T1--;
if(Cnt_T1==0) //时间到3s,不为内搭铁调节器且接到控制
{
Cnt_T1=200;
TR1=0;
flag=1; //调节电压与最低工作电压轮流显示
}
} */
------------------------老是不执行红色部分,直接就跳出循环了------------ |