课程主要内容: 51单片机硬件结构 C51基础知识及其基本程序设计 C51函数、数组、指针定义及应用 c单片机内部资源及其C语言编程 单片机资源扩展及其C语言编程 综合程序设计 考试
单片机C语言应用程序设计 51单片机硬件结构 C51基础知识及其基本程序设计 C51函数、数组、指针定义及应用 单片机内部资源及其C语言编程 单片机资源扩展及其C语言编程 综合程序设计 考试
四c51编程设计 41MCS-51内部资源使用的C语言编程 42MCS-51片外扩展的C语言编程 4.3频率量测量的C语言编程
单片机C语言应用程序设计 四 C51编程设计 4.1 MCS-51内部资源使用的C语言编程 4.2 MCS-51片外扩展的C语言编程 4.3 频率量测量的C语言编程
4IMCS51内部资源使用的C语言编程 411中断应用的C语言编程 C51编译器支持在C源程序中直接开发中断程序。中断服务 程序是通过按规定语法格式定义的一个函数 中断服务程序的函数定义的语法格式如下: 返回值函数名([参数] interrupt musing n
单片机C语言应用程序设计 4.1 MCS-51内部资源使用的C语言编程 4.1.1 中断应用的C语言编程 C51编译器支持在C源程序中直接开发中断程序。中断服务 程序是通过按规定语法格式定义的一个函数。 中断服务程序的函数定义的语法格式如下: 返回值 函数名([参数]) interrupt m[using n] { } …
表41MCS51中断源编号 编号 中断源 入口地址 外部中断0 0003H 定时器/计数器0 00OBH 外部中断1 0013H 定时器/计数器1 001BH 串行口中断 0023H
单片机C语言应用程序设计 表4.1 MCS-51中断源编号 编 号 中 断 源 入 口 地 址 0 外部中断0 0003H 1 定时器/计数器0 000BH 2 外部中断1 0013H 3 定时器/计数器1 001BH 4 串行口中断 0023H
ingn选项用于实现工作寄存器组的切换,n是中断服务子 程序中选用的工作寄存器组号(0~3)。在许多情况下,响应中断 时需保护有关现场信息,以便中断返回后,能使中断前的源程序 从断点处继续正确地执行下去。这在MCS-51单片机中,能很方便 地利用工作寄存器组的切换来实现。即在进入中断服务程序前的 程序中使用一组工作寄存器,进入中断服务程序后,由" using n" 切换到另一组寄存器,中断返回后又恢复到原寄存器组。这样互 相切换的两组寄存器中的内容彼此都没有被破坏
单片机C语言应用程序设计 using n 选项用于实现工作寄存器组的切换,n是中断服务子 程序中选用的工作寄存器组号(0 ~ 3)。在许多情况下,响应中断 时需保护有关现场信息,以便中断返回后,能使中断前的源程序 从断点处继续正确地执行下去。这在MCS-51单片机中,能很方便 地利用工作寄存器组的切换来实现。即在进入中断服务程序前的 程序中使用一组工作寄存器,进入中断服务程序后,由"using n" 切换到另一组寄存器,中断返回后又恢复到原寄存器组。这样互 相切换的两组寄存器中的内容彼此都没有被破坏
例1图75所示是利用优先权解码芯片,在单片机8031的 外部中断INT1上扩展多个中断源的原理电路图。图中是以开 关闭合来模拟中断请求信号。当有任一中断源产生中断请求,能 给8031的INT1引脚送一个有效中断信号,由Pl的低3位可得对应 中断源的中断号。 5V 8031 74LS148 P1.2 A2 A P10 AO 432 AS E ⅠNo 图41扩展多个中断源
单片机C语言应用程序设计 图 4.1 扩展多个中断源 例1 图7.5所示是利用优先权解码芯片,在单片机8031的一 个外部中断INT1上扩展多个中断源的原理电路图。图中是以开 关闭合来模拟中断请求信号。当有任一中断源产生中断请求,能 给8031的INT1引脚送一个有效中断信号,由P1的低3位可得对应 中断源的中断号
在中断服务程序中仅设置标志,并保存IO口输入状态。 Franklin c51编译器提供定义特定MCS-51系列成员的寄存器头文 件。MCS-51头文件为reg51h。C51程序如下: include unsigned char status bit flag: void service int1( interrupt2 using2/*NTl中断服务程序,使用第2组工 作寄存器* i flag=1; /*设置标志* status=pI /*存输入口状态* void main ( void) P=0x04; /*置INTl为高优先级中断* /*INT1开中断,CPU开中断*
单片机C语言应用程序设计 在中断服务程序中仅设置标志,并保存I/O口输入状态。 Franklin C51编译器提供定义特定MCS-51系列成员的寄存器头文 件。MCS-51头文件为reg51.h。C51程序如下: # include unsigned char status; bit flag; void service_int1( ) interrupt 2 using 2 /* INT1中断服务程序,使用第2组工 作寄存器 */ { flag=1; /* 设置标志 */ status=p1; /* 存输入口状态*/ } void main(void) { IP=0x04 ; /* 置INT1为高优先级中断 */ IE=-0x84 ; /* INT1开中断,CPU开中断 */
for(: f if( flag) /*有中断* i switch(status) /*根据中断源分支* i case0: break; /*处理ⅠNO* case 1: break /*处理ⅠN1*/ case 2: break: /*处理IN2* case 3: break /*处理ⅠN3* default flag=0 /*处理完成清标志*
单片机C语言应用程序设计 for(; ;) { if(flag) /* 有中断 */ { switch(status) /* 根据中断源分支 */ { case 0 : break ; /* 处理IN0 */ case 1 : break ; /* 处理IN1 */ case 2 : break; /* 处理IN2 */ case 3 : break; /* 处理IN3 */ default : ; } flag=0 ; /* 处理完成清标志 */ } } }
412定时器计数器(T/C应用的C语言编程 例2设单片机的foS=12MHz晶振,要求在P1.0脚上输出周期 为2ms的方波。 周期为2ms的方波要求定时时间隔1ms,每次时间到P10取反。 机器周期=12fosc=1us 需计数次数=1000(12fsc=10001=1000 由于计数器是加1计数,为得到1000个计数之后的定时器溢 出,必须给定时器置初值为-1000即1000的补数)
单片机C语言应用程序设计 4.1.2 定时器/计数器(T/C)应用的C语言编程 例2 设单片机的fosc=12 MHz晶振,要求在P1.0脚上输出周期 为2 ms的方波。 周期为2 ms的方波要求定时时间隔1 ms,每次时间到P1.0取反。 机器周期=12/fosc=1 μs 需计数次数=1000/(12/fosc)=1000/1=1000 由于计数器是加1计数,为得到1000个计数之后的定时器溢 出,必须给定时器置初值为-1000(即1000的补数)
(1)用定时器0的方式1编程,采用查询方式,程序如下 include sbit p1 0=P1 0 void main(void I TMOD= I /*设置定时器1为非门控制方式1*/ TR0=1 /*启动TC0* for( TH0=(1000256);/*装载计数器初值* IL0=-(1000%256) do{} while(TFO);/*查询等待TFO置位 P10=P10 /*定时时间到P1.0反相* TF0=0 /*软件清TFO*
单片机C语言应用程序设计 (1) 用定时器0的方式1编程,采用查询方式,程序如下: # include sbit P1_0=P1^0 ; void main(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 */ } }