用定时器做延时的数码管时间显示

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*

本程序实现了用数码管显示时间的功能,时间计数和现实基本一致(这取决于定时器精度和指令时间)。

该程序提供了一种用定时器延时实现传统delay的显示方法,后面给出比较。

文档最后有该程序对应的原理图,大部分开发板都能直接用这个程序,稍微改下IO口即可。如有错误之处请包涵,此篇文档仅作交流之用。

*/

/*---------------------定时器方法----------------*/

#include

/*----------------全局变量定义区----------------*/

sbit duan_xuan=P2^6; //数码管显示控制I/O

sbit wei_xuan=P2^7;

unsigned char minute = 0; //分钟的变量,20*60次timer0中断

unsigned char hour = 0;

unsigned char i_num_timer0; //定时器中断次数

unsigned char i_num_timer1;

unsigned char disp_min1,disp_min2,disp_hour1,disp_hour2; //分解后的数值变量

unsigned char wei = 1; //用来标记显示哪个数码管

unsigned short uc50ms = 0; //记录time0中断次数,此程序用两个变量记录time0中断次数

/*------定义数码管显示的数字---------*/

unsigned char code duan_table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

/*-----------------函数声明段----------------*/

void ini_program();

void disp_time(); //显示时间

void current_time(); //记录小时,分钟变量

// void breakdown_time(uint hour,uint minute);//分解数值,送数码管分别显示

//-------------------------------------

void main()

{

ini_program();

while(1)

{

current_time();

// breakdown_time(hour,minute);

disp_min1=minute%10;

disp_min2=minute/10;

disp_hour1=hour%10;

disp_hour2=hour/10;

// disp_time();

}

}

//------------------------------------

void ini_program() //初始化

{

duan_xuan=0;

wei_xuan=0; //重置I/O状态

TMOD=0x11; //定时器0+定时器1,设定方式1

TH1=(65536-1834)/256;

TL1=(65536-1834)%256; //2ms触发一次中断

TH0=(65536-45872)/256;

TL0=(65536-45872)%256; //50ms触发一次中断

EA=1;

ET0=1;

ET1=1;

TR0=1;

TR1=1;

}

/*

void breakdown_time(uint hour,uint minute)

{

disp_min1=minute%10;

disp_min2=minute/10;

disp_hour1=hour%10;

disp_hour2=hour/10;

}

*/

void disp_time()

{

switch (wei)

{

case 1 :

duan_xuan=1;

P0=duan_table[disp_min1];

duan_xuan=0;

P0=0xff; //消影

wei_xuan=1;

P0=0xef; //选通wei5

wei_xuan=0;

break;

//////////////

case 2:

duan_xuan=1;

P0=duan_table[disp_min2];

duan_xuan=0;

wei_xuan=1;

P0=0xf7; //选通wei4

wei_xuan=0;

break;

//////////////////

case 3:

if(i_num_timer0>=20)

{

i_num_timer0=0;

duan_xuan=1;

P0=0x40; //显示一横杠

duan_xuan=0;

P0=0xff; //消影

wei_xuan=1;

P0=0xfb; //选通wei3

wei_xuan=0;

}

break;

////////////////

case 4:

duan_xuan=1;

P0=duan_table[disp_hour1];

duan_xuan=0;

P0=0xff; //消影

wei_xuan=1;

P0=0xfd; //选通wei2

wei_xuan=0;

break;

//////////////

case 5:

duan_xuan=1;

P0=duan_table[disp_hour2];

duan_xuan=0;

P0=0xff; //消影

wei_xuan=1;

P0=0xfe; //选通wei1

wei_xuan=0;

break;

}

}

void current_time()

{

if(uc50ms>=1200) //此处用==也可以

{

minute++;

uc50ms=0;

}

if(minute>=60)

{

hour++;

minute=0;

}

if(hour>=24)

{

hour=0;

minute=0;

}

}

/*--------------添加中断函数----------*/

void TIME1() interrupt 3

{

TH1=(65536-1834)/256;

相关文档
最新文档