答案:#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 的