当IT0(IT1)=0 电平方式(低电平有效)此位由软件置1或清0。 TF0(TF1)——计数溢出标志位
当计数器产生计数溢出时,此位由硬件置1。当转向中断服务时,再有硬件自动清0。计数溢出的标志位的使用有两种情况:采用中断方式时,作中断请求标志位来使用;采用查询方式时,作查询状态位来使用。
3.3 各模块子程序
3.3.1 初始化程序
初始化程序中,我们设计包括变量定义、函数声明、延时子程序等等。 #include
#define uint unsigned int #define uchar unsigned char #define T0 300 sbit K0=P1^0; sbit c0=P1^1; sbit c1=P1^2; sbit c2=P1^3; sbit c3=P1^4;
sbit LedForward=P1^5; sbit LedBack=P1^7; sbit LedStop=P1^6;
char table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; //数码管编码
unsigned char code
DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char Disp_Buffer[]={0,0,0,0,0,0,0,0}; unsigned char Disp_Buffer_M[]={0,0,0,0,0,0,0,0};
unsigned char code DSY_BIT[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char i,j,buzy; unsigned char t1,minute=0;
unsigned int count=0,KmCount=0,Money2=0,Money1=5,Money0=0; void chaxun(void); void TimerInit();
void delay(unsigned char x);
18
void dspzheng(void); void dspfan(void); void sspzheng(void); void sspfan(void); void bpzheng(void); void bpfan(void); void display(); void display2();
void delay(unsigned char x) //延时子程序延时约0.5Xms
{ }
int i; while(x--)
for(i=1;i<60;i++);
3.3.2 数码管选择程序
void choose(uchar i) { switch(i) {
case 4:c0=0;c1=1;c2=1;c3=1;break; case 5:c0=1;c1=0;c2=1;c3=1;break; case 6:c0=1;c1=1;c2=0;c3=1;break; case 7:c0=1;c1=1;c2=1;c3=0;break; } }
3.3.3 定时器初始化程序
首先设计一子程序用于显示7位数字,主程序先完成初始化,接着进入无限循环,检测等待计时变量和路程变量,计算费用后调用子程序在数码管中显示,计时中断时变量增加,来
19
模拟汽车的行进和等待。
void TimerInit() { IE=0X8A; TMOD=0x11;
//设置定时器工作方式
TH0=(65536-T0)/256; //送初值 TL0=(65536-T0)%6; ET0=1; //TR0=1;
//TH1=(65536-50000)/256; //TL1=(65536-50000)%6; ET1=1; //TR1=1; //EA=1;
//}
3.3.4 TIME0中断程序
void timer0() interrupt 1 //{ unsigned int temp; TH0=(65536-T0)/256; TL0=(65536-T0)%6; temp=count; //minute=56;
}
3.3.5 主程序
main() //{
//TimerInit();
开定时/计数器0中断 定时/计数器开始工作
送初值 开定时/计数器0中断 定时/计数器开始工作 开总中断
定时/计数器中断程序 主程序 20
while(1) { chaxun(); display();
// display2();
} }
3.3.6 数码管显示程序
void display() //{ Disp_Buffer[7]=minute/10; Disp_Buffer[6]=minute; Disp_Buffer[5]=KmCount/10; Disp_Buffer[4]=KmCount; Disp_Buffer_M[7]=0; Disp_Buffer_M[6]=Money2; Disp_Buffer_M[5]=Money1; Disp_Buffer_M[4]=Money0;
for(i=4;i<8;i++) {
P2=DSY_BIT[i];
P0=DSY_CODE[Disp_Buffer[i]]; choose(i);
P3=DSY_CODE[Disp_Buffer_M[i]]; delay(10);
}
}
数码管动态显示子程序21
3.3.7 计程、计费、计时程序
系统采用两个开关控制汽车运行计费,等待计时,通过扫描单片机的接口判断此时状态并计时。计时采用定时器0计时,当计数到时把路程和等待计时变量加1,最后通过相关运算得到费用,显示在数码管上。
void chaxun() { #if(1) if(K0==0) {
//ET1=0; ////TR1=0;
//KmCount++; // delay(10); if(KmCount>3) { Money1++; }
if(Money1==10) { Money1=0; Money2++; if(Money2==10) { Money2=0; // Money1=0; } }
if(KmCount==100)KmCount=0; }
else if(K0==1) {
//ET1=1; ////TR1=1;
//
关定时/计数器0中断 定时/计数器停止工作
开定时/计数器0中断 定时/计数器开始工作
22