第七章内部资源C编程_第1页
第七章内部资源C编程_第2页
第七章内部资源C编程_第3页
第七章内部资源C编程_第4页
第七章内部资源C编程_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章内部资源第七章内部资源C编程编程一、中断应用的一、中断应用的C C语言编程语言编程 C51 C51编译器支持在编译器支持在C C源程序中直接开发中断程序。中断服务源程序中直接开发中断程序。中断服务程序是通过按规定语法格式定义的一个函数。程序是通过按规定语法格式定义的一个函数。 中断服务程序的函数定义的语法格式如下:中断服务程序的函数定义的语法格式如下: 返回值返回值 函数名函数名(参数参数) ) 模式模式重入重入 interrupt m using n interrupt m using n nterrupt m nterrupt m 其中其中m m是中断号是中断号(0(0到到31)31

2、),中断号告诉编译器中,中断号告诉编译器中断程序的入口地址,中断号对应着断程序的入口地址,中断号对应着IEIE寄存器中的使能位。寄存器中的使能位。下表给出了对应关系下表给出了对应关系 IE 寄存器中的使能位和寄存器中的使能位和C 中的中断号中的中断号中断源中断源入口地址入口地址0 外部中断外部中断00003H1 定时器定时器0 溢出溢出000BH2 外部中断外部中断10013H 3 定时器定时器1 溢出溢出001BH4 串行口中断串行口中断0023H5 定时器定时器2 溢出溢出002BH 在进入中断服务程序前的程序中使用一组工作寄存器,进在进入中断服务程序前的程序中使用一组工作寄存器,进入中断

3、服务程序后,由入中断服务程序后,由“using n”切换到另一组寄存器,中断返切换到另一组寄存器,中断返回后又恢复到原寄存器组。这样互相切换的两组寄存器中的内回后又恢复到原寄存器组。这样互相切换的两组寄存器中的内容彼此都没有被破坏。容彼此都没有被破坏。 为中断程序指定工作寄存器组的缺点是为中断程序指定工作寄存器组的缺点是:所有被中断调用的所有被中断调用的过程都必须使用同一个寄存器组过程都必须使用同一个寄存器组,否则参数传递会发生错误。否则参数传递会发生错误。 中断不允许用于外部函数,它对函数目标代码影响如下:中断不允许用于外部函数,它对函数目标代码影响如下: 当调用函数时,当调用函数时,SFR

4、中的中的ACC,B,DPH,DPL和和PSW入入栈。如果不使用寄存器组切换,则甚至中断函数所需要的所有栈。如果不使用寄存器组切换,则甚至中断函数所需要的所有工作寄存器都入栈。工作寄存器都入栈。 函数退出前,所有的寄存器内容出栈;函数退出前,所有的寄存器内容出栈; 函数由函数由8051的指令的指令RETI终止。终止。 例:如图所示是利用优先权解码芯片,在单片机例:如图所示是利用优先权解码芯片,在单片机80318031的一的一个外部中断个外部中断INT1INT1上扩展多个中断源的原理电路图。图中是以开上扩展多个中断源的原理电路图。图中是以开关闭合来模拟中断请求信号。当有任一中断源产生中断请求,关闭

5、合来模拟中断请求信号。当有任一中断源产生中断请求,能给能给80318031的的INT1INT1引脚送一个有效中断信号,由引脚送一个有效中断信号,由P1P1的低的低3 3位可得对位可得对应中断源的中断号。多个中断源的处理。应中断源的中断号。多个中断源的处理。 在中断服务程序中仅设置标志,并保存在中断服务程序中仅设置标志,并保存I/OI/O口输入状态。口输入状态。 C51C51编译器提供定义特定编译器提供定义特定80C5180C51系列成员的寄存器头文件。系列成员的寄存器头文件。 80C5180C51头文件为头文件为reg51.hreg51.h。 C51C51程序如下:程序如下:主程序主程序初始化

6、INT1清标志清标志处理处理标志设置?标志设置?YN返返回回设置标志设置标志存状态存状态外中断外中断1 # include unsigned char status; bit flag; void service_int1( ) interrupt 2 using 2 /* INT1中断服务程序,用第中断服务程序,用第2组工作寄存器组工作寄存器 */ flag=1; /* 设置标志设置标志 */ status=p1; /* 存输入口状态存输入口状态 */ void main(void) IP=0 x04 ; /* 置置INT1为高优先级中断为高优先级中断 */ IE=0 x84 ; /* IN

7、T1开中断,开中断,CPU开中断开中断 */ for(; ;) if(flag) /* 有中断有中断 */ switch(status) /* 根据中断源分支根据中断源分支 */ case 0 : break ; /* 处理处理IN0 */ case 1 : break ; /* 处理处理IN1 */ case 2 : break; /* 处理处理IN2 */ case 3 : break; /* 处理处理IN3 */ default : ; flag=0 ; /* 处理完成清标志处理完成清标志 */ 例例1 1:在:在XTALXTAL频率是频率是12MHZ12MHZ的标准的标准8051805

8、1器件上,用器件上,用TIME1TIME1(定(定时器时器/ /计数器计数器1 1)产生)产生10KHz10KHz定时器滴答中断。定时器滴答中断。 分析:采用分析:采用TIME1TIME1的工作模式的工作模式2 2,则:,则: TMOD=20HTMOD=20H, 机器周期机器周期=12/fosc=12/fosc=,T=1/10KHZ= 100 s T=1/10KHZ= 100 s (256 -256 -次数)次数)* *1 s=100 s 1 s=100 s TH1=TL1=256-100 TH1=TL1=256-100 采用中断方式:采用中断方式:EA=1EA=1,ET1=1ET1=1二、定

