微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 刚学单片机,有个中断的问题想请教下

刚学单片机,有个中断的问题想请教下

时间:10-02 整理:3721RD 点击:

题目要求是:用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管的前两位59s循环计时。        
我写的程序:
/*        用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,
        用定时器1的方式1实现数码管的前两位59s循环计时。                        */      
#include<reg52.h>                                 //头文件
#define uchar unsigned char           
#define uint unsigned int               
uchar code table[]={                        //编码数码管
0X3F,0X06,0X5B,0X4F,                        
0X66,0X6D,0X7D,0X07,
0X7F,0X6F,0X77,0X7C,
0X39,0X5E,0X79,0X71};
sbit led1=P1^0;
sbit dula=P2^6;                                       
sbit wela=P2^7;
uchar num0,num1,num,shi,ge;
void display(uchar,uchar);
void delayms(uint);
void main()
{        
        EA=1;                                          //开总中断
        ET0=1;                                          //开定时器0中断
        ET1=1;                                          //开定时器1中断
        TMOD=0X11;                                  //设置定时器工作模式,T0,T1均为方式1
        TR0=1;                                          //启动定时器0
        TR1=1;                                          //启动定时器1
        TH0=(65536-50000)/256;           //定时器0装入初值        
        TL0=(65536-50000)%256;         
        TH1=(65536-50000)/256;           //定时器1装入初值
        TL1=(65536-50000)%256;           
        while(1)
        {
                display(shi,ge);
        }
}
void display(uchar shi,uchar ge)
{
        dula=1;                                                           //数码管十位
        P0=table[shi];
        dula=0;
        P0=0XFF;
        wela=1;
        P0=0XFD;
        wela=0;
//        delayms(5);
        dula=1;
        P0=table[ge];
        dula=0;
        P0=0XFF;
        wela=1;
        P0=0XFE;
        wela=0;
//        delayms(5);
}
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
//定时器0
void T0_time() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        num0++;        
        if(num0==4)
                {
                        num0=0;
                        led1=~led1;
                }
}
//定时器1
void T1_time() interrupt 3
{
        
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        num1++;        
        if(num1==20)
        {
                num1=0;
                num++;
                if(num==60)
                        num=0;
                shi=num/10;
                ge=num%10;
        }        
}

实验结果是:发光二极管不亮,数码管前两位显示8.8.
求大神指点指点!

终于改好了,发光二极管自己亮的,数码管送段选前应关闭位选。
改好后程序:
/*        用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,
        用定时器1的方式1实现数码管的前两位59s循环计时。                        */         
#include<reg52.h>                                 //头文件
#define uchar unsigned char          
#define uint unsigned int               
uchar code table[]={                        //编码数码管
0X3F,0X06,0X5B,0X4F,                       
0X66,0X6D,0X7D,0X07,
0X7F,0X6F,0X77,0X7C,
0X39,0X5E,0X79,0X71};
sbit led1=P1^0;
sbit dula=P2^6;                                       
sbit wela=P2^7;
uchar num0,num1,num,shi,ge;
void display(uchar,uchar);
void delayms(uint);
void main()
{       
        EA=1;                                          //开总中断
        ET0=1;                                          //开定时器0中断
        ET1=1;                                          //开定时器1中断
        TMOD=0X11;                                  //设置定时器工作模式,T0,T1均为方式1
        TR0=1;                                          //启动定时器0
        TR1=1;                                          //启动定时器1
        TH0=(65536-50000)/256;           //定时器0装入初值       
        TL0=(65536-50000)%256;          
        TH1=(65536-50000)/256;           //定时器1装入初值
        TL1=(65536-50000)%256;          
        while(1)
        {
                display(shi,ge);
        }
}
void display(uchar shi,uchar ge)
{
//        P0=0XFF;
        dula=0;
        wela=1;
        P0=0XFE;
        wela=0;       
        P0=0XFF;
        dula=1;                                                           //数码管十位
        P0=table[shi];
        dula=0;
        delayms(5);
//        P0=0XFF;
        dula=0;
           wela=1;
        P0=0XFD;
        wela=0;               
        P0=0XFF;
        dula=1;
        P0=table[ge];
        dula=0;
        delayms(5);
}
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
//定时器0
void T0_time() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        num0++;       
        if(num0==4)
                {
                        num0=0;
                        led1=~led1;
                }
}
//定时器1
void T1_time() interrupt 3
{
       
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        num1++;       
        if(num1==20)
        {
                num1=0;
                num++;
                if(num==60)
                        num=0;
                shi=num/10;
                ge=num%10;
        }       
}

应该对num0=0,num1=0,shi=0,ge=0赋初值

书上说不赋初值也可以,郭天祥的《新概念51单片机C语言教程》

代码有问题   建议认真理清思路。

数码管送段选前应关闭位选。
应该是循环扫描 任何时候都只有一位数码管处于选通状态

程序中不要用大于1MS以上的延时

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top