当前位置:编程学习 > C/C++ >>

单片机定时器T0100ms定时中断,怎么用C语言实现

要给出计算过程啊
答案:
#define _1231_C_
#include "reg51.h"
#include "1231.h"


//sbit OE=P2^3;

unsigned int SystemTime;


void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑
{

TH0 = 0xdb;
TL0 = 0xff;
// TF0 = 0;

SystemTime++;
}


void main()
{

TMOD &= 0xF0;
TMOD |= 0x01; //TMOD的值表示定时器工作方式选择

TH0 = 0xdb; //写入初始值,初始值可以决定定时多久
TL0 = 0xff;
//根据下文的木桶比喻的话,如果TH0 = 0x00;TL0 = 0x00;则表示从桶底开始装水。
//TH0 = 0xdb;TL0 = 0xff;可以这样子理解相当于木桶里已经有部分液铅在里面,
//TH0和TL0这个两个值表示木桶里液铅的高度,即此时桶里只能从液铅的高度以上开始装水,
//TH0 = 0xff;TL0 = 0xff;即表示桶的最高位置.

TF0 = 0; //计数到时TF0为1,即当TH0 = 0xff;TL0 = 0xff;再运行一步TF0 = 1;
TR0 = 1; //开始计数,从这时起,每运行一步TH0和TL0都会增加,直到TH0 = 0xff;TL0 = 0xff;
//相当于开水龙头,如TR0=0则TH0和TL0不变

ET0 = 1; //允许定时器0中断
EA=1; //开总中断

//下面是个死循环,程序里每运行一步TH0和TL0都会增加,当增加到TH0 = 0xff;TL0 = 0xff;
//单片机会从死循环里退出,去执行中断部分的代码,即开始运行void timer0(void) interrupt 1 using 3{}
//运行完中断部分的代码后,接着继续执行死循环里的代码。
//注意:当TH0 = 0xff;TL0 = 0xff;再运行,TF0并没有从0变为1,个人猜测TF0=1;时触发了中断,并重新被置零。
//如把ET0 = 1;和EA=1;注释掉,当TH0 = 0xff;TL0 = 0xff;再运行,TF0会变为1,此时不会再执行中断部分代码。

while(1)
{
if ((SystemTime%100)<50) //SystemTime除以100,余数小于50为真
{
//这两行不用管,就当做是功能1
P0=0xf1;
P2=0xf0;

}
else
{
//这两行不用管,就当做是功能2
P0=0x00;
P2=0xf0;

}


};



}


释疑:void Timer0() interrupt 1 using 1



Timer0 是函数名,随便取的

interrupt xx using y

跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中

0 外部中断0

1 定时器0

2 外部中断1

3 定时器1

4 串行中断

上一个:可以编一个计算器的c语言程序给我吗
下一个:恺撒密码C语言加密解密程序 不要C++ VB BC 的

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,