微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于单片机中断 与定时器的应用训练

关于单片机中断 与定时器的应用训练

时间:10-02 整理:3721RD 点击:
1位数码管上先显示零,按下SW0键(外中断1)蜂鸣器发出"答"的一声,数码管递增加数,
到9回零;按下SW1键(外中断0)蜂鸣器发出"笛"的一声,数码管递减减数,到0回9,用外中
断和定时器编程实现? 这是我写代码,但是结果。   图片上的代码跟这个是一样的
#include "stc15f2k60s2.h"

sbit k=P3^2;
sbit k2=P3^3;
int a,b;
//HC595?ó?ú?¨ò?
sbit                 DAT                =        P3^7;           //HC595′?DDêy?Y??
sbit                 SCK                =        P4^2;           //HC595ò???ê±?ó??
sbit                 RCK                =        P4^1;           //HC595??′?ê±?ó??
sbit                 OE                =        P4^5;           //HC595ê?3??êDí??
unsigned char code duanxuan[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};



//è???±?á?
//unsigned char duanxuan=0x7d;   //????
unsigned char weixuan=0x80;     //????

void delay (unsigned char ms)
{
  unsigned char  a;
        while ((ms--)!=0)
        {
          for (a=0;a<600;a++)
                {}
        }
}
void suocunqi(unsigned char  dis,unsigned char dig)    //????????  ????
{
        unsigned char i;              //?¨ò???êy?÷
        unsigned int temp=0;           //?¨ò?êy?Y±?á?
       
        temp=dis;     //??á???8??±?á?o?2¢3éò???16×??ú±?á?
        temp=temp<<8  | dig;
        OE=1;                                  //HC595ê?3??êDí??  ??μ???//1?±???ê?
        for(i=0;i<16;i++)                 //?í3?êy?Y       
    {                                 
                SCK=0;              //HC595ò???ê±?ó??   μíμ???//??μíê±?ó??
               
                if( (temp&0x8000)==0x8000 )   //?è·¢?í??×??ú
                 {
                           DAT=1;           //HC595′?DDêy?Y??    ??μ???  //????D?o???
                 }
                 else
                 {
            DAT=0;          //HC595′?DDêy?Y??       μíμ???//??μíD?o???
                 }       
                SCK=1;                   //HC595ò???ê±?ó??       ??μ???//????ê±?ó??
                 
            temp<<=1;                                                   //êy?Y×óò?                               
        }
       
                                //??′?D?o?é?éy????′?êy?Y                               
      RCK=0;                         //HC595??′?ê±?ó??      μíμ???
            RCK=1;            //HC595??′?ê±?ó??       ??μ???
            OE=0;                                   //HC595ê?3??êDí??      μíμ???//′ò?a??ê?
}


void fasongshuju (unsigned char Dat,unsigned char dig )    //·¢?íμ?ááêy??1üμ??? ó? ?? μ?êy?Y
{
       
suocunqi(Dat,~dig);
}
void chushihua (void)    //3?ê??ˉoˉêy
{       
       
        DAT=1;      //HC595′?DDêy?Y??    ??
        SCK=1;       //HC595ò???ê±?ó??     ??
        RCK=1;        //HC595??′?ê±?ó??    ??
        //ê?3??êDí£??aê???ê?
        OE=0;          //HC595ê?3??êDí??    μí
}
  void main(void)  //?÷oˉêy
{

         EA=1;
        ET0=1;
        EX0=1;
        IT0=1;
         IT1=1;
         EX1=1;
        TMOD=0X01;
    TH0=(65536-3000)/256;
    TL0=(65536-3000)%256;
        chushihua  ();                 //μ÷ó? 3?ê??ˉoˉêy       
   fasongshuju(duanxuan[0],weixuan);
         while(1)
         {
           if(k==0)
                 {
                         delay (20);
                   while(k2==1)
                         {
                           a++;
                                 if(a>9)
                                 {
                                   a=0;
                                 }
                                 
                         }
                 }
                 if(k2==0)
                 {
                   delay(20);
                         while(k==1)
                         {
                           a--;
                                 if(a==0)
                                 {
                                   a=9;
                                 }
                         }
                 }
                  
         }
}

void time0 (void ) interrupt 1 using 1
{
         
    fasongshuju(duanxuan[a],weixuan);
    TH0=(65536-3000)/256;
    TL0=(65536-3000)%256;
}


void int0  (void ) interrupt 0  using 0
{
        TR0=1;
}

void int1  (void ) interrupt 2 using 2
{
         TR0=1;
         }






要把问题现象说清楚,现在不知道你要问什么问题,程序有几个问题,一,没有判断按键的释放,这样变量a会不停的变化。二,没看到对蜂鸣器的操作。三,主程序没有启动定时器0,估计开始没显示,直到有按键按下才会开始显示。

蜂鸣器的比较简单,就还没写上去,这个程序一开始是显示0,本来是想按下去以后就开始启动定时器,然后成0-9或9-0这样子的流动,但是实际的是他的显示是乱了,不是一个正常数字          这里该怎么改呢

分开调试吧,先把显示调对,要能正确显示想要显示的内容,不知道你是用动态显示还是静态显示,两种的程序不一样,动态的需要定时做显示扫描,显示调好了,再调其他的,可以利用显示做一些提示来判断程序运行状态

这是动态的吧,显示原来是可以的,就是加上中断后,再加了几个语句就会乱了


这是动态显示的电路,不过如果只显示一个数码管,也可以当静态的用,你先把a的值固定不变,把while(1)里面的内容屏蔽,也就是只剩while(1){},外部中断保持,如果没错的话,你的程序应该是上电后无显示或显示不定值,当任意按键按下后显示a的值

我那while(1)之前有个显示0,我按你的做了,按下后数码管就一直显示原来的0;

在while(1)之前把显示关闭,什么都不显示,你现在设定的a值是多少,如果没正确显示,那就是定时器没启动,或显示部分有问题

谢谢你 大哥,我还是慢慢研究吧,一句两句说不清啊

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

网站地图

Top