|
论坛的各位前辈,请求指点
我本人喜欢单片机,也是自学的,基础不好!学习单片机已经困在定时中断这里很久了,看了很多书,也不理解,心里实在是矛盾,请求有耐心的前辈指点一二
请各位前辈指点;
第一:这里对于中断我想弄清楚以下:
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的时候 应该是最大占空比了
但是如何去固定频率,去调整它的通段时间呢?这里是不是要用到两个定时器呀?
有那个前辈给个思路
谢谢大家!
|
|