目标:定时器中断实现led的取反
本节所要实现的功能是:系统运行时,D1小灯循环点亮1秒,熄灭1秒。
1.定时器/计数器使用方法
①对TMOD赋值,以确定T0和T1的工作方式。
②计算初值,并将其写入TH0、TL0或TH1、TL1。
③中断方式时,打开定时器中断(ET0/ET1)及总中断EA。
④使TR0或TR1置位,启动定时/计数器定时或计数
定时器/计数器初值计算:
假如要定时1ms,定时器初值是多少?
计数脉冲个数N=1ms/1us=1000个
定时器初值X=2^16-1000=65536-1000=64536=0XFC18
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P2^0; //led端口
void Timer0Init() //初始化T0
{
TMOD |= 0x01; //选择定时器0为模式1,这里用了个或运算,
//这样tmod高四位(控制T1)就与T0(0x01)没关系了,即TMOD在赋0x01后高四位不变
//这里不能直接给M0和M1赋值
TH0 = 0xfc;
TL0 = 0x18; //给定时器赋初值,定时1ms
ET0 = 1; //打开定时器0中断允许
EA = 1; //打开总中断
TR0 = 1; //打开定时器
}
void main()
{
Timer0Init(); //条件满足自动进入中断
while(1); //一直在中断里运行
}
void Timer0() interrupt 1
{
static u16 i;////static静态变量,保存i;若不加static,一旦子函数 退出后,该变量将丢失,加了,就会保持住,下次回来的时候,这个值依然存在。
TH0 = 0xfc;
TL0 = 0x18; //进入中断后,TF0会清0,所以要再赋一遍
i++;
if(i==1000){ //1000个1ms是1s
i = 0; //延时1s后清0,给下次做准备
led = ~led; //取反
}
}
静态变量 另有 2个特点:
1、只能进行一次初始化,也就是说 “static int p”这句话,只在第一次进来的时候执行,以后都是通过赋值语句(比如上面i++)修改该值;
2、该变量只在 本子函数 内 修改有效,其他函数 无法 调用、修改 该 变量。
可以记录函数调用了几次
1.static全局变量只初使化一次,防止在其他文件单元中被引用;
2.static局部变量只被初始化一次,下一次依据上一次结果值;
3.static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
C语言中讲讲static变量和static函数有什么作用
static关键字有两种意思,你看上下文来判断
1,表示变量是静态存储变量
表示变量存放在静态存储区.
2,表示该变量是内部连接 (这种情况是指该变量不在任何{}之内,就象全局变量那样,这时候加上static) ,也就是说在其它的.cpp文件中,该变量是不可见的(你不能用).
当static加在函数前面的时候
表示该函数是内部连接,之在本文件中有效,别的文件中不能应用该函数.
不加static的函数默认为是全局的.
也就是说在其他的.cpp中只要申明一下这个函数,就可以使用它.
1、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
答:全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
static函数与普通函数作用域不同。static函数仅在本文件中使用。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
2、如何引用一个已经定义过的全局变量?
答:extern
可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间 会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
答:可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。