《第二部分8051内部资源的C编程》由会员分享,可在线阅读,更多相关《第二部分8051内部资源的C编程(19页珍藏版)》请在金锄头文库上搜索。
1、课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计教学基本要求:教学基本要求:(1 1)、掌握中断应用的)、掌握中断应用的C C编程方法;编程方法;(2 2)、掌握定时器)、掌握定时器/ /计数器应用的计数器应用的C C编程方法;编程方法;(3 3)、熟悉串行口应用的)、熟悉串行口应用的C C编程编程方法;方法;教学重点:教学重点:(1 1)、中断应用的)、中断应用的C C编程;编程;(2 2)、定时器)、定时器/ /计数器应用的计数器应用的C C编程;编程;教学难点:教学难点:(1 1)、在)、在KeilKeil中如何调试各中断程序;中如何调试各
2、中断程序;第二部分第二部分 8051 8051内部资源的内部资源的C C编程编程课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计一、一、中断应用的中断应用的C C语言编程语言编程 C51 C51编译器支持在编译器支持在C C源程序中直接开发中断程序。中断服务源程序中直接开发中断程序。中断服务 程序是通过按规定语法格式定义的一个函数。程序是通过按规定语法格式定义的一个函数。 中断服务程序的函数定义的语法格式如下:中断服务程序的函数定义的语法格式如下: 返回值返回值 函数名函数名(参数参数) ) 模式模式重入重入 interrupt m using
3、n interrupt m using n interrupt m interrupt m 其中其中m m是中断号,中断号告诉编译器是中断号,中断号告诉编译器 中断程序的入口地址,中断号对应着中断程序的入口地址,中断号对应着IEIE寄存器中的使能位。寄存器中的使能位。课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计下表给出了对应关系下表给出了对应关系 IE 寄存器中的使能位和寄存器中的使能位和C 中的中断号中的中断号中断源中断源入口地址入口地址0 外部中断外部中断00003H1 定时器定时器0 溢出溢出000BH2 外部中断外部中断10013H
4、3 定时器定时器1 溢出溢出001BH4 串行口中断串行口中断0023H5 定时器定时器2 溢出溢出002BH课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计 在进入中断服务程序前的程序中使用一组工作寄存器,进在进入中断服务程序前的程序中使用一组工作寄存器,进入中断服务程序后,由入中断服务程序后,由“using n”切换到另一组寄存器,中断切换到另一组寄存器,中断返回后又恢复到原寄存器组。这样互相切换的两组寄存器中的返回后又恢复到原寄存器组。这样互相切换的两组寄存器中的内容彼此都没有被破坏。内容彼此都没有被破坏。 为中断程序指定工作寄存器组的缺点
5、是为中断程序指定工作寄存器组的缺点是:所有被中断调用的所有被中断调用的过程都必须使用同一个寄存器组过程都必须使用同一个寄存器组,否则参数传递会发生错误。否则参数传递会发生错误。 中断不允许用于外部函数,它对函数目标代码影响如下:中断不允许用于外部函数,它对函数目标代码影响如下: 当调用函数时,当调用函数时,SFR中的中的ACC,B,DPH,DPL和和PSW(当当需要时需要时)入栈。如果不使用寄存器组切换,则中断函数所需要的入栈。如果不使用寄存器组切换,则中断函数所需要的所有工作寄存器都入栈。所有工作寄存器都入栈。 函数退出前,所有的寄存器内容出栈;函数退出前,所有的寄存器内容出栈; 函数由函数
6、由8051的指令的指令RETI终止。终止。课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计 例:如图所示是利用优先权解码芯片,在单片机例:如图所示是利用优先权解码芯片,在单片机80318031的一的一个外部中断个外部中断INT1INT1上扩展多个中断源的原理电路图。图中是以开上扩展多个中断源的原理电路图。图中是以开关闭合来模拟中断请求信号。当有任一中断源产生中断请求,关闭合来模拟中断请求信号。当有任一中断源产生中断请求,能给能给80318031的的INT1INT1引脚送一个有效中断信号,由引脚送一个有效中断信号,由P1P1的低的低3 3位可得对位
7、可得对应中断源的中断号。多个中断源的处理。应中断源的中断号。多个中断源的处理。 在中断服务程序中仅设置标志,并保存在中断服务程序中仅设置标志,并保存I/OI/O口输入状态。口输入状态。 C51C51编译器提供定义特定编译器提供定义特定80C5180C51系列成员的寄存器头文件。系列成员的寄存器头文件。 80C51 80C51头文件为头文件为reg51.hreg51.h。 C51 C51程序如下:程序如下:课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计主程序主程序初始化INT1清标志清标志处理处理标志设置?标志设置?YN返回返回设置标志设置标志存
8、状态存状态外中断外中断1 # include unsigned char status; bit flag; void service_int1( ) interrupt 2 using 2 /* INT1中断服务程序,中断服务程序, 用第用第2组工作寄存器组工作寄存器 */ flag=1; /* 设置标志设置标志 */ status=p1; /* 存输入口状态存输入口状态 */ 课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计 void main(void) IP=0x04 ; /* 置置INT1为高优先级中断为高优先级中断 */ IE=0x8
9、4 ; /* INT1开中断,开中断,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 ; /* 处理完成清标志处理完成清标志 */ 课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程
10、序设计语言应用程序设计 例例1 1:在:在XTALXTAL频率是频率是12MHZ12MHZ的标准的标准80518051器件上,用器件上,用TIME1TIME1(定(定时器时器/ /计数器计数器1 1)产生)产生10KHz10KHz定时器滴答中断。定时器滴答中断。 分析:采用分析:采用TIME1TIME1的工作模式的工作模式2 2,则:,则: TMOD=20H TMOD=20H, 机器周期机器周期=12/fosc= 1 s=12/fosc= 1 s ,T=1/10KHZ= 100 s T=1/10KHZ= 100 s (256 -256 -次数)次数)*1 s=100 s *1 s=100 s
11、TH1=TL1=256-100 TH1=TL1=256-100 采用中断方式:采用中断方式:EA=1EA=1,ET1=1ET1=1二、二、定时器定时器/ /计数器应用的计数器应用的C C语言编程语言编程课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计#include #include static unsigned long overflowcount=0;static unsigned long overflowcount=0;void time1(void) interrupt 3 void time1(void) interrupt 3 o
12、verflowcount+; / overflowcount+; /溢出计数器加溢出计数器加1 1 void main(void) void main(void) TMOD=(TMOD&0x0F)|0x20; TMOD=(TMOD&0x0F)|0x20; 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); 课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计 例例例例2 2 2 2:设单片机的:设单片
13、机的:设单片机的:设单片机的fosc=12 MHzfosc=12 MHzfosc=12 MHzfosc=12 MHz晶振,要求在晶振,要求在晶振,要求在晶振,要求在P1.0P1.0P1.0P1.0脚上输出脚上输出脚上输出脚上输出周期为周期为周期为周期为2 ms2 ms2 ms2 ms的方波。的方波。的方波。的方波。 分析:分析:分析:分析: 周期为周期为周期为周期为2 ms2 ms2 ms2 ms的方波要求定时时间隔的方波要求定时时间隔的方波要求定时时间隔的方波要求定时时间隔1 ms1 ms1 ms1 ms,每次时间到,每次时间到,每次时间到,每次时间到P1.0P1.0P1.0P1.0取反。取
14、反。取反。取反。 机器周期机器周期机器周期机器周期=12/fosc=1 s =12/fosc=1 s =12/fosc=1 s =12/fosc=1 s 需计数次数需计数次数需计数次数需计数次数=1000/(12/fosc)=1000/1=1000=1000/(12/fosc)=1000/1=1000=1000/(12/fosc)=1000/1=1000=1000/(12/fosc)=1000/1=1000 由于计数器是加由于计数器是加由于计数器是加由于计数器是加1 1 1 1计数,为得到计数,为得到计数,为得到计数,为得到1000100010001000个计数之后的定时器溢个计数之后的定时器
15、溢个计数之后的定时器溢个计数之后的定时器溢出,必须给定时器置初值为出,必须给定时器置初值为出,必须给定时器置初值为出,必须给定时器置初值为65536655366553665536(2 2 2 216161616)-1000-1000-1000-1000。课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计 (1) (1) 用定时器用定时器0 0的方式的方式1 1编程,采用查询方式,程序如下:编程,采用查询方式,程序如下: #include #include sbit P1_0=P10 sbit P1_0=P10 ; void main(void) v
16、oid main(void) TMOD=0x01 TMOD=0x01 ; /* /* 设置定时器设置定时器0 0为方式为方式1*/1*/ TR0=1 TR0=1 ; /* /* 启动启动 T/C0 */ T/C0 */ for( for( ; ;) ) TH0= ( TH0= (65536655366553665536 -1000 ) /256 -1000 ) /256 ; /* /* 装载计数器初值装载计数器初值 */ */ TL0= ( TL0= (65536655366553665536 -1000 ) %256 -1000 ) %256 ; do while (!TF0) do whi
17、le (!TF0) ; /* /* 查询等待查询等待TF0TF0置位置位 */ */ P1_0=!P1_0 P1_0=!P1_0; /* /* 定时时间到定时时间到P1.0P1.0反相反相 */ */ TF0=0 TF0=0; /* /* 软件清软件清 TF0 */ TF0 */ 课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计 (2) (2) 用定时器用定时器0 0的方式的方式1 1编程,采用中断方式。程序如下:编程,采用中断方式。程序如下: #include #include sbit P1_0=P10 sbit P1_0=P10 ; voi
18、d 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取反取反 */ */ TH0= ( TH0= (65536655366553665536 -1000 ) /256 -1000 ) /256 ; * * 重新装载计数初值重新装载计数初值 */ */ TL0= ( TL0= (65536655366553665536 -1000 ) %256 -1000 ) %256 void main( void ) void main( v
19、oid ) TMOD=0x01 TMOD=0x01 ; /* T/C0 /* T/C0工作在定时器方式工作在定时器方式1 */1 */ P1_0=0 P1_0=0; TH0= ( TH0= (65536655366553665536 -1000 ) /256 -1000 ) /256 ; /* /* 预置计数初值预置计数初值 */ */ TL0= ( TL0= (65536655366553665536 -1000 ) %256 -1000 ) %256 ; EA=1 EA=1 ; /* CPU /* CPU中断开放中断开放 */ */ ET0= 1 ET0= 1 ; /* T/C0 /* T
20、/C0中断开放中断开放 */ */ TR0=1 TR0=1 ; /* /* 启动启动T/C0T/C0开始定时开始定时 */ */ do while(1) do while(1) ; /* /* 等待中断等待中断 */ */ 课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计 例例3:采用:采用10 MHz晶振,在晶振,在P1.0脚上输出周期为脚上输出周期为2.5 s,占空,占空比比20%的脉冲信号。的脉冲信号。 分析:分析: 10 MHz晶振,使用定时器最大定时几十毫秒。取晶振,使用定时器最大定时几十毫秒。取10 ms定时,定时,周期周期2.5 s
21、需需250次中断,占空比次中断,占空比20%,高电平应为,高电平应为50次中断。次中断。 10 ms定时,晶振定时,晶振fosc=10 MHz。 需定时器计数次数需定时器计数次数=1010310/12=8333 给定时器置初值为给定时器置初值为给定时器置初值为给定时器置初值为6553665536(2 21616)-8333-8333课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计# include # include # define uchar unsigned char# define uchar unsigned charuchar per
22、iod=250uchar period=250;uchar high=50uchar high=50;timer0( )interrupt 1 using 1 /* T/C0timer0( )interrupt 1 using 1 /* T/C0中断服务程序中断服务程序 */ */ TH0= ( TH0= (65536655366553665536 8333 8333)/256 /256 ; /* /* 重置计数值重置计数值 */ */ TL0= ( TL0= (65536655366553665536 8333 8333)%256 %256 ; if(+time=high)P1=0; /*
23、高电平时间到变低高电平时间到变低 */ else if (time=period) /* 周期时间到变高周期时间到变高 */ time=0 ; P1=1 ; 课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计main( )main( ) TMOD=0x01 TMOD=0x01 ; /* /* 定时器定时器0 0方式方式1 */1 */ TH0= ( TH0= (65536655366553665536 8333 8333) /256 /256 ; TL0= ( TL0= (65536655366553665536 8333 8333) %256 %
24、256 ; EA=1 EA=1; /* /* 开开CPUCPU中断中断 */ */ ET0=1 ET0=1 ; /* /* 开开T/C0T/C0中断中断 */ */ TR0=1 TR0=1 ; /* /* 启动启动T/C0 */T/C0 */ do while(1) do while(1) ; 课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计三、串行口应用的三、串行口应用的C C语言编程语言编程 例:单片机例:单片机串行口发送程序,每发送一串字符串行口发送程序,每发送一串字符“MCS-51”“MCS-51”后,延时一段时间重复发送。后,延时一段时
25、间重复发送。#include#include#define uchar unsigned char #define uchar unsigned char #define uint unsigned int#define uint unsigned intuchar idata trdata10=M,C,S,-uchar idata trdata10=M,C,S,-, 5 5,1,0x0d,0x0a,0x00;1,0x0d,0x0a,0x00;main()main() uchar i; uint j; uchar i; uint j; TMOD=0x20; TMOD=0x20;课程:单片机技术
26、课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计 TL1=0xfd; TH1=TL1; TL1=0xfd; TH1=TL1; SCON=0xd0;PCON=0x00; /* SCON=0xd0;PCON=0x00; /*方式方式3, SOMD=0*/3, SOMD=0*/ TR1=1; TR1=1; while(1) while(1) i=0; i=0; while(trdatai!=0x00) while(trdatai!=0x00) SBUF= trdatai; SBUF= trdatai; while(TI=0); while(TI=0); TI=0; T
27、I=0; i+; i+; for(j=0;j12500;j+); for(j=0;j12500;j+); 课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计 单片机单片机串行口发送串行口发送/ /接收程序,每接收到字节即刻发送出去;接收程序,每接收到字节即刻发送出去;#include#includevoid main(void)void main(void) unsigned char a; unsigned char a; TMOD=0x20; TMOD=0x20; TL1=0xfd; TL1=0xfd; TH1=TL1; TH1=TL1; SCON=0xd0;PCON=0x00; /*SCON=0xd0;PCON=0x00; /*方式方式3, SOMD=0*/3, SOMD=0*/ TR1=1; TR1=1; while(1) while(1) while(RI=0); while(RI=0); R1=0; R1=0; a=SBUF; a=SBUF; SBUF=a; SBUF=a; while(TI=0); while(TI=0); T1=0; T1=0; 课程:单片机技术课程:单片机技术 教材:单片机的教材:单片机的C语言应用程序设计语言应用程序设计