《单片机原理与应用技术6.ppt》由会员分享,可在线阅读,更多相关《单片机原理与应用技术6.ppt(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第六讲:C-51程序设计本讲重点:本讲重点:C-51C-51的数据类型和存储类型;的数据类型和存储类型;指针和中断的使用;指针和中断的使用;通过实例消化理解通过实例消化理解C-51C-51的编程方法;的编程方法;尝试将实验课中的尝试将实验课中的ASM-51ASM-51程序转为程序转为C-51C-51程序程序.单片机原理与应用技术单片机原理与应用技术教学课件教学课件C C语言作为一种非常方便的语言而得到广泛的支持,语言作为一种非常方便的语言而得到广泛的支持,C C语言程序本身不依赖于机器硬件系统,基本上不语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来。作修改就
2、可将程序从不同的单片机中移植过来。C C提供了很多数学函数并支持浮点运算,开发效率提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护高,故可缩短开发时间,增加程序可读性和可维护性。性。C-51 C-51简介简介单片机原理与应用技术单片机原理与应用技术教学课件教学课件C-51C-51与与ASM-51ASM-51相比,有如下优点:相比,有如下优点:1.1.对单片机的指令系统不要求了解,仅要求对单片机的指令系统不要求了解,仅要求对对8051 8051 的存贮器结构有初步了解;的存贮器结构有初步了解;2.2.寄存器分配、不同存贮器的寻址及数据类寄存器分配、不同存贮器
3、的寻址及数据类型等细节可由编译器管理;型等细节可由编译器管理;3.3.程序有规范的结构,可分成不同的函数,程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;这种方式可使程序结构化;4.4.具有将可变的选择与特殊操作组合在一起具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;的能力,改善了程序的可读性;5.5.提供的库包含许多标准子程序,具有较强提供的库包含许多标准子程序,具有较强的数据处理能力;的数据处理能力;6.6.由于具有方便的模块化编程技术,使已编由于具有方便的模块化编程技术,使已编好程序可容量地植入新程序;好程序可容量地植入新程序;单片机原理与应用技术单片机原理
4、与应用技术教学课件教学课件 C C5151的数据类型的数据类型 常用的数据类型有:常用的数据类型有:C C5151的程序结构的程序结构 与一般与一般C C语言的结构相同,以语言的结构相同,以main()main()函数为程序人函数为程序人口,程序体中包含若干语句还可以包含若干函数。口,程序体中包含若干语句还可以包含若干函数。位型位型 字符型字符型 整型整型 长整型长整型 浮点型浮点型bit bit charchar intint long long intint floatfloat1 1位位 1 1字节字节 2 2字节字节 4 4字节字节 4 4字节字节数组型数组型 指针型指针型单片机原理与
5、应用技术单片机原理与应用技术教学课件教学课件 C-51 C-51数据的存储类型数据的存储类型名名 存储空间位置存储空间位置 长度长度 数据范围数据范围 data data 直接寻址片内直接寻址片内RAM 8RAM 8位位 0 0255 255 bdatabdata 可可位寻址片内位寻址片内RAM 1RAM 1位位 0/10/1idataidata 间接寻址片内间接寻址片内RAM 8RAM 8位位 0 0255255xdataxdata 片外片外RAM 16RAM 16位位 0 06553565535 C-51 C-51的的包含的头文件包含的头文件通常有:reg51.h math.h ctype
6、.h stdio.h stdlib.h absacc.h常用有:reg51.h (定义特殊功能寄存器和位寄存器);math.h (定义常用数学运算);单片机原理与应用技术单片机原理与应用技术教学课件教学课件 C-51 C-51的运算符的运算符与与C C语言基本相同:语言基本相同:+-*/+-*/(加(加 减减 乘乘 除)除)=(位右移(位右移 位左移)位左移)&|&|(按位与按位与 按位或按位或)(按位异或按位异或 按位取反按位取反)单片机原理与应用技术单片机原理与应用技术教学课件教学课件 C-51 C-51的基本语句的基本语句与与标准标准C C语言基本相同:语言基本相同:if if 选择语言
7、选择语言 switch/caseswitch/case 多分支选择语言多分支选择语言 whilewhile 循环语言循环语言 do-while do-while 循环语言循环语言 for for 循环语言循环语言单片机原理与应用技术单片机原理与应用技术教学课件教学课件 实例实例ORG 0000HORG 0000HMOV R0,#0DCH;MOV R0,#0DCH;指向字形口指向字形口MOV A,#80HMOV A,#80H;确定字形代码确定字形代码MOVX MOVX R0,A R0,A ;输出字形代码输出字形代码MOV R1,#0DDH;MOV R1,#0DDH;指向字位口指向字位口MOV A
8、,#20HMOV A,#20H;从最高位开始从最高位开始LEDO:LEDO:MOVX MOVX R1,AR1,A;输出字位代码输出字位代码MOV R2,#18HMOV R2,#18H;确定延时常数确定延时常数ACALL ACALL DEYSDEYS;调延时子程序调延时子程序RL ARL A;右移一位右移一位SJMP SJMP LEDOLEDO;循环演示循环演示;延时子程序延时子程序DEYSDEYS:PUSH 02H:PUSH 02HDEY0:PUSH 02HDEY0:PUSH 02HDEY1:PUSH 02HDEY1:PUSH 02H DJNZ R2,$DJNZ R2,$POP 02H POP
9、 02H DJNZ R2,DEY1 DJNZ R2,DEY1 POP 02H POP 02H DJNZ R2,DEY0 DJNZ R2,DEY0 POP 02H POP 02H DJNZ R2,DEYS DJNZ R2,DEYS RET RET END END例例1.“8”1.“8”字符循环演示字符循环演示 (字形口为(字形口为DCH;DCH;字位口为字位口为DDHDDH)汇编语言程序汇编语言程序单片机原理与应用技术单片机原理与应用技术教学课件教学课件#include#include#include#include#define#define ucharuchar unsigned char
10、unsigned char /*/*字形口字形口 */#define PORTA XBYTE0 xffdc#define PORTA XBYTE0 xffdc /*/*字位口字位口*/#define PORTB XBYTE0 xffdd#define PORTB XBYTE0 xffdd /*/*延时延时 1MS1MS子程序子程序*/void void msce(unsignedmsce(unsigned intint x)x)unsigned char j;unsigned char j;while(x-)!=0)while(x-)!=0)for(j=0;j60;j+);for(j=0;j6
11、0;j+);main()main()ucharuchar rr,irr,i;for(;)for(;)rrrr=0 x01;/*=0 x01;/*从最右一位开始从最右一位开始*/for(i=0;i6;i+)for(i=0;i6;i+)PORTA=0 x80;/*PORTA=0 x80;/*输出字形代码输出字形代码*/PORTB=PORTB=rrrr;/*;/*输出字位代码输出字位代码*/msce(150);/*msce(150);/*调延时子程序调延时子程序*/rrrr=rrrr1;/*1;/*循环左移一位循环左移一位*/“8”“8”字符循环演示字符循环演示的的C C5151程序程序单片机原理与
12、应用技术单片机原理与应用技术教学课件教学课件 C C5151程序程序#include#include main()main()intint i;i;unsigned char unsigned char xdataxdata*p=0 x2000;/*p=0 x2000;/*指针指向指针指向2000H2000H单元单元*/for(i=0;i256;i+)/*for(i=0;i256;i+)/*清零清零2000H-20FFH2000H-20FFH单元单元*/*p=0;p+;*p=0;p+;例例2.2.清零程序清零程序 (将将2000H20FFH2000H20FFH的内容清零的内容清零)汇编语言程序
13、汇编语言程序 ORG 0000HORG 0000HSE01:MOV R0,#00H SE01:MOV R0,#00H MOV DPTR,#2000H ;(0000H)MOV DPTR,#2000H ;(0000H)送送DPTRDPTRLOO1:CLR ALOO1:CLR A MOVX MOVX DPTR,A ;0DPTR,A ;0送送(DPTR)(DPTR)INC DPTR ;DPTR+1 INC DPTR ;DPTR+1 INC R0 ;INC R0 ;字节数加字节数加1 1 CJNE R0,#00H,LOO1 ;CJNE R0,#00H,LOO1 ;不到不到FFFF个字节再清个字节再清LO
14、OP:SJMP LOOPLOOP:SJMP LOOP单片机原理与应用技术单片机原理与应用技术教学课件教学课件例例3.3.拆字程序拆字程序(将(将2000H2000H的内容拆开,高位送的内容拆开,高位送2001H2001H低位,低位送低位,低位送2002H2002H低位)低位)汇编语言程序汇编语言程序 ORG 0000HORG 0000HSE02:MOV DPTR,#2000HSE02:MOV DPTR,#2000H MOVX A,MOVX A,DPTRDPTR MOV B,A ;(2000)AB MOV B,A ;(2000)AB SWAP A ;SWAP A ;交换交换 ANL A,#0FH
15、 ;ANL A,#0FH ;屏敝高位屏敝高位 INC DPTRINC DPTR MOVX MOVX DPTR,A ;DPTR,A ;送送2001H2001H INC DPTR INC DPTR MOV A,B MOV A,B ANL A,#0FH ;(2000)ANL A,#0FH ;(2000)内容屏敝高位内容屏敝高位 MOVX MOVX DPTR,A ;DPTR,A ;送送2002H2002H SJMP$SJMP$单片机原理与应用技术单片机原理与应用技术教学课件教学课件拆字拆字C C5151程序程序#include#include main()main()unsigned char uns
16、igned char xdataxdata*p=0 x2000;/*p=0 x2000;/*指针指向指针指向2000H2000H单元单元*/*2002H/*2002H单元高单元高4 4位清零,低位清零,低4 4位装位装2000H2000H单元低单元低4 4位位*/*(p+2)=(*p)&0 x0f;*(p+2)=(*p)&0 x0f;/*2001H/*2001H单元高单元高4 4位清零,低位清零,低4 4位装位装2000H2000H单元高单元高4 4位位*/*(p+1)=(*p)4;*(p+1)=(*p)4;单片机原理与应用技术单片机原理与应用技术教学课件教学课件 汇编语言程序汇编语言程序 O
17、RG 0000HORG 0000HL00:MOV R0,#10H ;L00:MOV R0,#10H ;查找查找1616个字节个字节 MOV R1,#00HMOV R1,#00H MOV DPTR,#2000H MOV DPTR,#2000HL11:MOVX A,DPTRL11:MOVX A,DPTR CJNE A,#00H,L16 ;CJNE A,#00H,L16 ;取出内容与取出内容与00H00H相等吗相等吗?INC R1 ;INC R1 ;取出个数加取出个数加1 1L16:INC DPTRL16:INC DPTR DJNZ R0,L11 ;DJNZ R0,L11 ;未完继续未完继续 MOV
18、 DPTR,#2100HMOV DPTR,#2100H MOV A,R1 MOV A,R1 MOVX DPTR,A ;MOVX DPTR,A ;相同数个数送相同数个数送2100H2100HL1E:SJMP L1EL1E:SJMP L1E例例4.4.查找零的个数查找零的个数(在(在2000H-200FH2000H-200FH中查出有几个中查出有几个字字 节是零,把个数放在节是零,把个数放在2100H2100H单元中)单元中)单片机原理与应用技术单片机原理与应用技术教学课件教学课件查找零的个数查找零的个数C C5151程序程序#include#include main()main()unsigne
19、d char unsigned char xdataxdata*p=0 x2000;/*p=0 x2000;/*指针指针p p指向指向2000H2000H单元单元*/intint n=0,i;n=0,i;for(i=0;i16;i+)for(i=0;i16;i+)if(*p=0)n+;/*if(*p=0)n+;/*若该单元内容为零,则若该单元内容为零,则n+1*/n+1*/p+;/*p+;/*指针指向下一单元指针指向下一单元 */p=0 x2100;/*p=0 x2100;/*指针指针p p指向指向2100H2100H单元单元*/*p=n;/*p=n;/*把个数放在把个数放在2100H2100
20、H单元中单元中*/单片机原理与应用技术单片机原理与应用技术教学课件教学课件 汇编程序汇编程序 ORG 0000HORG 0000H MOV A,R3 MOV A,R3 MOV B,R7 MOV B,R7 MUL AB ;R3*R7 MUL AB ;R3*R7 XCH A,R7 ;R7=(R3*R7)XCH A,R7 ;R7=(R3*R7)低字节低字节 MOV R5,B ;R5=(R3*R7)MOV R5,B ;R5=(R3*R7)高字节高字节 MOV B,R2MOV B,R2 MUL AB ;R2*R7 MUL AB ;R2*R7 ADD A,R5 ADD A,R5 MOV R4,A MOV
21、R4,A CLR A CLR A ADDC A,B ADDC A,B MOV R5,A ;R5=(R2*R7)MOV R5,A ;R5=(R2*R7)高字节高字节 MOV A,R6MOV A,R6 MOV B,R3 MOV B,R3 MUL AB ;R3*R6 MUL AB ;R3*R6 ADD A,R4ADD A,R4 XCH A,B XCH A,B ADDC A,R5 ADDC A,R5 MOV R5,A MOV R5,A MOV PSW.5,C ;MOV PSW.5,C ;存存CYCY MOV A,R2 MOV A,R2 MUL AB ;R2*R6 MUL AB ;R2*R6 ADD A
22、,R5 ADD A,R5 MOV R5,A MOV R5,A CLR A CLR A MOV ACC.0,C MOV ACC.0,C MOV C,PSW.5 ;MOV C,PSW.5 ;加上次加法的位加上次加法的位 ADDC A,BADDC A,B MOV R4,A MOV R4,A JMP$JMP$例例5.5.双字节无符号整数快速乘法双字节无符号整数快速乘法单片机原理与应用技术单片机原理与应用技术教学课件教学课件 C C5151程序程序#include#include main()main()unsigned unsigned intint xdataxdata*p1=0 x2000;*p1
23、=0 x2000;/*/*双字节被乘数在双字节被乘数在2000H2000H单元单元*/unsigned unsigned intint xdataxdata*p2=0 x2002;*p2=0 x2002;/*/*双字节乘数在双字节乘数在2002H2002H单元单元 */unsigned long unsigned long xdataxdata*p3=0 x2010;*p3=0 x2010;/*4/*4字节乘积放在字节乘积放在2010H2010H单元单元*/*p3=(*p1)*(*p2);*p3=(*p1)*(*p2);单片机原理与应用技术单片机原理与应用技术教学课件教学课件例例6.6.工业顺
24、序控制工业顺序控制C-51C-51程序程序#include#include sbitsbit P1_7=0 x97;/*P1_7=0 x97;/*定义定义P1.7P1.7口地址口地址*/unsigned char TT;unsigned char TT;void Delay(unsigned void Delay(unsigned intint value)/*value)/*延时子程序延时子程序*/while(value!=0)value-;while(value!=0)value-;void Serint1()interrupt 2 /*void Serint1()interrupt 2
25、/*中断服务程序中断服务程序-暂停并报警暂停并报警*/intint i;i;TT=P1;/*TT=P1;/*保护现场保护现场*/P1=0 x7f;/*P1=0 x7f;/*关输出关输出*/while(!INT1)/*while(!INT1)/*若故障未消除若故障未消除,则报警则报警*/for(i=0;i0 xa0;i+)/*for(i=0;i0 xa0;i+)/*给蜂鸣器发震荡脉冲给蜂鸣器发震荡脉冲*/P1_7=1;Delay(50);P1_7=0;Delay(50);P1_7=1;Delay(50);P1_7=0;Delay(50);P1_7=0;Delay(6550);P1_7=0;Del
26、ay(6550);P1=TT;/*P1=TT;/*恢复现场恢复现场*/单片机原理与应用技术单片机原理与应用技术教学课件教学课件 main()main()IE=0 x84;/*CPU IE=0 x84;/*CPU开中断开中断,INT1,INT1开中断开中断*/while(T0=0);/*while(T0=0);/*等待等待P3.4P3.4变高变高 */for(;)for(;)P1=0 xfe;Delay(60000);/*P1=0 xfe;Delay(60000);/*工序工序1*/1*/P1=0 xfd;Delay(60000);/*P1=0 xfd;Delay(60000);/*工序工序2*
27、/2*/P1=0 xfb;Delay(60000);/*P1=0 xfb;Delay(60000);/*工序工序3*/3*/P1=0 xf7;Delay(60000);/*P1=0 xf7;Delay(60000);/*工序工序4*/4*/P1=0 xef;Delay(60000);/*P1=0 xef;Delay(60000);/*工序工序5*/5*/P1=0 xdf;Delay(60000);/*P1=0 xdf;Delay(60000);/*工序工序6*/6*/P1=0 x8f;Delay(60000);/*P1=0 x8f;Delay(60000);/*工序工序7*/7*/(续前)(续
28、前)单片机原理与应用技术单片机原理与应用技术教学课件教学课件例例7.7.电脑时钟电脑时钟(用定时器产生用定时器产生0.10.1秒定时中断,对时钟计数器计数并送数码管显示)秒定时中断,对时钟计数器计数并送数码管显示)C C5151程序程序#include#include#include#include#define#define ucharuchar unsigned char unsigned char#define#define LEDwpLEDwp XBYTE0 xffdc XBYTE0 xffdc#define#define LEDwbLEDwb XBYTE0 xffdd XBYTE0
29、xffdducharuchar code code table10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;table10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;ucharuchar hour=1,min=23,sec=45,m=0,n,i;/*hour=1,min=23,sec=45,m=0,n,i;/*给时钟赋初值给时钟赋初值*/ucharuchar xdataxdata *p;*p;void Delay(unsigned voi
30、d Delay(unsigned intint value)/*value)/*延时子程序延时子程序*/while(value!=0)value-;while(value!=0)value-;单片机原理与应用技术单片机原理与应用技术教学课件教学课件void Trans(void)/*void Trans(void)/*时间数据转换子程序时间数据转换子程序*/if(sec=60)min+;sec=0;if(sec=60)min+;sec=0;if(min=60)hour+;min=0;if(min=60)hour+;min=0;if(hour=24)hour=0;if(hour=24)hour=
31、0;*(p+0)=hour/10;/*(p+0)=hour/10;/*时的十分位时的十分位*/*(p+1)=hour%10;/*(p+1)=hour%10;/*时的个位时的个位*/*(p+2)=min/10;/*(p+2)=min/10;/*分的十分位分的十分位*/*(p+3)=min%10;/*(p+3)=min%10;/*分的个位分的个位*/*(p+4)=sec/10;/*(p+4)=sec/10;/*秒的十分位秒的十分位*/*(p+5)=sec%10;/*(p+5)=sec%10;/*秒的个位秒的个位*/void Show(void)/*void Show(void)/*循环显示子程序循
32、环显示子程序*/for(;)for(;)Trans();Trans();LEDwbLEDwb=n=0 x20;=n=0 x20;for(i=0;i6;i+)for(i=0;i1;=n;Delay(100);n=n1;单片机原理与应用技术单片机原理与应用技术教学课件教学课件 /*/*中断服务子程序(中断服务子程序(0.10.1秒中断一次)秒中断一次)*/void time()interrupt 1 void time()interrupt 1 m+;m+;TH0=0 x3c;TL0=0 xb7;/*TH0=0 x3c;TL0=0 xb7;/*给给 T0 T0 赋计数初值赋计数初值 */if(m=
33、10)sec=sec+1;m=0;if(m=10)sec=sec+1;m=0;main()main()p=0 x2000;p=0 x2000;TMOD=0X01;/*T/C0 TMOD=0X01;/*T/C0工作在定时器方式工作在定时器方式1*/1*/TH0=0 x3c;TH0=0 x3c;TL0=0 xb7;/*TL0=0 xb7;/*给给 T0 T0 赋计数初值赋计数初值 */EA=1;/*CPU EA=1;/*CPU开中断开中断*/TR0=1;/*TR0=1;/*启动启动T/C0T/C0开始定时开始定时*/ET0=1;/*T/C0 ET0=1;/*T/C0开中断开中断*/Show();Show();单片机原理与应用技术单片机原理与应用技术教学课件教学课件OVER!单片机原理与应用技术单片机原理与应用技术教学课件教学课件