VC单片机的C语言程序设计宋.ppt
文本预览下载声明
10.6.4 C51库函数 标准库函数按功能不同写在各种头文件中,使用时只要在程序最前面用#include预处理语句予以说明相应的头文件即可。 C51常用头文件简介 头文件名 说 明 reg51.h 51单片机的特殊寄存器 reg52.h 52单片机的特殊寄存器 stdio.h 标准输入和输出程序 math.h 数学程序 absacc.h 允许直接访问8051不同存储区的宏定义 string.h 字符串操作程序、缓冲区操作程序 10.7 C51编程实例10.7.1 中断服务函数编程 中断函数编程的完整形式如下: 函数返回值 函数名(参数)[编译模式] [重入] [interrupt n] [using m] 编译模式为SMALL、COMPACT或LARGE,用来指定参数和变量的存储空间。 重入:用于定义可重入函数。 interrupt n 用于定义中断函数,n为中断号,取值范围为0-31,单片机系统中不同的中断号都有固定的程序入口地址。 using m 用于确定中断服务函数所使用的寄存器组,m的取值范围为0-3 常用中断源的中断号和入口地址 中断号 中断源 中断向量 0 外部中断 0 0003H 1 定时器/计数器 0 000BH 2 外部中断 1 0013H 3 定时器/计数器 1 001BH 4 串行口 0023H 在编写C51的中断函数时,注意几个问题: 1.中断函数没有返回值,因此它必须是一个void类型的函数; 2.中断函数不允许利用形式参数进行数据传递,只能利用寄存器实现; 3.不允许直接调用中断函数; 4.中断函数对压栈和出栈的处理由编译器完成,无需人工管理; 5.需要严格注意using m的使用,必须确保寄存器组的正确切换; 6.进入中断函数时,SFR中的A,B,DPH,DPL和PSW都需要入栈; 7.函数退出前,所有的寄存器内容要出栈; 8.函数由8051的特定中断返回指令“RETI”终止。 例:设单片机的晶振频率为12MHz,要求在P1.0引脚上输出周期为2ms的方波。 解:周期为2ms的方波要求定时的间隔1ms,定时时间到则P1.0取反。定时器计数频率=晶振频率/12=1MHz。计数周期=1/计数频率=1us。1ms=l000us,故计算器要计数1000次。考虑到计数器工作时是向上计数,所以必须给定时器赋初值为65536-1000。 (1)用定时器0的方式1编程,采用查询方式。 #include reg51.h sbit P1_0=P1^0; void main() { TMOD=0x01 /*设置定时器0的工作方式为1*/ TR0=1; /*开启T/C0*/ For(;;) { TH0=(65536-1000)/256); /*装载计值*/ TL0=(65536-1000)%256); do { } while (!TF0); /*查询等待TF0置位 (计数溢出时TF置1)*/ P1_0=!P1_0 ; /*时间到P1.0取反*/ TF0=0 ; /*软件清TF0*/ } } (2)用定时器0的方式1编程,采用中断方式。 # include reg51.h sbit P1_0=P1^0 ; 定义T/C中断函数*/ void time0(void) interrupt 1 using 1 { P1_0=!P1_0 ; /* P1.0取反*/ /*装载计数初值*/ TH0=((65536-1000)/256); TL0=((65536-1000)%256); } void main(void) { /*设置定时器0的工作方式为1*/ TMOD=0x01; /*装载计数初值*/ TH0=(65536-1000)/256); TL0=(65536-1000)%256); EA=1 ; /*开启总中断*/ ET0=1 ;/*开启T/C0中断*/ TR0=1 ;/*启动T/C0定时*/ while (1) ;
显示全部