源程序如下:
#pragma REGPARMS CD DB SB OE OT(5)
#include
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
byte sec,ms,xs_en,shic; /*定义时间变量*/
sbit P2_0 = P2^0; //键盘输出1
sbit P2_1 = P2^1; //键盘输出2
sbit P2_2 = P2^2; //键盘输入1
sbit P2_3 = P2^3; //键盘输入2
sbit P2_4 = P2^4; //蜂鸣器
sbit P2_5 = P2^5; //继电器
sbit P2_6 = P2^6; //数码管1
sbit P2_7 = P2^7; //数码管2
/**********************************************************************
函数功能: 延时程序
入口参数: 延迟时间
出口参数: 无
***********************************************************************/
void Delay(byte time)
{
byte i;
for(;time > 0;time--)
for(i=10;i > 0;i--);
}
/*LED数码管显示程序****************************************************
入口函数:要显示的值
出口函数:无
**********************************************************************/
void xianshi(byte xs) //输入要显示的值
{
byte code Seg[10]={0x28,0xf9,0x4c,0x58,0x99,0x1a,0x0a,0xf8,0x08,0x18};
P0=0xff;//显示个位
P2_7=1;
P2_6=0;
P0=Seg[xs%10];
Delay(10); //延时程序
P0=0xff;//显示十位
P2_6=1;
P2_7=0;
P0=Seg[xs/10];
Delay(10); //延时程序
}
/**********************************************************************
函数功能:扫描键盘
函数入口:无
函数出口:有/无键按下 1/0
**********************************************************************/
byte keyfun(void)
{
byte P2copy;
P2 &= 0xfc;
P2copy = P2;
if((P2copy & 0x04) && (P2copy & 0x08)) return 0;
else
{
EA = 0;
return 1;
}
}
/**********************************************************************
函数功能: 外部中断服务程序
入口参数: 无
出口参数: 无
***********************************************************************/
void STOP1() interrupt 2 /*当ITN0中断时执行此函数*/
{
ET0 = 1;
xs_en = 1;
}
/**********************************************************************
函数功能: 外部中断服务程序
入口参数: 无
出口参数: 无
***********************************************************************/
void STOP0() interrupt 0 /*当ITN0中断时执行此函数*/
{
if(xs_en)
{
xs_en = 0;
ms = 0;
sec = 0;
}
else
{
ET0 = 0;
}
}
/**********************************************************************
函数功能: 定时器中断函数(扫描键盘)(10ms 16位定时)
入口参数: 无
出口参数: 无
***********************************************************************/
void Time0_Func() interrupt 1 /*当定时器中断时执行此函数*/
{
TH0=(0xffff-9259)/256;/*10ms*/
TL0=(0xffff-9259)%256;
ms++;
if(keyfun()) //当有键时,P2低四位置1,定时器中断禁止
{
P2 |= 0x0f;
}
else
{
if(ms == 99) {ms = 0; sec++;}
if(ms % 5 == 0 && xs_en)
{
switch(ms / 5)
{
case 1 : P1 = 0x7f; break;
case 2 : P1 = 0x3f; break;
case 3 : P1 = 0x1f; break;
case 4 : P1 = 0x8f; break;
case 5 : P1 = 0xc7; break;
case 6 : P1 = 0xe3; break;
case 7 : P1 = 0xf1; break;
case 8 : P1 = 0xf8; break;
case 9 : P1 = 0xfc; break;
case 10: P1 = 0xfe; break;
default: P1 = 0xff;
}
}
}
}
/**********************************************************************
函数功能: 上电初始化函数
入口参数: 无
出口参数: 无
***********************************************************************/
void Power_Up(void)
{
TMOD = 0x01;/*Time0为16计数器*/
TH0=(0xffff-9259)/256;/*10ms*/
TL0=(0xffff-9259)%256;
TR0=1; //T0启动
IT0 = 1; //外部中断为边沿触发
IE=0x87; /*EA=1 ET0=1 EX0=1 EX1=1*/
P1=0xff;
P2=0xff;
}
/**********************************************************************
函数功能: 键值扫描
入口参数: 无
出口参数: 键值
***********************************************************************/
byte keyscan(void)
{
byte i,j;
P2 |= 0x0f;
P2 &= 0xfe; //Key_1低电平
for(i=0;i<2;i++)
{
if(i)
{
P2 |= 0x0f;
P2 &= 0xfd; //Key_2低电平
}
j = P2 & 0x0c;
j >>= 1;
if(j != 6) {return (i+j-1); break;}
}
return 0;
}
/**********************************************************************
函数功能: 时间调整
入口参数: 无
出口参数: 无
***********************************************************************/
void TiaoZ(void)
{
byte sp=1,Keyc,Keyl;
while(sp)
{
xianshi(shic);
Delay(20);
Keyc = keyscan();
while(Keyc != Keyl)
{
xianshi(shic);
Delay(20);
switch(Keyc)
{
case 3 ://显示值加1
shic++; break;
case 2 ://显示值减1
shic--; break;
case 4 ://退出调整
sp=0;
while(Keyc == keyscan());
Power_Up();
break;
}
Keyl = Keyc;
}
}
}
/**********************************************************************
函数功能: 主函数
入口参数: 无
出口参数: 无
***********************************************************************/
void main()
{
sec=0; //初始化
ms=0;
xs_en=1;
shic=10; //初始时长10秒
Power_Up(); //初始化
while(1)
{
if(EA == 0) TiaoZ();
if(ET0 == 0) {P1 = ~sec; xianshi(ms);}
if(xs_en == 1) xianshi(ms);
}
}
上一篇:51单片机汇编基础
下一篇:8051单片机的常见问题
推荐阅读最新更新时间:2024-03-16 15:07