请大神帮忙分析程序的运行流程是怎么样的(怎么读),初学中断,不太理解,还望见谅

2019-07-15 12:03发布

#include<reg52.h>
#define usi unsigned int   //宏定义
#define usc unsigned char  //宏定义
sbit duan=P2^6;
sbit wei=P2^7;
usc num,tt;
usc code table[]={           //代码表(数组)
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
                 };
void delay(usi z)                          //延时函数 放在主函数前不用声明 有参数,不能忘括号里的变量类型与名称
{
        usi x,y;
        for(x=z;x>0;x--)                 //这里不能>= 这个错误坑了我几个小时!!!
                for(y=110;y>0;y--);  //别再语句块分开的地方搞错了 是用分号不是逗号 诶~~~~~
}


void main()
{
                num=0;
                tt=0;
                TMOD=0x01;                         //设置定时器0为工作方式1
                TH0=(65535-50000)/256;  //    "/"是求模运算 即能被几个整除
                TL0=(65535-50000)%256;         //         "%"是求余运算 即整除后剩余
                EA=1;               //开总中断
                ET0=1;              //开定时器0中断
                TR0=1;              //启动定时器0  也可以写成 TCON=0x01;
                wei=1;
        P0=0x00;                //点亮所有数码管(共8位)
              wei=0;
                duan=1;
                P0=0x3f;            //数码管显示1
                duan=0;
        while(1)
                {
                         if(tt==20)
                                {
                                        tt=0;
                                        num++;
                                        if(num==16)
                                                num=0;
                                        duan=1;
                                        P0=table[num];
                                        duan=0;
                                        //delay(1000);
                                }
                }
}

void time0() interrupt 1
        {
                TH0=(65535-50000)/256;
                TL0=(65535-50000)%256;
                tt++;
        }  


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
try_fiyfan
1楼-- · 2019-07-15 16:33
你这主题没有电路图,也不知道你具体晒要实现什么,中断的话...
  num=0;
                tt=0;
                TMOD=0x01;                         //设置定时器0为工作方式1
                TH0=(65535-50000)/256;  //    "/"是求模运算 即能被几个整除
                TL0=(65535-50000)%256;         //         "%"是求余运算 即整除后剩余
                EA=1;               //开总中断
                ET0=1;              //开定时器0中断
                TR0=1;              //启动定时器0  也可以写成 TCON=0x01;
                wei=1;

你这一段程序是对定时器0的初值、工作方式以及可以中断进行设置,TH0和TL0时定时器0的初值,它决定了定时器0每一次从开始计数到溢出的所需时间,定时器/计数器工作在方式1时是16位2进制数模式,高8位和低8位总共有65536个计数次数,当计数达到65535时,即在下一个机械周期到来时定时器将会达到65536使之溢出,到时硬件将会把溢出标志位置1,向单片机发送中断请求,单片机响应中断后将会停止目前正在执行的程序,并留下一个断点,然后转向执行中断程序,中断程序执行结束后会返回断点继续执行之前停止的程序;
void Time0() interrupt 1
        {
                TH0=(65535-50000)/256;
                TL0=(65535-50000)%256;
                tt++;
        }  

你这一段就是中断程序,当定时器0溢出使单片机响应中断后,执行中断程序,中断程序意思:重置定时器0的初值,并将变量tt加1,然后退出中断;
while(1)
                {
                         if(tt==20)
                                {
                                        tt=0;
                                        num++;
                                        if(num==16)
                                                num=0;
                                        duan=1;
                                        P0=table[num];
                                        duan=0;
                                        //delay(1000);
                                }
                }

主函数中有while语句,所以,单片机执行完开始时对定时器0的初值、工作方式,数码管显示等的设定后,就会一直停滞在whlie语句中等待if语句达到条件,当tt等于20,也就是定时器0中断20次后,将会执行if语句中的程序。
看后有不懂再问吧,先说这些 最佳答案
嗯哼你猜
2楼-- · 2019-07-15 20:09
5块钱,包教会,支付宝到位交易支持
try_fiyfan
3楼-- · 2019-07-15 20:44
没有电路图,也不知道你这程序摇实现什么,中断的话...
TMOD=0x01;                         //设置定时器0为工作方式1
                TH0=(65535-50000)/256;  //    "/"是求模运算 即能被几个整除
                TL0=(65535-50000)%256;         //         "%"是求余运算 即整除后剩余
                EA=1;               //开总中断
                ET0=1;              //开定时器0中断
                TR0=1;              //启动定时器0  也可以写成 TCON=0x01;

你这一段是对中断的工作方式、初值、是否允许中断等进行设置,而工作在模式1时,定时/计数器是16位的,TH0和TL0是定时器0的初值,决定定时器0的计时时间,定时器的计时是从初值开始,每一个机械周期往上+1,直至达到65535,下一机械周期到来时+1为65536,16位2进制数满,溢出,使定时器0的溢出标志位硬件置1,单片机停止当前程序,转向执行中断程序。
void Time0() interrupt 1
        {
                TH0=(65535-50000)/256;
                TL0=(65535-50000)%256;
                tt++;
        }  

这一段是你的中断程序,内容为:单片机定时器溢出中断后,重置定时器初值,并将变量tt加1,
   while(1)
                {
                         if(tt==20)
                                {
                                        tt=0;
                                        num++;
                                        if(num==16)
                                                num=0;
                                        duan=1;
                                        P0=table[num];
                                        duan=0;
                                        //delay(1000);
                                }
                }

在你的主函数中,有着这个while语句,单片机执行完上面对定时器0的初值的设定和数码管显示后就一直在这个语句里等待tt等于20,当tt等于20时,将tt重置为0并将变量num加1.
这是利用定时器0和中断实现的计时。
try_fiyfan
4楼-- · 2019-07-15 21:58
 精彩回答 2  元偷偷看……
try_fiyfan
5楼-- · 2019-07-15 22:45
嗯哼你猜 发表于 2017-2-2 13:34
5块钱,包教会,支付宝到位交易支持

好像很高大上....
try_fiyfan
6楼-- · 2019-07-16 00:39
先是对定时器0的初值、工作方式等的设定,当定时器0计数溢出时,单片机执行中断,中断程序内容:重置定时器0初值,并将变量tt加1。
这是第三次回复了,懒得再打那么详细了,免得再失败,如果还失败......我就不回了....

一周热门 更多>