谁能帮我写一个简单的单片机程序

来源:百度知道 编辑:UC知道 时间:2024/05/13 05:37:04
请利用下面的条件,做一个51单片机的键盘去抖动的程序,将键值送入数组key[10]里。
1) 要求做到程序不能延迟死等。
2) 请继续发挥,当按下键不放2秒后,自动变为连按状态,每200ms便送入1次到key[]里。
假如一个按键接在8051的P1.0口上,同时原程序已经有了基本的时间节拍,即10ms信号(是用定时器循环计算和定时中断完成的),每隔10ms后,标志位“one_tick”被置1,见如下程序:
Void main( )
{
Ini( ); //相关的初始化不用你写
While(1)
{
If(one_tick)
{//10ms到
one_tick=0;//清0
//你的程序放在这里
}
}
}

你这个one_tick要置1才能进入if函数 在里面实现你的这个程序是不可能的。。。按键还没有两秒就重你这程序跳出了,而且要精确到2秒需要用到中断

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar aa;
sbit key=P1^0

void delay(uchar a)
{
uint x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);

}

void keybord()
{
uint key[10],num;
if(key==0)
{
delay(200);
while(key==0)
{
TR0=1; //打开中断
if(aa=40) //2秒后
{
while(num>=10) //进入自动连按
{
if(aa==4) //每200MS发送一次键值
{

key[num]=num+1;
num++; //超过10次跳出
}
}
TR0=0; //关闭中断
}
}
}
}

void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}

首先,你定时的思路有点问题:清one_tick??????应该是加1吧!加到20后,送数到key[]里面。再清one_t