欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4981|回復: 8
收起左側(cè)

利用單片機T1產(chǎn)生定時時鐘,控制8個LED循環(huán)點亮,閃動頻率為10次/s

[復制鏈接]
ID:630579 發(fā)表于 2019-10-28 19:44 | 顯示全部樓層 |閱讀模式
30黑幣
我不是很理解T1中斷服務函數(shù)處的代碼,整個代碼是這樣的:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit LSA=P1^5;                  //LED位選譯碼地址引腳A
sbit LSB=P1^6;
sbit LSC=P1^7;

uchar tmp;           //臨時變量
uchar sec;
void main(void)
{
LSA=0;               
LSB=0;
LSC=0;
TMOD=0x01;          //設(shè)置定時器T0工作于方式1
EA=1;                 //全局中斷允許
ET1=1;
TR1=1;
TH1=-18432/256;  //定時器初值
TL1=-18432%256;
P0=0xfe;
tmp=P0;
while(1);                 //循環(huán)
}
void Timer1(void) interrupt 3
{   
TH1=-18432/256;
TL1=-18432%256;
sec++;               
if(sec==2)
{
  sec=0;
  tmp=_crol_(tmp,1);  //循環(huán)左移一位
  P0=tmp;
}
}

整個代碼是這樣,但是if(sec==2)不理解,是怎么實現(xiàn)10次/s的。求大佬解答!

最佳答案

查看完整內(nèi)容

代碼有問題,sec就沒有賦初值。如果if(sec==2)是正確的,那么代表定時器T1是一個50ms的定時器,剛好2次進入中斷處理函數(shù)void Timer1(void)后,耗時是100ms,也就是10次/s。 但是假設(shè)是11.0592MHz的晶振,一個機器周期=1/11.0592/12=1.08507us 20*1000/1.08507=18432,也就是定時器T1是20毫秒的。所以應該是 if(sec==5) 另外這條語句也要改下: uchar sec; uchar sec = 0;
回復

使用道具 舉報

ID:631729 發(fā)表于 2019-10-28 19:44 | 顯示全部樓層
代碼有問題,sec就沒有賦初值。如果if(sec==2)是正確的,那么代表定時器T1是一個50ms的定時器,剛好2次進入中斷處理函數(shù)void Timer1(void)后,耗時是100ms,也就是10次/s。

但是假設(shè)是11.0592MHz的晶振,一個機器周期=1/11.0592/12=1.08507us
20*1000/1.08507=18432,也就是定時器T1是20毫秒的。所以應該是

if(sec==5)

另外這條語句也要改下:
uchar sec;
uchar sec = 0;
回復

使用道具 舉報

ID:631355 發(fā)表于 2019-10-28 22:11 | 顯示全部樓層
每10ms中斷一次TL1=(65536-10000)%256;//每10ms中斷一次ET1=1;EA=1;TR1=1;}2.中斷程序:voidTimer1()interrupt3{TH1=(65536-10000)/256;TL1=(65536-10000)%256;if(++count>10)//每次中斷count計數(shù)一次,當計數(shù)到10,說明100ms到{count=0;P1=_corl_(num,1);}}
回復

使用道具 舉報

ID:631355 發(fā)表于 2019-10-28 22:14 | 顯示全部樓層
if(sec==2)%為求余運算符,例如i%j用來求i除以j的余數(shù)。特別地,當使用i%j==0時,用來判斷i是否能被j整除(余數(shù)為0表示被除數(shù)能被除數(shù)整除)。對于你的問題,結(jié)合條件語句if,則表示“如果i能被2整除”。

評分

參與人數(shù) 1黑幣 +12 收起 理由
一個杰 + 12 贊一個!

查看全部評分

回復

使用道具 舉報

ID:411550 發(fā)表于 2019-10-28 23:11 | 顯示全部樓層
sec==2就是你定時器設(shè)定時間再乘上二

評分

參與人數(shù) 1黑幣 +12 收起 理由
一個杰 + 12 贊一個!

查看全部評分

回復

使用道具 舉報

ID:235200 發(fā)表于 2019-10-28 23:32 | 顯示全部樓層
要達到每秒10次,即每100ms切換1位LED,用TH1=-18432/256;TL1=-18432%256;定時50ms(不能直接定時100ms),所以計數(shù)2次達100ms
回復

使用道具 舉報

ID:213173 發(fā)表于 2019-10-29 08:09 | 顯示全部樓層
void Timer1(void) interrupt 3
{   
        TH1=-18432/256;//等同(65536-18432)/256; 11.0592MHz,定時20ms
        TL1=-18432%256;
        sec++;               
        if(sec==2)//測試等于符號==,與賦值符號=性質(zhì)不同,測試sec是否為2
        {
          sec=0;
          tmp=_crol_(tmp,1);  //40ms循環(huán)左移一位
          P0=tmp;
        }
}

評分

參與人數(shù) 1黑幣 +12 收起 理由
一個杰 + 12 贊一個!

查看全部評分

回復

使用道具 舉報

ID:332444 發(fā)表于 2019-10-29 08:49 | 顯示全部樓層
每秒頻閃10次=1000/10=100毫秒,計算中斷賦值,用累計的算式,如果累計到2,那么這個中斷賦值應該是50毫秒,如果不是50毫秒調(diào)整到50毫秒即可.

評分

參與人數(shù) 1黑幣 +12 收起 理由
一個杰 + 12 贊一個!

查看全部評分

回復

使用道具 舉報

ID:630579 發(fā)表于 2019-11-3 20:01 | 顯示全部樓層
csmyldl 發(fā)表于 2019-10-28 23:32
要達到每秒10次,即每100ms切換1位LED,用TH1=-18432/256;TL1=-18432%256;定時50ms(不能直接定時100ms),所以 ...

-18432設(shè)置的好像是20ms的
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表