|
論壇的各位前輩,請求指點
我本人喜歡單片機,也是自學的,基礎不好!學習單片機已經困在定時中斷這里很久了,看了很多書,也不理解,心里實在是矛盾,請求有耐心的前輩指點一二
請各位前輩指點;
第一:這里對于中斷我想弄清楚以下:
1.裝載初始值:例如我晶振為11.0592
機器周期=12/11.0592=1.085us 我需要讓它50ms中斷一次 50000/1.09=45872
初始值就是 TH0=(65536-45872)/256=應該是76 ,那么這個76,裝載到高八位是裝換成16進制嗎?還是二進制
TL0=(65536-45872)%256=應該是8125 這個裝載到低八位中 又是什么樣子的!可能問的問題都不對,大家別笑話,我看書上面講的比較籠統,不明白其中的意思!
2.所謂中斷溢出,書上就是說 TH0 和TL0 都滿后,那么如何才是 低八位滿后向高八位進1?不理解。也沒有老師教,自己之前也不是學這些課程的!
郭天祥老師里面的
void main()
{
TMOD=0X01;
TH0=(65536-45872)/256;//這個數得出來 76
TL0=(65536-45872)%256;//這個數得出來8125 就不不懂這個地方 所謂的高八位和低八位的概念
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(num==20)
{
num=0;
led=~led;
}
}
}
另外我自己寫了個小程序,就是按鍵 然后LED從第一個到最后一個一次點亮 按鍵1加 按鍵2減
里面也有個小問題,請前輩們看看
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
uchar num;
uchar num0;
void delayms(uint);
sbit key_jia=P3^4;
sbit key_jian=P3^5;
void led() //LED子函數
{
P1=table[num];
}
void keyscan()
{
if(key_jia==0)
{
delayms(10);
if(key_jia==0)
{
num++;
if(num==9) //如果這個地方是if(num==8)的話,當我按鍵到第8次的時候應該是全部亮吧,但是按第八次的時候全部滅了,只亮了前面7顆LED燈這個 //是為什么
num=0; //非得改成if(num==9)才行,按第八次的時候才會全部亮
while(!key_jian);//此處的while語句不要 加延時時間長一點是不是也一樣,一定要加這個釋放按鍵的語句嗎,如果不加的話一直按鍵LED是從一顆到全 //部亮,而加了則需要一次一次按鍵
delayms(200);
}
}
if(key_jian==0)
{
delayms(10);
if(key_jian==0)
{
if(num==0)
num=9;
num--;
while(!key_jian);
}
}
}
void main() //主函數
{
while(1)
{
keyscan();
led();
}
}
void delayms(uint xms)//延時函數
{
uint j,l;
for(j=xms;j>0;j--)
for(l=110;l>0;l--);
}
最后一個問題,我想做一個用定時器產生一個1KHZ的可調PWM波形
用兩個按鍵實現 0-100% 和100-0%的調整
我想了很久,因為上面的中斷沒有學會不理解,所以糾結了很久
我說下我的思路,請前輩指點一下
利用定時器的中斷 100us 為1KHZ的PWM波
應該來說當是100US的時候 應該是最大占空比了
但是如何去固定頻率,去調整它的通段時間呢?這里是不是要用到兩個定時器呀?
有那個前輩給個思路
謝謝大家!
|
|