求助大神,谢谢大家
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;}
- }
- }
复制代码
|