9、时器二、定时器/ /计数器应用的计数器应用的C C语言编程语言编程#include #include static unsigned long overflowcount=0;static unsigned long overflowcount=0;void time1(void) interrupt 3 void time1(void) interrupt 3 overflowcount+; / overflowcount+; /溢出计数器加溢出计数器加1 1 void main(void) void main(void) TMOD=(TMOD&0 x0F)|0 x20; TMOD=

10、(TMOD&0 x0F)|0 x20; TH1=256-100; TH1=256-100; TL1=TH1; TL1=TH1; ET1=1; ET1=1; EA=1;TR1=1; EA=1;TR1=1; while(1); while(1); (1) (1) 用定时器用定时器0 0的方式的方式1 1编程,采用查询方式,程序如下:编程,采用查询方式,程序如下: #include #include sbit P1_0=P10 sbit P1_0=P10 ; void main(void)void main(void) TMOD=0 x01 TMOD=0 x01 ; / /* * 设置定时器

11、设置定时器1 1为控制方式为控制方式1 1* */ / TR0=1 TR0=1 ; / /* * 启动启动 T/C0 T/C0 * */ / for( for( ; ;) ) TH0= ( TH0= ( -1000 ) /256 -1000 ) /256 ; / /* * 装载计数器初值装载计数器初值 * */ / TL0= ( TL0= ( -1000 ) %256 -1000 ) %256 ; do while (!TF0) do while (!TF0) ; / /* * 查询等待查询等待TF0TF0置位置位 * */ / P1_0=!P1_0 P1_0=!P1_0; / /* * 定时

12、时间到定时时间到P1.0P1.0反相反相 * */ / TF0=0 TF0=0; / /* * 软件清软件清 TF0 TF0 * */ / (2) (2) 用定时器用定时器0 0的方式的方式1 1编程,采用中断方式。程序如下:编程,采用中断方式。程序如下: #include #include sbit P1_0=P10 sbit P1_0=P10 ; void time (void) interrupt 1 using 1 void time (void) interrupt 1 using 1 P1_0=!P1_0 P1_0=!P1_0 ; / /* * P1.0 P1.0取反取反 * */

13、 / TH0= ( TH0= ( -1000 ) /256 -1000 ) /256 ; * * 重新装载计数初值重新装载计数初值 * */ / TL0= ( TL0= ( -1000 ) %256 -1000 ) %256 void main( void ) void main( void ) TMOD=0 x01 TMOD=0 x01 ; / /* * T/C0 T/C0工作在定时器非门控制方式工作在定时器非门控制方式1 1 * */ / P1_0=0 P1_0=0; TH0= (TH0= ( -1000 ) /256 -1000 ) /256 ; / /* * 预置计数初值预置计数初值

14、* */ / TL0= ( TL0= ( -1000 ) %256 -1000 ) %256 ; EA=1 EA=1 ; / /* * CPU CPU中断开放中断开放 * */ / ET0= 1 ET0= 1 ; / /* * T/C0 T/C0中断开放中断开放 * */ / TR0=1 TR0=1 ; / /* * 启动启动T/C0T/C0开始定时开始定时 * */ / do while(1) do while(1) ; / /* * 等待中断等待中断 * */ / 例例3:采用:采用10 MHz晶振,在晶振,在P1.0脚上输出周期为脚上输出周期为2.5 s,占空,占空比比20%的脉冲信号。

15、的脉冲信号。 分析:分析: 10 MHz晶振,使用定时器最大定时几十毫秒。取晶振,使用定时器最大定时几十毫秒。取10 ms定时,定时,周期周期2.5 s需需250次中断,占空比次中断,占空比20%,高电平应为,高电平应为50次中断。次中断。 10 ms定时,晶振定时,晶振fosc=10 MHz。 需定时器计数次数需定时器计数次数=1010310/12=8333# include # include # define uchar unsigned char# define uchar unsigned charuchar period=250uchar period=250;uchar high

16、=50uchar high=50;timer0( )interrupt 1 using 1 /timer0( )interrupt 1 using 1 /* * T/C0 T/C0中断服务程序中断服务程序 * */ / TH0= ( TH0= ( 8333 8333)/256 /256 ; / /* * 重置计数值重置计数值 * */ / TL0= ( TL0= ( 8333 8333)%256 %256 ; if(+time=high)P1=0; /* 高电平时间到变低高电平时间到变低 */ else if (time=period) /* 周期时间到变高周期时间到变高 */ time=0

17、; P1=1 ; main( )main( ) TMOD=0 x01 TMOD=0 x01 ; / /* * 定时器定时器0 0方式方式1 1 * */ / TH0= ( TH0= ( 8333 8333) /256 /256 ; TL0= (TL0= ( 8333 8333) %256 %256 ; EA=1EA=1; / /* * 开开CPUCPU中断中断 * */ / ET0=1 ET0=1 ; / /* * 开开T/C0T/C0中断中断 * */ / TR0=1 TR0=1 ; / /* * 启动启动T/C0 T/C0 * */ / do while(1) do while(1) ;

18、TL1=0 xfd; TH1=TL1; TL1=0 xfd; TH1=TL1; SCON=0 xd8;PCON=0 x00; SCON=0 xd8;PCON=0 x00; TR1=1; TR1=1; while(1) while(1) i=0; i=0; while(trdatai!=0 x00) while(trdatai!=0 x00) SBUF= trdatai; SBUF= trdatai; while(TI=0); while(TI=0); TI=0; TI=0; i+; i+; for(j=0;j12500;j+); for(j=0;j12500;j+); 单片机串行口发送单片机串行口发送/ /接收程序,每接收到字节即刻发送出去;接收程序,每接收到字节即刻发送出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论