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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1450|回復: 12
收起左側

利用pic16f676單片機定時器控制RA0端口發光二極管閃爍,請大佬幫我看看哪里問題

[復制鏈接]
ID:1107532 發表于 2024-1-2 11:09 | 顯示全部樓層 |閱讀模式
利用pic16f676單片機定時器控制RA0端口發光二極管閃爍,開始一段時間不亮,然后一直亮,無法閃爍,改了很多次,不知道是不是中斷設置問題。拜托大佬幫我看看!
# include <xc.h>
#pragma config FOSC = INTRCIO  
#pragma config WDTE = OFF   
#pragma config PWRTE = ON      
#pragma config MCLRE = OFF   
#pragma config BOREN = OFF      
#pragma config CP = OFF        
#pragma config CPD = OFF      

#define uchar unsigned char
#define uint unsigned int

uint intnum;

void init()  //定時器初始化設置
{   
    //T0CS=0;   //Timer0使用內部時鐘             OPTION_REG - 選擇寄存器
    //PSA=1;   //將預分頻器給看門狗WDT           OPTION_REG -選擇寄存器
    //PS0=1;
    //PS1=1;
    //PS2=0;
    //TMR0=0x00; //定時器
    //T0IF=1;  //Timer0 啟動控制位使能(0關閉)(標志位)    INTCON - 中斷控制寄存器
    //T0IE=1;  //Timer0中斷開啟(使能位)                   INTCON - 中斷控制寄存器
    //WDTE=1;

    TMR1CS=0;   //Timer1使用內部時鐘           Timer1 控制寄存器
    T1CKPS0=1;  //1:8倍預分頻比                Timer1 控制寄存器      T1CKPS1:T1CKPS0:11=1:8倍預分頻比
    T1CKPS1=1;  //1:8倍預分頻比                Timer1 控制寄存器
    //TMR1H=(65536-(50000/3))/256; //初始化TMR1的高八位初始值
    //TMR1L=(65536-(50000/3))%256; //初始化TMR1的低八位初始值
    TMR1H=0x0B;  //高八位置初始值    00001011
    TMR1L=0xE9;  //低八位置初始值    11101001
    TMR1ON=1;  //Timer1 啟動控制位使能(0關閉)       Timer1 控制寄存器
    TMR1IF=0;  //中斷標志位清零                      外設中斷標志寄存器 1
    TMR1IE=1;  //Timer1中斷開啟                      外設中斷使能寄存器 1
    PEIE=1;  //外部中斷開啟                          INTCON - 中斷控制寄存器
    GIE=1;  //全局中斷開啟                           INTCON - 中斷控制寄存器
}


void main ()
{
    TRISA=0b00110100;  //RA2,RA4,RA5為輸入,其他輸出
    TRISC=0b00010011;  //RC0、RC1、RC4為輸入,其他輸出
    PORTA=0b00000000;  //RA口輸出低電平
    PORTC=0b00000000;  //RC口輸出低電平   
    init();
    while(1)
    {
       /* if (intnum ==20) //中斷溢出計數達到20次  20*50ms=1秒亮一次
        {
            intnum = 0;  //溢出次數清零
            RA0 = !RA0;  //RA0端口取反為1,鏈接RA0端口的發光二極管形成電勢差發亮
        }*/
    }
}

void interrupt ISR()
{
    if (TMR1IF == 1)
    {
        TMR1IF=0;  //中斷標志溢出清0
        //TMR1H=(65536-(50000/3))/256; //初始化TMR1的高八位初始值
        //TMR1L=(65536-(50000/3))%256; //初始化TMR1的低八位初始值
        TMR1H=0x0B;  //高八位置初始值    00001011
        TMR1L=0xE9;  //低八位置初始值    11101001
        intnum++;

        if (intnum==173)
        {
            intnum = 0;
            RA0 = !RA0;
        }
    }
}
回復

使用道具 舉報

