小車上方有寬窄不同的障礙物,要求小車數出寬的障礙物個數并顯示。怎樣讓每次發生低電平時計數器計數,而恢復高點平時不計數呢?我的程序可以讓它在第一次低電平時開始計數,但是當電平恢復高電平時還在計數停不下來。
#include<stc12c5a60s2.h>
#define uint unsigned int
#define uchar unsigned char
sbit chuanganqi=P3^3;
sbit RS=P2^5;
sbit RW=P2^6;
sbit EP=P2^7;
unsigned int geshu,kuan,num;
void delay(int z)
{
int i,j;
for(i=z;i>0;i--)
for(j=1000;j>0;j--);
}
void zhongduan1() interrupt 2 //外部中斷1
{
TR1=0;
Timer1_int();
TR1=1;
}
void zhongduan2() interrupt 3 //定時器中斷1
{
num++;
TL1 = 0x9C; //設置定時初值
TH1 = 0xFF; //設置定時初值 //定時100us=0.1ms
}
void Timer1_int() //定時器1初始化
{
/* TMOD|=0x10;
TH1=(65536-65436)/256;
TL1=(65536-65436)%256; //定時100us=0.1ms
EA=1;
TR1=1;
ET1=1; */
AUXR &= 0xBF; //定時器時鐘12T模式
TMOD &= 0x0F; //設置定時器模式
TMOD |= 0x10; //設置定時器模式
TL1 = 0x9C; //設置定時初值
TH1 = 0xFF; //設置定時初值
TF1 = 0; //清除TF1標志
// TR1 = 1; //定時器1開始計時
ET1=1;
}
void write_com(char com) //輸入命令函數
{
RS=0;
RW=0;
EP=0;
P0=com;
delay(5);
EP=1;
delay(5);
EP=0;
}
void write_date(char date)//輸入數據函數
{
RS=1;
RW=0;
EP=0;
P0=date;
delay(5);
EP=1;
delay(5);
EP=0;
}
void write_init()//初始化函數
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void display()
{
write_com(0x80+0x00);
write_date(geshu/1000+0x30);
write_com(0x80+0x01);
write_date(geshu%1000/100+0x30);
write_com(0x80+0x02);
write_date(geshu%1000%100/10+0x30);
write_com(0x80+0x03);
write_date(geshu%10+0x30);
}
void main()
{
IT1=1; //低電平觸發中斷
EX1=1;
write_init();
while(1)
{ EA=1;
Timer1_int();
if (num>=1000)
{
kuan++; // kuan/2是托盤個數
num=0;
TR1=0;
geshu=kuan/2;
}
display();
// delay(5);
}
}
|