|
我这个是实现步进电机工作时当温度过高就停止运行与报警
我单独完成步进电机或DS18B20的超温报警时是没问题的,但是当我把这两个合在一起仿真的时候我的温度明明没超过温度上限值就直接电机停止报警了呢?
我把源程序仔细看了几遍也没发现我哪里会出错- #include <reg51.h>
- #include<math.h>
- #include<INTRINS.H>
- #define uchar unsigned char
- #define uint unsigned int
- sbit P1_0=P1^0;
- sbit P1_1=P1^1;
- sbit P1_2=P1^2;
- sbit P1_3=P1^3;
- sbit P1_4=P1^4;
- sbit P1_5=P1^5;
- sbit P1_6=P1^6;
- sbit P1_7=P1^7;
- sbit P3_0=P3^0;
- sbit DQ=P2^7; // DS18b20 端口
- sbit m_switch=P3^1;
- sbit Forward=P3^2; //正转键位
- sbit Reversal=P3^3; //逆转键位
- sbit F_led=P2^0;
- sbit R_led=P2^1;
- sbit Alarm_LED1=P2^2;
- sbit buzzer=P2^3;
- int temp;
- char TempH,TempL;
- char temp_max=30; //定义超温报警数值
- uchar temporary[8];
- uchar stop_turing;
- uchar k=0;
- uchar num,flg,RRR,check; //num为步数;flg为正(0)逆(1)转;RRR用于调速控制
- uchar output[2][4]={{0x06,0x03,0x09,0x0c},{0x09,0x03,0x06,0x0c}}; //采用 四相双四拍控制
- //给个脉冲数组,正:1100(BA)-0110(DA)-0011(DC)-1001(BC) 逆BA-BC-DC-DA
- //由于proteus中没三相步进电机,所以用了个四相进行仿真
- //如果换成三相的电机,那数组改成 uchar output[2][3]={{0x03,0x05,0x06},{0x05,0x03,0x06}}
- void rotation(void);
- void step(void);
- void handle_Temperature();
- void delay1(uint t);
- void delay(uint t);
- void alarm(void);
- void main()
- {
- uchar i,j,n;
- TMOD|=0x01;//定时器设置
- TH0=0xef;//装初始值
- TL0=0xf0;
- EA=1;// 开总中断
- ET0=1;//允许定时器0中断
- TR0=1;//开定时器0中断
- RRR=25; //设置每步延时250ms
- check=0;
- stop_turing=0;
- while(1)
- {
- if(m_switch==0) //总开关
- {
- if(P1!=0xff||P3_0!=1) //判断是否有步数按下
- {
- step();
- rotation();
- if(flg==0) //电机运转时有正逆转的指示灯指示
- {
- F_led=0; //正转灯
- }
- else
- {
- R_led=0; //逆转灯
- }
- P0=0x0c; //给电机打开起始位BA,如果在三相单三中则改为P0=0x06;
- for(j=0;j<num;j++)
- {
- if(stop_turing==1)
- {
- break;
- }
- for(i=0;i<=3;i++) //给P0口输出转动,如果在三相单三中则改为for(i=0;i<=2;i++)
- {
- P0=output[flg][i];
- for(n=0;n<RRR;n++) //延时
- {
- delay(10);
- }
- if(check==1)
- {
- handle_Temperature();// 处理温度:
- }
- if(stop_turing==1)
- {
- break;
- }
- }
- }
- F_led=1; //关灯
- R_led=1;
- P0=0x0f; //给P0口复位
- }
- }
- }
- }
- void step(void) //判断步数
- {
- if(P1_0==0) //在四相中为24步,如果换成三相中则为18步
- {
- num=6;
- }
- else if(P1_1==0) //在四相中为20步,如果换成三相中则为15步
- {
- num=5;
- }
- else if(P1_2==0) //在四相中为16步,如果换成三相中则为12步
- {
- num=4;
- }
- else if(P1_3==0) //在四相中为12步,如果换成三相中则为9步
- {
- num=3;
- }
- else if(P1_4==0) //在四相中为8步,如果换成三相中则为6步
- {
- num=2;
- }
- else if(P1_5==0) //在四相中为4步,如果换成三相中则为3步
- {
- num=1;
- }
- else if(P1_6==0) //在四相中为28步,如果换成三相中则为21步
- {
- num=7;
- }
- else if(P1_7==0) //在四相中为32步,如果换成三相中则为24步
- {
- num=8;
- }
- else if(P3_0==0) //在四相中为36步,如果换成三相中则为27步
- {
- num=9;
- }
-
- }
- void rotation(void) //判断正逆转
- {
- if(Forward==0) //正转
- {
- flg=0;
- }
- else if(Reversal==0) //逆转
- {
- flg=1;
- }
- }
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ = 1; //DQ复位
- delay1(8); //稍做延时
- DQ = 0; //单片机将DQ拉低
- delay1(80); //精确延时 大于 480us
- DQ = 1; //拉高总线
- delay1(14);
- x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
- delay1(20);
- }
- uchar ReadOneChar(void) // DS18B20读一个字节
- {
- uchar m=0;
- uchar dat = 0;
- for (m=8;m>0;m--)
- {
- DQ = 0; // 给脉冲信号
- dat>>=1;
- DQ = 1; // 给脉冲信号
- if(DQ)
- dat|=0x80;
- delay1(5);
- }
- return(dat);
- }
- void WriteOneChar(uchar dat) //DS18B20写一个字节
- {
- uchar m=0;
- for (m=8; m>0; m--)
- {
- DQ = 0;
- DQ = dat&0x01;//取低位
- delay1(5);
- DQ = 1;
- dat>>=1;//左移
- }
- delay1(5);
- }
- uint ReadTemperature(void) //DS18B20读取温度
- {
- uchar a=0;
- uint b=0;
- uint t=0;
- Init_DS18B20();//DS18B20初始化
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- delay1(200); //延时以求信号的稳定
- Init_DS18B20(); //DS18B20再次初始化
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器
- a=ReadOneChar(); //低位
- b=ReadOneChar(); //高位
- b<<=8; //b左移8位
- t=a+b; //把a与b结合,放在16位的t中
- return(t);
- }
- void handle_Temperature()
- {
- check=0; //清标志位
- temp=ReadTemperature();//读取温度值
- if(temp&0x8000)
- {
- temporary[0]=0xb0;//负号标志
- temp=~temp; // 取反加1
- temp +=1;
- }
- TempH=temp>>4; //由权重表知移4位就是整数位
- TempL=temp&0x0F;
- TempL=TempL*6/10;//小数近似处理
- alarm(); //判断是否需要报警
-
- }
- void alarm(void)
- {
- if(TempH>=temp_max)//当温度高于设置的最高温报警
- {
- stop_turing=1;
- buzzer=0;
- Alarm_LED1=0;
- }
- else//报警解除
- {
- buzzer=1;
- Alarm_LED1=1;
- }
- }
- //延时函数
- void delay1(uint t)//短延时函数
- {
- while(t--);
- }
- void delay(uint t) //长延时函数
- {
- while(t--)
- {
- //大致延时1mS
- delay1(245);
- delay1(245);
- }
- }
- void timer0(void) interrupt 1 using 1
- {
- TH0=0xef;//定时器重装值
- TL0=0xf0;
- k++;
- if (k==50)
- {
- k=0;
- check=1;//标志位有效,开始测温
- }
- }
-
复制代码
|
|