您的位置 首页 数字

STC89C52单片机定时器1完成计数器

实现功能:配置定时器1的相关寄存器,使其实现定时器中断

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

完结功用: 装备守时器1的相关寄存器,使其完结守时器中止功用,然后经过在数码
试验板类型:BS-XYD-C52
试验称号: 守时器1完结计数器
编写人: 谢应东
编写日期: 2012-4-26
///////////////////////////////////////////////////////////////////////////
#include
#define uchar unsigned char //界说unsigned char 为 uchar
#define uint unsigned int//界说unsigned int 为 uint

uchar cTime_10ms_counter;//中止次数计数单元
uchar cTime_1s_ok;//判别是否为1s的变量
uchar uDis_buff[2];//显现缓冲区,寄存要显现的2个字符的段码值
uchar cTime;//秒计数单元

#define Time_1s_Sign 100//依据中止周期,判别是否到一秒的标志

sbit Duan=P2^6;//界说数码管的段选使能端
sbit Wei =P2^7; //界说数码管的位选使能端

#define Digital_tube_Wei_Enable Wei=1;//敞开操控数码管的位选使能端
#define Digital_tube_Wei_Disable Wei=0; //封闭操控数码管的位选使能端

#define Digital_tube_Duan_Enable Duan=1;//敞开操控数码管的段选使能端
#define Digital_tube_Duan_Disable Duan=0;//封闭操控数码管的段选使能端

#define Digital_tube_Duan P0 //界说数码管数据端口

uchar code Dis_table[]= //将BCD码转换成数码管扫描码的数组
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
uchar code Dis_Position[]=//界说数码管位选的数组
{0x3e,0x3d,0x3b,0x37,0x1f,0x2f};
///////////////////////////////////////////////////////////////////////////
函数称号:毫秒延时函数
函数功用:完结毫秒级的延时
参数介绍:Delay_MS: 界说需求延时的毫秒的数值
iNumber: 记载Delay_MS的数值,以for句子完结所要求的延时
iValue: 要延时毫秒所要进行的循环数值,本数值为实践测得
返回值:
注意事项:本试验是在所用晶振为12M的前提下完结的毫秒延时,本函数是经过循环的形
式完结,所以假如改动了晶振的频率,请做相应的改动
///////////////////////////////////////////////////////////////////////////
void DelayMs(uint Delay_MS)
{
uint iNumber,iValue;
for(iNumber=0;iNumber //用for句子完结单片机的延时
{
iValue=107; //107这个数值是经过测定而得
while(iValue–);
}
}
///////////////////////////////////////////////////////////////////////////
函数称号:One_DigitalTube_display
函数功用:完结在试验板上数码管指定显现,即在特定的数码管上显现特定的数字,比
在第一个数码管上显现0
参数介绍:uData:要显现的数字的BCD码数组
uNumber:挑选哪个数码管显现,即让某个特定数码管显现
返回值:
注意事项:试验板上的数码管是共阴极的数码管,假如运用共阳极的数码管,请注意不
要弄反了
///////////////////////////////////////////////////////////////////////////
void One_DigitalTube_display(uchar uData,uchar uNumber)
{
Digital_tube_Duan_Enable; //使能数码管的段选
Digital_tube_Duan=Dis_table[uData];//输入所要显现的数值
Digital_tube_Duan_Disable; //封闭数码管的段选

Digital_tube_Duan=Dis_Position[uNumber]; //点亮特定的数码管
Digital_tube_Wei_Enable; //使能数码管的位选
Digital_tube_Wei_Disable; //封闭数码管的位选
DelayMs(5); //调整时序,以完结安稳显现
}
///////////////////////////////////////////////////////////////////////////
函数称号:Time_to_disbuffer
函数功用:把要在数码管上显现的数值,进行取余、取整,即对数值进行切割,这样以
便显现在别离的数码管
参数介绍:无
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////
void Time_to_disbuffer()
{
uDis_buff[1]=cTime;//对cTime的数值取余,即便是取cTime的个位
uDis_buff[0]=cTime/10;//对cTime的数值取整,即便是取cTime的十位
}
///////////////////////////////////////////////////////////////////////////
函数称号:Init_time1
函数功用:装备守时器1,装备的形式是守时器1选用16位守时器形式,在守时器1的输入
数值寄存器输入特定的数值,使其每次中止的周期为10ms,一起答应守时器1
中止,并翻开总中止
参数介绍:无
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////
void Init_time1(void)
{
TMOD |= 0x10;
TH1=(65535-10000)/256;
TL1=(65535-10000)%6; //守时器0的,写入数值寄存器的低8位
EA=1; //总中止翻开
ET1=1; //守时器T0答应中止
TR1=1; //守时器T0开端作业
}
///////////////////////////////////////////////////////////////////////////
函数称号:Timer_Display
函数功用:把显现缓冲区的数值显现在数码管上
参数介绍:cNumber:记载for句子的循环次数
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////
void Timer_Display()
{
uchar cNumber;
for(cNumber=0;cNumber<2;cNumber++)
{
One_DigitalTube_display(uDis_buff[cNumber],cNumber);
DelayMs(2);
}
}
///////////////////////////////////////////////////////////////////////////
函数称号:main
函数功用:使用守时器1中止,在数码管上完结以一分钟为周期的计数器
参数介绍:无
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////
void main()
{
Init_time1(); //初始化守时器1
cTime=0;
while(1)
{
if(cTime_1s_ok)
{
cTime_1s_ok=0;
if(++cTime>=60) //每次自加一,一起判别是否到1分钟
{
cTime=0;
}
Time_to_disbuffer(); //新调整好的时刻送入显现缓冲区
}
Timer_Display(); //更新显现内容
}
}
///////////////////////////////////////////////////////////////////////////
函数称号:Interrupt_handler_time1
函数功用:从头给寄存器TH1和TL1赋值,判别是否抵达一秒,假如到一秒了,把相应的
变量赋予正值,以便利其他的程序编写
参数介绍:无
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////
void Interrupt_handler_time1(void) interrupt 3
{
uchar i;
TH1=(65535-10000)/256;//守时10毫秒
TL1=(65535-10000)%6;
cTime_10ms_counter++;
if(cTime_10ms_counter==Time_1s_Sign) //判别是否抵达一秒
{
cTime_10ms_counter=0;
cTime_1s_ok=1;
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/262881.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部