用 51单片机写一个按键计数器程序,计数不正确,求各位大神帮忙看一下
#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintuch...
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar Count=0;
#define uint unsigned int
//uint count;
void delay_ms(uint x);
void Init_Com(void);
char keyscan();
//sbit Clear_Key=P3^2;
sbit p1=P2^0;
sbit p2=P2^1;
sbit p3=P2^2;
sbit p4=P2^3;
sbit p5=P2^4;
sbit p6=P3^7;
//sbit Clear_Key=P3^2; //修改以前的程序
void delay_ms(uint z)
{
uint x,t;
for(x=z;x>0;x--)
for(t=110;t>0;t--); //1毫秒
}
///////以下功能:串口初始化,波特率9600,方式1/////////
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
#define DELAY_SEND (unsigned long)10000 //10秒 10*60*1000ms 定义 delay_send 为10秒
//#define DELAY_SEND (unsigned long)600000 //10分钟 10*60*1000ms
unsigned long delay_send=0;
/*char keyscan()
{
if(Clear_Key==0)
{
while(Clear_Key==0);//等待按键弹起
delay_send = 0;
return 1;
}
else
{
return 0;
}
} */
void main()
{
EA=1;//允许中断
EX0=1;
IT0=0;//允许外部中断 0
Init_Com();//串口初始化
while(1)
{ p6=1; //
delay_ms(3);
delay_send++;
if((delay_send > DELAY_SEND)&&(Count > 0))
{
delay_send=0;
//delay_ms(5);
if(Count >= 100)
{
SBUF = (Count/100)+0x30; //求百位
delay_ms(7);
SBUF = (Count%10/10)+0x30; //把数据发送出去
delay_ms(7);
SBUF = (Count%10)+0x30;
//delay_ms(1);
if(Count>100)
{
p1=0;
p2=0;
p3=0;
p4=0;
p5=0;
}
}
else if(Count>=10)
{
SBUF = (Count/10)+0x30; //把数据发送出去
delay_ms(7);
SBUF = (Count%10)+0x30;
if(Count>80)
{
p1=0;
p2=0;
p3=0;
p4=0;
}
else if(60<Count<80)
{
p1=0;
p2=0;
p3=0;
}
else if(40<Count<60)
{
p1=0;
p2=0;
p3=0;
}
else if(20<Count<40)
{ p1=0;
p2=0;
}
if(Count<20)
{
p1=0;
}
}
else
{
SBUF = Count+0x30; //把数据发送出去
}
Count=0;
}
}
}
void EX_INT0() interrupt 0 //利用中断来进行变化
{
EA=0;
delay_ms(3);
Count++;
p6=0;
EA=1;
} 展开
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar Count=0;
#define uint unsigned int
//uint count;
void delay_ms(uint x);
void Init_Com(void);
char keyscan();
//sbit Clear_Key=P3^2;
sbit p1=P2^0;
sbit p2=P2^1;
sbit p3=P2^2;
sbit p4=P2^3;
sbit p5=P2^4;
sbit p6=P3^7;
//sbit Clear_Key=P3^2; //修改以前的程序
void delay_ms(uint z)
{
uint x,t;
for(x=z;x>0;x--)
for(t=110;t>0;t--); //1毫秒
}
///////以下功能:串口初始化,波特率9600,方式1/////////
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
#define DELAY_SEND (unsigned long)10000 //10秒 10*60*1000ms 定义 delay_send 为10秒
//#define DELAY_SEND (unsigned long)600000 //10分钟 10*60*1000ms
unsigned long delay_send=0;
/*char keyscan()
{
if(Clear_Key==0)
{
while(Clear_Key==0);//等待按键弹起
delay_send = 0;
return 1;
}
else
{
return 0;
}
} */
void main()
{
EA=1;//允许中断
EX0=1;
IT0=0;//允许外部中断 0
Init_Com();//串口初始化
while(1)
{ p6=1; //
delay_ms(3);
delay_send++;
if((delay_send > DELAY_SEND)&&(Count > 0))
{
delay_send=0;
//delay_ms(5);
if(Count >= 100)
{
SBUF = (Count/100)+0x30; //求百位
delay_ms(7);
SBUF = (Count%10/10)+0x30; //把数据发送出去
delay_ms(7);
SBUF = (Count%10)+0x30;
//delay_ms(1);
if(Count>100)
{
p1=0;
p2=0;
p3=0;
p4=0;
p5=0;
}
}
else if(Count>=10)
{
SBUF = (Count/10)+0x30; //把数据发送出去
delay_ms(7);
SBUF = (Count%10)+0x30;
if(Count>80)
{
p1=0;
p2=0;
p3=0;
p4=0;
}
else if(60<Count<80)
{
p1=0;
p2=0;
p3=0;
}
else if(40<Count<60)
{
p1=0;
p2=0;
p3=0;
}
else if(20<Count<40)
{ p1=0;
p2=0;
}
if(Count<20)
{
p1=0;
}
}
else
{
SBUF = Count+0x30; //把数据发送出去
}
Count=0;
}
}
}
void EX_INT0() interrupt 0 //利用中断来进行变化
{
EA=0;
delay_ms(3);
Count++;
p6=0;
EA=1;
} 展开
1个回答
展开全部
void main()
{
EA=1;//允许中断
EX0=1;
IT0=0;//允许外部中断 0,,IT0=0 是低电平触发中断,处理不好可能会造成重入。
................
void EX_INT0() interrupt 0 //利用中断来进行变化
{
EA=0;
delay_ms(3);//中断服务里面延时,还关闭了中断,很容易漏掉一些计数。
Count++;
p6=0;
EA=1;
}
终上所述修改如下:
void main()
{
EA=1;//允许中断
EX0=1;
IT0=1;
........
void EX_INT0() interrupt 0 //利用中断来进行变化
{
Count++;
p6=0;
}
更多追问追答
追问
非常感谢 @zhxiufan
我把这个自定义时间改长一点 40 以内的可以准确 正常发送 但是40以后的 还没等我按键结束就发出来了
这样是不是要无止境的延长定义的时间啊?
求大师指点
#define DELAY_SEND (unsigned long)10000 //10秒
追答
时间你最好还是用定时器来做,靠延时很不靠谱的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询