ID:607298 發表于 2024-1-2 14:57 | 顯示全部樓層
剛開始要一步步來。
首先要配置RA0,確定輸出高低電平可控。
大概看下程序,RA0模擬通道AN0,CIN+沒有關閉,RA0應該無法高低電平輸出。
然后再確認計時中斷正常觸發。

有硬件調試工具的話,你可以打斷點,查看相關寄存器和變量,來解決問題。
沒有話,建議你使用proteus軟件模擬仿真運行程序。
回復

使用道具 舉報

ID:1107532 發表于 2024-1-3 09:30 | 顯示全部樓層
lightday 發表于 2024-1-2 14:57
剛開始要一步步來。
首先要配置RA0,確定輸出高低電平可控。
大概看下程序,RA0模擬通道AN0,CIN+沒有關 ...

大佬,我就是檢測出好像沒有循環中斷,請問一下CIN+沒有關閉是什么啊,我是剛剛入行的小白,有點不懂
回復

使用道具 舉報

ID:1107532 發表于 2024-1-3 09:32 | 顯示全部樓層
lightday 發表于 2024-1-2 14:57
剛開始要一步步來。
首先要配置RA0,確定輸出高低電平可控。
大概看下程序,RA0模擬通道AN0,CIN+沒有關 ...

請問CIN+是要對RA0進行A/D模擬轉換嗎
回復

使用道具 舉報

ID:1093268 發表于 2024-1-4 10:39 | 顯示全部樓層
ANSEL &= 0xFE;
CMCON = 0x07;
IO初始化時,加這2句就好了。
回復

使用道具 舉報

ID:1107532 發表于 2024-1-4 13:42 | 顯示全部樓層
哦豁~ 發表于 2024-1-4 10:39
ANSEL &= 0xFE;
CMCON = 0x07;
IO初始化時,加這2句就好了。

大佬,我加上去后,還是無法實現
回復

使用道具 舉報

ID:1107532 發表于 2024-1-4 14:02 | 顯示全部樓層
哦豁~ 發表于 2024-1-4 10:39
ANSEL &= 0xFE;
CMCON = 0x07;
IO初始化時,加這2句就好了。

可以實現了,非常感謝大佬,那個取反的語句一直沒有執行,是因為CIN+沒有關閉
回復

使用道具 舉報

ID:1107532 發表于 2024-1-4 14:38 | 顯示全部樓層
哦豁~ 發表于 2024-1-4 10:39
ANSEL &= 0xFE;
CMCON = 0x07;
IO初始化時,加這2句就好了。

