|
我這個是實現步進電機工作時當溫度過高就停止運行與報警
我單獨完成步進電機或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;//標志位有效,開始測溫
- }
- }
-
復制代碼
|
-
-
課程設計.rar
2015-6-15 23:21 上傳
點擊文件名下載附件
76.07 KB, 下載次數: 4
|