找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机两个定时器是需要两个外部中断吗?

[复制链接]
跳转到指定楼层
楼主
ID:337280 发表于 2018-7-19 12:21 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我现在做的是使用两个传感器  一个超声波  一个PH   程序里用到了定时器0  和定时器1  两个传感器给的参考例程用的都是定时器0和外部中断0,然后我就把超声波的定时器改成了  定时器1  外部中断1   



两个用的都是TMOD=0X01;
我改成了  TMOD=0X11;



这是PH参考程序利用到的外部中断
void timer0( ) interrupt 1 //定时器0工作方式1
{

TH0=(65536-2)/256;          //重装计数初值
TL0=(65536-2)%256;          //重装计数初值
CLK=!CLK;                          //取反
}

/*************************************************************************
                                主函数        
**************************************************************************/
void main()
{
TMOD=0X01;                          //定时器中断0

CLK=0;                                  //脉冲信号初始值为0
TH0=(65536-2)/256;          //定时时间高八位初值
TL0=(65536-2)%256;          //定时时间低八位初值
EA=1;                                  //开CPU中断
ET0=1;                                  //开T/C0中断
TR0=1;
while(1)                           //无限循环
        {
        ST=0;                                //使采集信号为低
        ST=1;                                //开始数据转换
        ST=0;                                //停止数据转换
        while(!EOC);                //等待数据转换完毕
        OE=1;                                //允许数据输出信号
        AD0809=P1;                    //读取数据
        OE=0;                                //关闭数据输出允许信号
        if(AD0809>=251)                //电压显示不能超过5V
        AD0809=250;
        date=AD0809*20;                //数码管显示的数据值,其中20为采集数据的毫安值
        xianshi();                        //数码管显示函数

    }
}        



这是超声波里用到的


           time=TH0*256+TL0;
           TH0=0;
           TL0=0;
           S=time*1.87/100;



void main(void)
{  
    TMOD=0x01;                   //设T0为方式1,GATE=1
        TH0=0;
        TL0=0;
        TR0=1;

        Lcd_init();       //设置液晶显示器
        Clr_Scr();        //清屏        
        Disp_img(logo);          //显示欢迎使用本产品LOGO
        Delaynms(12000);
        Lcd_init();       //从图形显示状态下返回
    Lcd_Mark2();


        while(1)
        {
         StartModule();         
                                         //计算
         while(!RX);                //当RX为零时等待
         TR0=1;                            //开启计数
         while(RX);                        //当RX为1计数并等待
         TR0=0;                                //关闭计数
         Conut();
         delayms(1200);                //80MS




这是我把他两个揉起来的

void main(void)
{  
    TMOD=0x11;                   //设T0为方式1,GATE=1
        TH1=0;
        TL1=0;
        TR1=1;
        CLK=0;                                  //脉冲信号初始值为0
    TH0=(65536-2)/256;          //定时时间高八位初值
    TL0=(65536-2)%256;          //定时时间低八位初值
    EA=1;                                  //开CPU中断
    ET0=1;                                  //开T/C0中断
    TR0=1;
         
    Lcd_init();     
    Lcd_Mark2();
        Lcd_Mark3();        





        while(1)
        {

         StartModule();         
                                         //计算
         while(!RX);                //当RX为零时等待
         TR1=1;                            //开启计数
         while(RX);                        //当RX为1计数并等待
         TR1=0;                                //关闭计数
         Conut();
         delayms(80);                //80MS


        ST=0;                                //使采集信号为低
        ST=1;                                //开始数据转换
        ST=0;                                //停止数据转换
        while(!EOC);                //等待数据转换完毕
        OE=1;                                //允许数据输出信号
        AD0809=P1;                    //读取数据
        OE=0;                                //关闭数据输出允许信号
        if(AD0809>=251)                //电压显示不能超过5V
        AD0809=250;
        date=AD0809*20;                //显示的数据值,其中20为采集数据的毫安值
        xianshi();                        //显示函数


        }
        }
         /*************************************************************************
                                CLK振荡信号        
**************************************************************************/
void timer0( ) interrupt 1 //定时器0工作方式1
{

TH0=(65536-2)/256;          //重装计数初值
TL0=(65536-2)%256;          //重装计数初值
CLK=!CLK;                          //取反
}





还请大佬看看哪里出了问题   我现在如果只用超声波的话  程序可以    如果把PH的东西都插上   数据就不能实时显示   只能通电的一瞬间显示然后数据就定住了

评分

参与人数 1黑币 +1 收起 理由
LIUJISHAN + 1 淡定

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

7#
ID:375368 发表于 2018-7-20 10:26 | 只看该作者
定时器是定时器的两个寄存器溢出中断,外部中断是外部中断
回复

使用道具 举报

6#
ID:245302 发表于 2018-7-19 19:13 | 只看该作者
定时器不需要外部中断,内部中断就可以
回复

使用道具 举报

5#
ID:370114 发表于 2018-7-19 17:22 | 只看该作者
首先定时器1的中断没有开启,其次程序的逻辑也要注意,特别是中断优先级等等
回复

使用道具 举报

地板
ID:374956 发表于 2018-7-19 16:27 | 只看该作者
时钟有时钟中断的、
回复

使用道具 举报

板凳
ID:250337 发表于 2018-7-19 15:50 | 只看该作者
可以一个中断里面执行两个动作,如果你需要使用两个中断  那你的程序里面就需要两个中断。
回复

使用道具 举报

沙发
ID:277550 发表于 2018-7-19 15:24 | 只看该作者
时钟不需要外部中断,有时钟中断。


~~~~~~~~~~~~~~~~~
程序,根据逻辑融合起来,而不是生搬硬套拷贝到一起。

~~~~~~~~~~~~~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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