另外我請問一下那個高低電平初始值的計算和51單片機是一樣的嗎,我在網上看見好幾種算法,以4MHZ晶振頻率,1:8預分配為例子。
第一種是:時鐘周期為0.25us,指令周期為0.25*4=1us,經過預分頻1:8后,指令周期變為8us,TMR1IF溢出為1時需要通過低八位8us*256=2048us,通過高八位2048us*256=524288us,定時器需要524288us溢出,設定0.5s溢出:524288-500000=24288us,指令周期x預分頻比=預分頻器溢出的周期:1usX8=8us,初始值的時間/預分頻器溢出的周期=初始值 :24288us/8us=3036,將其轉換為十六進制為0x0BDC;
第二種是:從0加滿需要65536個機器周期,每個機器周期等于12個時鐘周期,4M晶振每個機器周期為0.25us,每加一個數的機器周期為12*0.25=3us,中斷一次耗時50ms,中斷20次為1s,50ms的初值計算為:中斷值 =(65536-初值)*機器周期,初值=(65536-(50000/3);
不知道哪種算法是對的,第一個的初值網上很少是524288,幾乎都是65536;第二個的機器周期等于12個時鐘周期不知道這個是以什么為例子,pic單片機是不是機器周期都是等于4個時鐘周期?而且第二種1:8分頻好像也沒有用到。希望大佬能解惑!!!
回復

使用道具 舉報

ID:883242 發表于 2024-1-4 15:18 | 顯示全部樓層
1148794250 發表于 2024-1-4 14:38
另外我請問一下那個高低電平初始值的計算和51單片機是一樣的嗎,我在網上看見好幾種算法,以4MHZ晶振頻率 ...

這個就不用解惑了吧,你自己用示波器測一下不就知道了嗎?如果沒有示波器,數LED閃爍個數對比鬧鐘秒針運動總會吧?
回復

使用道具 舉報

ID:1107532 發表于 2024-1-4 15:55 | 顯示全部樓層
Hephaestus 發表于 2024-1-4 15:18
這個就不用解惑了吧,你自己用示波器測一下不就知道了嗎?如果沒有示波器,數LED閃爍個數對比鬧鐘秒針運 ...

好的,非常感謝!!!
回復

使用道具 舉報

ID:1093268 發表于 2024-1-4 18:14 | 顯示全部樓層
1148794250 發表于 2024-1-4 14:38
另外我請問一下那個高低電平初始值的計算和51單片機是一樣的嗎,我在網上看見好幾種算法,以4MHZ晶振頻率 ...

1. PIC16F676的內部RC振蕩器FOSC頻率是4MHz;
2. 當Timer1的時鐘源是內部時鐘(FOSC/4)時,即TMR1CS=1。Timer1的時鐘源頻率就是4MHz/4=1MHz;
3. 所以Timer1自增1的時間是:(1/1MHz) * Timer1預分頻比 = 1uS * Timer1預分頻比
4. Timer1的中斷機制是:溢出中斷,也及時TMR1H:TMR1L增加到65535后再加1,就觸發中斷.
5. 所以Timer1中斷時間= 1uS * Timer1預分頻比 * (65535 - Timer1初值)。比如要100mS中斷一次,可以設置分頻比是1:8,初值是53035(0xCF2B),也就是TMR1H=0xCF,TIMR1L=0x2B。
1uS * 8 * (65535 - 53035) = 100000uS = 100mS
PS:PIC16F676的機器周期是4T,并且Timer1的時鐘源實際是指令時鐘,因此就會有上面的FOSC/4。

評分

參與人數 1黑幣 +70 收起 理由
admin + 70 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:1107532 發表于 2024-1-5 08:27 | 顯示全部樓層
哦豁~ 發表于 2024-1-4 18:14
1. PIC16F676的內部RC振蕩器FOSC頻率是4MHz;
2. 當Timer1的時鐘源是內部時鐘(FOSC/4)時,即TMR1CS=1。Ti ...

感謝!!!
回復

使用道具 舉報

ID:1049963 發表于 2024-5-21 13:15 | 顯示全部樓層
哦豁~ 發表于 2024-1-4 18:14
1. PIC16F676的內部RC振蕩器FOSC頻率是4MHz;
2. 當Timer1的時鐘源是內部時鐘(FOSC/4)時,即TMR1CS=1。Ti ...

天才解釋,比書上通俗易懂多了,感謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久妇女国产精品影视 | 免费黄色录像视频 | 日本天堂视频在线观看 | 婷婷99| 久久九九99 | 欧美日韩一卡 | 欧美日韩在线国产 | 超碰人人插 | 亚洲三区视频 | 国产区一区二区三区 | 欧美亚洲免费 | 中国免费黄色片 | 免费看国产一级特黄aaaa大片 | 在线观看深夜视频 | 日本大片在线播放 | 日韩欧美三区 | 亚洲欧美国产精品一区二区 | 男人天堂av网站 | 羞羞视频网站免费观看 | 金莲网 | 免费精品在线视频 | 国产成人精品一区 | 丁香久久| 亚洲综合大片69999 | 黄色免费av | 在线视频一区二区三区 | 91xh98hx 在线 国产 | 精品国产青草久久久久96 | 日韩精品 电影一区 亚洲 | 久久久久久久久久久91 | 免费视频一区 | 欧亚av在线| 91在线导航 | 久久久国产精品入口麻豆 | 国产一区二区三区不卡av | 91在线综合 | 成人一区二区三区 | 精品国产18久久久久久二百 | 欧美在线a| 国产高潮好爽受不了了夜色 | 午夜一区二区三区视频 |