找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2562|回复: 0
打印 上一主题 下一主题
收起左侧

单片机T0定时器毫秒级精确定时程序源码及分析2

[复制链接]
跳转到指定楼层
楼主
接上篇:http://www.51hei.com/bbs/dpj-143668-1.html
使用16位计数器,减少计数中断的机率。

程序:


//全局变量声明
sbit lcd_sid=P3^7; //定义12864数据端口
sbit lcd_sclk=P3^6; //定义12864时钟脉冲端口
sbit pwm=P1^3;//

unsigned char t0_1ms; //T0计数器

//子函数声明
void init(); //初始化子函数
void lcd(); //lcd子函数

//主函数开始/////////////////////////////////////////////////////////////////////
void main()
{
        init(); //初始化
        while(1) //循环下面的程序
        {
                if(t0_1ms==5) //如果计数5次,5*0.2ms=1ms,执行下面的程序
                {
                        t0_1ms=0; //计数器复位
               
                        lcd(); //lcd显示
                }
        }
}

//主函数结束/////////////////////////////////////////////////////////////////////

//子函数程序
void t0_ms()interrupt 1 //T0中断函数,每次中断都需要重装初值,实际的中断时间还需要加上中断处理程序的时间。
{
        t0_1ms++; //每xms加一次
        TL0=0x18; //自动重装
        TH0=0xfc; //自动重装值
        pwm=~pwm; //
}

void init() //初始化子函数
{
        //T0初始化
        AUXR&=0x7f; //B7=0,T0设置为12倍速,其它设置不变
        TMOD&=0xf0; //xxxx 0000,T0设置置零
        TMOD|=0x01; //xxxx 0001,T0设置为16位手动重装
        TR0=1; //T0运行
        EA=1; //
        ET0=1; //
}

void lcd(); //lcd子函数





可以看到时间比计算的要多,通过增加初装值减少时间。
void t0_ms()interrupt 1 //T0中断函数
{
        t0_1ms++; //每xms加一次
        TL0=0x19; //自动重装值,比初值加1
        TH0=0xfc; //自动重装值
        pwm=~pwm; //
}





示波器已经测不出差别,在删除不相关的程序后,没有发现时间有变换。
基本达到要求。下面尝试增加LCD的程序看看。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表