作者quota (怎样转移档案?)
看板Programming
标题[请益] 请教8051
时间Tue Jun 26 07:07:04 2007
我现在要用8051作一个倒数计数器
作动原理是先用4*4按键输入数字
7段显示器出现数字
用一个按钮作计数动作
每按一下数字减一
当数字变零
喇叭就会叫
以下是电路图和我写的程式
http://img514.imageshack.us/my.php?image=60441066pk9.jpg

#include <REG51F.H>
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
#define F 1000 //定义输出频率=1KHz
#define T 11059000/12 //T=Fosc/12=基本的计时频率
#define t 65536-(T/2/F) //t=半周期频率的计时器内容
sbit P2_5=P2^5; //定义P2.5脚位
char count=0,scan=0xef;
char code Table[] //七段显示器的0~F的资料
={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void dataout(void);
void Delay(void);
main()
{
P0=0xff; //设定按键资料=00
P1=0xff;
P2=0x00;
EA=1;
EX0=1;
IT0=1;
ET0=1; //致能TIMER0计时中断
TMOD = 0x01; //设定TIMER0为模式1
TL0 =t; //设定时间
TH0 =t >> 8;
TR0=1; //开始计时
while(1) //重覆执行
{
if(count>15) {scan=0xef;count=0;}
P1=scan;
if (P1_0==0) dataout();//检查第A列
count++;Delay();
if (P1_1==0) dataout();//检查第B列
count++;Delay();
if (P1_2==0) dataout();//检查第C列
count++; Delay();
if (P1_3==0) dataout();//检查第D列
count++;Delay();
scan=scan<<1;
scan=scan|0x01;
}
}
void EX0_int(void) interrupt 0
{
count=count-1;
}
void T0_int(void) interrupt 1 //TIMER0中断函数
{
TL0 = t; //重新设定时间
TH0 = t >> 8;
P2_5 = P2_5; //P25反相输出
}
void dataout(void) //按键输出
{
Delay(); //处理按键跳动之延迟
P0=Table[count]; //送到七段显示器输出*/
while((P1 | 0xf0)==0xff);//若P10~3≠1111表示未放开
Delay(); //放开按键後先延迟再离开副程式
}
void Delay(void) //延时
{
int dly=70;
while(dly>0) dly--;
}
想用按钮作外部中断
但是一直没有成功
希望有高手可以帮我解决问题
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.169.111.20