求助大神,謝謝大家
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH0=(65536-20000)/256; //重新賦值 20ms
TL0=(65536-20000)%256;
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器開關打開
從這里開始就看不懂了,為啥中斷打開們還有定時器為啥也要打開?
單片機源程序如下:
- #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include "1602.h"
- #include "delay.h"
- sbit KeyC=P3^4;
- sbit KeyT=P3^5;
- sbit KeyQ=P3^6;
- sbit A1=P1^0; //定義步進電機連接端口
- sbit B1=P1^1;
- sbit C1=P1^2;
- sbit D1=P1^3;
- sbit buzzer=P1^4;
- sbit Yudi=P2^3;
- #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通電,其他相斷電
- #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通電,其他相斷電
- #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通電,其他相斷電
- #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
- #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通電,其他相斷電
- #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通電,其他相斷電
- #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通電,其他相斷電
- #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
- #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部斷電
- unsigned long time_2ms=0; //定時器計數
- void Init_Timer0(void); //初始化始終函數
- unsigned int TimeCount; //步進電機轉動時間
- unsigned int DisNum; //顯示的參數
- unsigned char ReportBuz=0; //蜂鳴器報警
- void main (void)
- {
- static unsigned char DisTCount; //記錄時間設置數
- static unsigned char DisCCount; //記錄容量設置數
- static unsigned char KeyFlag0,KeyFlag1,KeyFlag2,KeyFlag3;
- Init_Timer0(); //定時器0初始化
-
- LCD_Init(); //初始化液晶
- DelayMs(20); //延時有助于穩定
- LCD_Clear();
- LCD_Write_String(0,0,"Capacity :150 ml");//顯示第一行
- DisCCount=0;
- LCD_Write_String(0,1,"TimeCount:0.5 h ");//顯示第二行
- DisTCount=0;
- buzzer=1;
- while(1) //主循環
- {
- if(KeyT==0) //掃描按鍵 輸液體容量選擇
- {
- if(KeyFlag0==0)
- {
- DelayMs(20);
- if(KeyT==0) //確認按下
- {
- KeyFlag0=1; //防止重復按下
- if(DisCCount==0)
- {DisCCount=1;LCD_Write_String(0,0,"Capacity :250 ml");} //更新顯示
- else if(DisCCount==1)
- {DisCCount=2;LCD_Write_String(0,0,"Capacity :500 ml");} //更新顯示
- else if(DisCCount==2)
- {DisCCount=0;LCD_Write_String(0,0,"Capacity :150 ml");} //更新顯示
- }
- }
- }
- else
- {KeyFlag0=0;}
- if(KeyC==0) //掃描按鍵 //輸液時間選擇
- {
- if(KeyFlag1==0)
- {
- DelayMs(20);
- if(KeyC==0) //確認按下
- {
- KeyFlag1=1; //防止重復按下
- if(DisTCount==0)
- {DisTCount=1;LCD_Write_String(0,1,"TimeCount: 1 h ");} //更新顯示
- else if(DisTCount==1)
- {DisTCount=2;LCD_Write_String(0,1,"TimeCount: 2 h ");} //更新顯示
- else if(DisTCount==2)
- {DisTCount=0;LCD_Write_String(0,1,"TimeCount:0.5 h ");} //更新顯示
- }
- }
- }
- else
- {KeyFlag1=0;}
-
- if(KeyQ==0) //掃描按鍵 //確認輸液參數
- {
- if(KeyFlag2==0)
- {
- DelayMs(20);
- if(KeyQ==0) //確認按下
- {
- KeyFlag2=1; //防止重復按下
- DisNum=DisCCount+DisTCount;
- if(DisNum==0) //顯示數值
- {TimeCount=200;} //填充數值
- else if(DisNum==1)
- {TimeCount=400;} //填充數值
- else if(DisNum==2)
- {TimeCount=600;} //填充數值
- else if(DisNum==3)
- {TimeCount=800;} //填充數值
- else if(DisNum==4)
- {TimeCount=1000;} //填充數值
- }
- }
- }
- else
- {KeyFlag2=0;}
- if(Yudi==1) //掃描按鍵 //液滴檢測模塊
- {
- if(KeyFlag3==0)
- {
- DelayMs(20);
- if(Yudi==1) //確認按下
- {
- KeyFlag3=1; //防止重復按下
- ReportBuz=1;
- }
- }
- }
- else
- {KeyFlag3=0;buzzer=1;ReportBuz=0;} //如果沒有檢測到雨滴
- }
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- EA=1; //總中斷打開
- ET0=1; //定時器中斷打開
- TR0=1; //定時器開關打開
- }
- void Timer0_isr(void) interrupt 1
- {
- static unsigned char MotorNum=0;
- TH0=(65536-3000)/256; //重新賦值 2ms
- TL0=(65536-3000)%256;
- time_2ms++;
- if(time_2ms%200==0)
- {
- if(ReportBuz==1) //蜂鳴器轉換標志
- {
- buzzer=!buzzer;
- }
- }
- if(TimeCount>0) //電機轉動時間不為零 設置了時間
- {
- TimeCount--;
- MotorNum++;
- if(MotorNum==1)
- {Coil_D1;}
- else if(MotorNum==2)
- {Coil_C1;}
- else if(MotorNum==3)
- {Coil_B1;}
- else if(MotorNum==4)
- {Coil_A1;MotorNum=0;}
- }
- else
- {
- {Coil_OFF;}
- }
- }
復制代碼
|