久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2915|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)執(zhí)行兩個(gè)中斷的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
我做了一個(gè)da的中斷,一個(gè)ad的中斷,現(xiàn)在我想通過外接按鍵控單片機(jī)執(zhí)行其中某一個(gè)中斷,但是仿真只執(zhí)行其中da的中斷,我是初學(xué)者,請大神指導(dǎo)。我同學(xué)說可以用中斷嵌套,但是我不會這個(gè)。
下面是程序清單:
#include<reg51.h>
#include<math.h>

#define DAC_PORT P2
sbit DAC_CS_WR=P3^0;
sbit K1=P1^5;
sbit K2=P1^6;
sbit K3=P1^7;
sbit K4=P3^3;
sbit K5=P3^2;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;

#include<intrins.h>
#include<tlc0832.c>
#define uchar unsigned char
#define nop  _nop_()
sbit CS = P3^0;
sbit CLK = P3^1;
sbit DIDO = P3^7;

code uchar seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar cp1,cp2,dat_ad;

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;


u8 mode;
u8 time;
u8 AM;


void Timer0Int(void);
void scanKey(void);
void sys_int(void);
void squ_wave(u8 location);
void tri_wave(u8 location);
void tra_wave(u8 location);
void saw_wave(u8 location);
//Ä£êy×a»»
void tlc0832_init(void)
{
        CS = 1;nop;                                     
        CLK = 1;
        CS = 0;
}

uchar tlc0832_ch0(void)
{
        uchar dat1,i;
        tlc0832_init();
        DIDO = 1;CLK = 0;nop;CLK = 1;nop;                 
        DIDO = 1;CLK = 0;nop;CLK = 1;nop;                  
        DIDO = 0;CLK = 0;nop;CLK = 1;nop;             
        DIDO = 1;                                                                  
        for(i = 0;i<=8;i++)                                               
        {                       
dat1 = dat1<<1;                               
                CLK = 0;nop;                                                 
                if(DIDO)dat1 = dat1|0x01;                          
                CLK = 1;nop;                                                 
                                                  
        }
       
        return(dat1);
        CS = 1;
}

void timer0_init()        {                               
        TMOD = 0x01;                                       
        TL1 = 0x78;
        TH1 = 0xec;
        EA = 1;
        TR1 = 1;
        ET1 = 1;
}
void timer0_isr()interrupt 0          
{
        TL1 = 0x78;
        TH1 = 0xec;
        cp1++;
        if(cp1>100)                                                //0.5s
        {
                cp1 = 0;
                dat_ad=tlc0832_ch0();               
        }
        P0 = 0xff;       
       
        cp2++;
        if(cp2>=3)
        cp2 = 0;
       
        switch(cp2)
        {
                case 0:P0 = seven_seg[dat_ad%10];P10=1,P11=0,P12=0;break;
            case 1:P0 = seven_seg[dat_ad%100/10];P10=0,P11=1,P12=0;break;
                case 2:P0 = seven_seg[dat_ad/100];P10=0,P11=0,P12=1;break;
        }
       
}
//êyÄ£×a»»
void Timer0Int(void)               
{

        TMOD &= 0xF0;               
        TMOD |= 0x02;        
        TL0 = 0x9C;            
        TH0 = 0x9C;               
        TF0 = 0;               
        TR0 = 1;              
        EA = 1;        
        ET0 = 1;      
}

void scanKey(void)
{

        if(K1==0)
        {
                mode=1;
        }

        if(K2==0)
        {
                mode=2;
        }

        if(K3==0)
        {
                mode=3;
        }      

}
void sys_int(void)
{
        time=0;
        DAC_CS_WR=0;
        DAC_PORT=0;
        mode=0;      
        AM=255;
}


void squ_wave(u8 location)
{
        if(location<50)
                DAC_PORT=AM;
        else
                DAC_PORT=0x00;
}

void tri_wave(u8 location)
{
        u8 y;
        if(location<50)
                y=(50-location)*AM/50;
        else
                y=(location-50)*AM/50;
        DAC_PORT=y;
}

void saw_wave(u8 location)
{
        DAC_PORT=location*AM/100;
}

void Timer0Work() interrupt 2
{
        switch(mode)
        {
            case 1:squ_wave((u8) time);break;
                case 2:tri_wave((u8) time);break;               
                case 3:saw_wave((u8) time);break;
        }
        time++;
        if(time>=100)
                time=0;
}
void IntConfiguration()
{
        IT0=1;
        EX0=1;
        PX0=0;
        IT1=1;
        EX1=1;
        PX1=1;
        EA=1;
}

