单片机入门之数码管定时闹钟(2)

在之前的文章中我们学习了数码管定时闹钟中的按键中断的写法,接下来我们需要将我们的按键、蜂鸣器和我们之前设计的数码管计时器相结合起来,就可以实现一个数字时间现实的定时闹钟了。

一、功能概述

通过按键来控制设定的时间,当到达时间后进入外部中断,蜂鸣器开始工作,实现定时闹钟的功能。时间数字在四位数码管上进行显示,分钟倒计时定时闹钟的功能,在此基础上还可以添加小时的数码管,来对小时的时间进行设置,原理还是类似的。

二、显示原

本设计同样采用的AT89C51单片机来实现多位数码管的控制,附带按键设置时间,以及蜂鸣器闹钟的功能。

电路连接如下:

三、程序代码设计

结合我们前几章所学的数码管以及定时器、中断的方法来对程序进行编写。

程序如下:

#include< reg52.h >

#include< intrins.h >

#define uchar unsigned char

#define uint unsigned int

sbit key1=P3^0;//按键

sbit key2=P3^1;

sbit key3=P3^2;

sbit key4=P3^3;

sbit buffer=P2^3;//蜂鸣器

sbit DU =P2^6;//段选

sbit WE =P2^7;//位选

uchar bitdata[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管1-8

uchar segdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段选0-9,-

uchar dis_arr[]={10,10,10,10,10,10};//时钟显示数组

uchar time[]={0,0,0};//时钟 时分秒

uchar time_In[]={0,0,0,0,0,0};

uchar time_clk[]={0,0,0};//闹钟 时分秒

uchar num=0;

uchar mode=0;

uchar keydown=0;

uchar clk_state=0;

uchar keyIn,keyvalue,i,temp;//矩阵键盘读入

void key();

void init();

uchar keyscan();//矩阵键盘扫描函数

void delayms(uint x);//延时函数

void display(uchar duan1,uchar duan2,uchar duan3,uchar duan4,uchar duan5,uchar duan6);

void display_1(uchar wei,uchar duan);

void input();

void soundTime();

void main()

{

input();

init();

while(1)

{

key();

if(mode==0)//时钟

display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);

else if(mode==1)//闹钟

display(time_clk[0]/10,time_clk[0]%10,time_clk[1]/10,time_clk[1]%10,time_clk[2]/10,time_clk[2]%10);

}

}

void init()//初始化函数

{

P3=0xff;//给高电平

TMOD=0x01;//定时器工作方式选择1

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

EA=1; //开总中断

ET0=1;//允许定时器0中断

TR0=1;//开始计数

//P1=1;

}

void delayms(uint x)//延时函数

{

uint i,j;

for(i=x;i >0;i

发表评论