题目: 两个数码管,K1,K2两个按键,完成K1启动计数,K2暂停计数,每一秒钟数码管增加1,60秒钟后,蜂鸣器响一声,数码管回归0,重新计数。
代码
#include"reg51.h"
#include"intrins.h"
#define seg1 P0
#define seg2 P2
typedef unsigned int u16;
typedef unsigned char u8;
u16 code smg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管编码
sbit key1=P3^2; //位定义
sbit key2=P3^3; //位定义
sbit buzzer=P1^0; //位定义
u16 num=0;
u16 i=0;
void delay(u16 i) //延时函数(约10微秒)
{
while(i--);
}
void int_init() //中断初始化函数
{
EA=1; //中断总允许位
EX0=1; //外部中断0允许位
IT0=1; //下降沿触发
EX1=1; //外部中断1允许位
IT1=1; //下降沿触发
}
void tim0_init() //定时计数器初始化函数
{
ET0=1; //定时计数器允许位
TMOD=0X01; //定时器0方式一
TH0=0XFC; //高八位初始值
TL0=0X18; //低八位初始值
TR0=0; //关闭定时(需要按k1才将TR0置为1)
}
void display() //数码管显示函数
{
seg1=~smg[num/10%10]; //十位
delay(10); //消影
seg2=~smg[num%10]; //个位
delay(10); //消影
}
void main() //主函数
{
int_init();
tim0_init();
while(1)
{
display();
}
}
void int0() interrupt 0 //外部中断0服务函数
{
if(key1==0) //判断是否按下
{
delay(1000); //消抖
if(key1==0)
{
TR0=1; //开启计时
}
}
}
void int1() interrupt 2 //外部中断1服务韩素
{
if(key2==0) //判断k2是否按下
{
delay(1000); //消抖
if(key2==0)
{
TR0=0; //关闭计时
}
}
}
void tim0() interrupt 1 //定时计数器服务函数
{
TH0=0XFC; //需要重新赋值高低8位
TL0=0X18;
if(i==1000) //循环多少次与初值有关
{
i=0;
num++;
}
i++;
if(num==61) //判断是否加到60
{
buzzer=0; //蜂鸣器
delay(100000);
buzzer=1;
num=0;
}
}
仿真图
元器件
AT89C51(AT89C52)
BUTTON(按钮)
BUZZER(蜂鸣器)
RES(电阻)
PNP(三极管)
GROUND(地)
POWER(电源)
SEG CA(共阳极数码管)
备注
1.因为是 共阴极编码,而数码管是共阳极,所以需要取反
2.定时器初始化时将TR0设置为0是为了显示题目中的按k1开始计数