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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4525|回復: 8
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:630579 發表于 2019-10-28 19:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
30黑幣
我不是很理解T1中斷服務函數處的代碼,整個代碼是這樣的:
#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;          //設置定時器T0工作于方式1
EA=1;                 //全局中斷允許
ET1=1;
TR1=1;
TH1=-18432/256;  //定時器初值
TL1=-18432%256;
P0=0xfe;
tmp=P0;
while(1);                 //循環
}
void Timer1(void) interrupt 3
{   
TH1=-18432/256;
TL1=-18432%256;
sec++;               
if(sec==2)
{
  sec=0;
  tmp=_crol_(tmp,1);  //循環左移一位
  P0=tmp;
}
}

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

最佳答案

查看完整內容

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

使用道具 舉報

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

但是假設是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 發表于 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計數一次,當計數到10,說明100ms到{count=0;P1=_corl_(num,1);}}
回復

使用道具 舉報

地板
ID:631355 發表于 2019-10-28 22:14 | 只看該作者
if(sec==2)%為求余運算符,例如i%j用來求i除以j的余數。特別地,當使用i%j==0時,用來判斷i是否能被j整除(余數為0表示被除數能被除數整除)。對于你的問題,結合條件語句if,則表示“如果i能被2整除”。

評分

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

查看全部評分

回復

使用道具 舉報

5#
ID:411550 發表于 2019-10-28 23:11 | 只看該作者
sec==2就是你定時器設定時間再乘上二

評分

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

查看全部評分

回復

使用道具 舉報

6#
ID:235200 發表于 2019-10-28 23:32 | 只看該作者
要達到每秒10次,即每100ms切換1位LED,用TH1=-18432/256;TL1=-18432%256;定時50ms(不能直接定時100ms),所以計數2次達100ms
回復

使用道具 舉報

7#
ID:213173 發表于 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)//測試等于符號==,與賦值符號=性質不同,測試sec是否為2
        {
          sec=0;
          tmp=_crol_(tmp,1);  //40ms循環左移一位
          P0=tmp;
        }
}

評分

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

查看全部評分

回復

使用道具 舉報

8#
ID:332444 發表于 2019-10-29 08:49 | 只看該作者
每秒頻閃10次=1000/10=100毫秒,計算中斷賦值,用累計的算式,如果累計到2,那么這個中斷賦值應該是50毫秒,如果不是50毫秒調整到50毫秒即可.

評分

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

查看全部評分

回復

使用道具 舉報

9#
ID:630579 發表于 2019-11-3 20:01 | 只看該作者
csmyldl 發表于 2019-10-28 23:32
要達到每秒10次,即每100ms切換1位LED,用TH1=-18432/256;TL1=-18432%256;定時50ms(不能直接定時100ms),所以 ...

-18432設置的好像是20ms的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲毛片在线 | 91正在播放 | 一区二区三区高清 | 日韩精品一区二区三区 | 国产精品久久久久久久久久久久 | 欧美最猛性xxxxx亚洲精品 | 久久99深爱久久99精品 | 日韩中文字幕在线不卡 | 午夜视频免费在线观看 | 久久精品国产99国产精品亚洲 | 亚洲一区在线免费观看 | 成人性视频免费网站 | 一区观看 | 国产福利免费视频 | 欧美成人a | 国产日产欧产精品精品推荐蛮挑 | 日韩网| 国产一区不卡 | 亚洲成人中文字幕 | 色999视频 | 韩国成人在线视频 | 精品久久久精品 | 日本电影韩国电影免费观看 | 日本欧美国产在线观看 | 欧美乱大交xxxxx另类电影 | 超碰在线人 | 欧美综合一区 | www.av7788.com | 欧美一级在线 | 天天干视频在线 | 亚洲视频一| 亚洲欧美一区二区三区情侣bbw | www.蜜桃av.com| 国产7777 | 天堂久久av | 天天爽天天干 | 国产中文字幕在线 | www.久| 国产精品欧美一区二区三区 | 日韩欧美国产成人一区二区 | 欧美日韩福利 |