int main(void)
{
        IntConfiguration();
       
                if(K4==0){
        sys_int();
        Timer0Int();
        while(1)
        {
           scanKey();
                       
                                }
                                }       
if(K5==0){                               
                tlc0832_init();
        timer0_init();
       
}
                       
                        }                       



仿真圖:


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:332444 發(fā)表于 2019-6-13 16:15 | 只看該作者
主函數(shù)加:bit k;然后判斷K4按下K=1,K5按下K=0,然后判斷K去執(zhí)行不同的模塊,你那樣寫肯定是不行的,除非你按鍵一直按下不動。
  1. int main(void)
  2. {
  3. bit k;         
  4. IntConfiguration();
  5.          
  6. if(K4==0)k=1;
  7. if(K5==0)k=0;  
  8.          while(1)
  9.          {
  10.             scanKey();
  11.                          if(k){         sys_int();         Timer0Int();}
  12. else{                 tlc0832_init();         timer0_init();}
  13.                                  }
  14.                                        
  15.          

  16.          
  17.                         
  18.                          }  
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:158375 發(fā)表于 2019-6-13 16:39 | 只看該作者
說說你想要做什么?
回復(fù)

使用道具 舉報(bào)

地板
ID:561156 發(fā)表于 2019-6-13 21:35 | 只看該作者
笨笨兔 發(fā)表于 2019-6-13 16:39
說說你想要做什么?

我的單片機(jī)外部中斷接了兩個(gè)按鍵,我想通過按下上面的按鍵執(zhí)行ad轉(zhuǎn)換的中斷,按下下面的按鍵執(zhí)行da轉(zhuǎn)換的中斷
回復(fù)

使用道具 舉報(bào)

5#
ID:158375 發(fā)表于 2019-6-14 12:56 | 只看該作者
你設(shè)3個(gè)標(biāo)志位:KEY_FLAG,AD_FLAG.DA_FLAG,有標(biāo)志是執(zhí)行,無標(biāo)志時(shí)不執(zhí)行。
按鍵確認(rèn)后,根據(jù)鍵值來規(guī)定設(shè)定AD_FLAG = 1 或 0,DA_FLAG相同處理。你可以中段允許、禁止或者用程序來控制

沒看你程序,只是給你個(gè)思路。
回復(fù)

使用道具 舉報(bào)

6#
ID:561156 發(fā)表于 2019-6-14 22:22 | 只看該作者
笨笨兔 發(fā)表于 2019-6-14 12:56
你設(shè)3個(gè)標(biāo)志位:KEY_FLAG,AD_FLAG.DA_FLAG,有標(biāo)志是執(zhí)行,無標(biāo)志時(shí)不執(zhí)行。
按鍵確認(rèn)后,根據(jù)鍵值來規(guī)定設(shè) ...

好的,謝謝。我去試試
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 手机av在线 | 国产精品久久久久一区二区三区 | 日韩av第一页 | 久久av一区二区三区 | 国产高清在线精品一区二区三区 | 91中文字幕在线 | 国产精品精品视频一区二区三区 | 国外激情av| 色av一区二区三区 | 国产一区影院 | 久久久久国产精品 | 久久久久一区二区三区四区 | 欧美日韩亚洲一区 | 国产第一亚洲 | 日韩av免费看 | 亚洲精品黄色 | 天天影视网天天综合色在线播放 | www.午夜| 国产精品久久久久久久久久久久午夜片 | 天天草草草 | 亚洲人在线观看视频 | 国产在线一区二区三区 | 欧美亚洲视频 | 欧美一区二区在线播放 | 在线免费观看成年人视频 | 香蕉久久久 | 中文字幕在线观看成人 | 99re在线视频 | 日韩免费在线观看视频 | 影音先锋欧美资源 | 草草视频在线观看 | 亚洲久草视频 | 精品国产一二三区 | 中文字幕av免费 | 亚洲男人的天堂网站 | 国产精品欧美一区二区 | 久久精品一区 | 国产婷婷色综合av蜜臀av | 蜜月aⅴ免费一区二区三区 99re在线视频 | 亚洲www | 欧洲妇女成人淫片aaa视频 |