预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共60页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

51单片机硬件结构C51基础知识及其基本程序设计C51函数、数组、指针定义及应用单片机内部资源及其C语言编程单片机资源扩展及其C语言编程综合程序设计考试四C51编程设计4.1MCS-51内部资源使用的C语言编程4.2MCS-51片外扩展的C语言编程4.3频率量测量的C语言编程4.1MCS-51内部资源使用的C语言编程表4.1MCS-51中断源编号usingn选项用于实现工作寄存器组的切换,n是中断服务子程序中选用的工作寄存器组号(0~3)。在许多情况下,响应中断时需保护有关现场信息,以便中断返回后,能使中断前的源程序从断点处继续正确地执行下去。这在MCS-51单片机中,能很方便地利用工作寄存器组的切换来实现。即在进入中断服务程序前的程序中使用一组工作寄存器,进入中断服务程序后,由"usingn"切换到另一组寄存器,中断返回后又恢复到原寄存器组。这样互相切换的两组寄存器中的内容彼此都没有被破坏。图4.1扩展多个中断源在中断服务程序中仅设置标志,并保存I/O口输入状态。FranklinC51编译器提供定义特定MCS-51系列成员的寄存器头文件。MCS-51头文件为reg51.h。C51程序如下:for(;;){if(flag)/*有中断*/{switch(status)/*根据中断源分支*/{case0:break;/*处理IN0*/case1:break;/*处理IN1*/case2:break;/*处理IN2*/case3:break;/*处理IN3*/default:;}flag=0;/*处理完成清标志*/}}}4.1.2定时器/计数器(T/C)应用的C语言编程(1)用定时器0的方式1编程,采用查询方式,程序如下:#include<reg51.h>sbitP1_0=P1^0;voidmain(void){TMOD=0x01;/*设置定时器1为非门控制方式1*/TR0=1;/*启动T/C0*/for(;;){TH0=-(1000/256);/*装载计数器初值*/TL0=-(1000%256);do{}while(!TF0);/*查询等待TF0置位*/P1_0=!P1_0;/*定时时间到P1.0反相*/TF0=0;/*软件清TF0*/}}(2)用定时器0的方式1编程,采用中断方式。程序如下:#include<reg51.h>sbitP1_0=P1^0;voidtime(void)interrupt1using1/*T/C0中断服务程序入口*/{P1_0=!P1_0;/*P1.0取反*/TH0=-(1000/256);/*重新装载计数初值*/}voidmain(void){TMOD=0x01;/*T/C0工作在定时器非门控制方式1*/P1_0=0;TH0=-(1000/256);/*预置计数初值*/TL0=-(1000%256);EA=1;/*CPU中断开放*/ET0=1;/*T/C0中断开放*/TR0=1;/*启动T/C0开始定时*/do{}while(1);/*等待中断*/}例3采用10MHz晶振,在P1.0脚上输出周期为2.5s,占空比20%的脉冲信号。10MHz晶振,使用定时器最大定时几十毫秒。取10ms定时,周期2.5s需250次中断,占空比20%,高电平应为50次中断。10ms定时,晶振fosc=10MHz。需定时器计数次数=10×103×10/12=8333timer0()interrupt1using1/*T/C0中断服务程序*/{TH0=-8333/256;/*重置计数值*/TL0=-8333%256;if(++time==high)P1=0;/*高电平时间到变低*/elseif(time==period)/*周期时间到变高*/{time=0;P1=1;}}main(){TMOD=0x01;/*定时器0方式1*/TH0=-8333/256;/*预置计数初值*/TL0=-8333%256;EA=1;/*开CPU中断*/ET0=1;/*开T/C0中断*/TR0=1;/*启动T/C0*/do{}while(1);}图2.2中断服务程序流程图产生一个占空比变化脉冲信号的程序,它产生的脉宽调制信号用于电机变速控制。TL0=-833%256;ET0=1;if(++time=percent)P1=0;elseif(time==100){time=0;P1=1;}}voidtachmeter(void)interrupt2using2/*外中断1服务程序*/{union{unitword;struct{ucharhi;ucharlo;}byte;}newcount;newcount.byte.hi=TH1;newcount.byte.lo=TL1;period=newcount.word-oldcount;/*测得周期*/old