小车上方有宽窄不同的障碍物,要求小车数出宽的障碍物个数并显示。怎样让每次发生低电平时计数器计数,而恢复高点平时不计数呢?我的程序可以让它在第一次低电平时开始计数,但是当电平恢复高电平时还在计数停不下来。
#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);
}
}
|