资讯详情

第2章单片机的C语言应用举例

会员分享《第二章单片机C语言应用实例》,可在线阅读。请在人文库网上搜索更多关于《第二章单片机C语言应用实例(54页收藏版)》的信息。

1、第二章 以单片机C语言应用为例,2.1 闪烁灯 2.2 I/O并直接驱动行口LED显示 2.3 多路开关状态指示 2.4 定时计数器T0定期应用技术 2.5 报警声、单片机编程语言概述、汇编语言 单片机有111条基本指令,其中单字节指令49条,双字节指令45条,三字节指令17条。 单机周期指令64条,双机周期指令45条,只有乘除两个指令的执行时间为4个机周期。,高级语言,常用的51系列单片机高级语言C语言 C51与ANSI C程序结构完全一样。与ANSI C区别在于单片机开发的特殊性,在单片机C语言中增加了对单片机寄存器的定义和说明,因此使用单片机C语言。

2.应特别注意一些特殊寄存器的定义。,设计要求: 如下图所示,P1.端口上有一个发光二极管L1,使L1.一亮一灭,一亮一灭的时间间隔为0.2s。,2.1 闪烁灯,电路原理图,把“单片机系统”区域中的P1.0端口连接到发光二极管指示模块区域L1端口上。,(1)系统板上的硬件连接,程序设计内容 延迟程序的设计方法 单片机指令的执行时间很短,数量很大,所以闪烁时间间隔为0.2秒,相对于微秒,差别太大,所以我们在执行某个指令时插入延迟程序来满足我们的要求,但是如何设计这样的延迟程序呢?如电路原理图所示,石英晶体为12MHz,。

3.因此,机器周期为1微秒 机器周期 微秒 MOV R6,#202个2 D1:MOV R7,#2482个2 2224849820 DJNZ R7,$2个 2248 (498 DJNZ R6,D12个22040 10002 因此,上述延迟程序的时间为10.002ms。 由此可知,当R610、R7248时,延时5ms,R620、R7248时,延时10ms,以此为基本的计时单位。本设计要求0.2秒200ms,10msR5200ms,则R延迟子程序如下:520: DELAY:MOV R5,#20 D1:MOV R6,#20 D2:MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 D。

4、JNZ R5,D1 RET,如图所示,当P1.0端口输出高电平,即P1.01时,根据发光二极管的单向导电性,此时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.00时,发光二极管L一亮;我们可以用SETBP1.0指令使P1.0端口输出高电平,使用CLRP1.0指令使P1.0端口输出低电平。,(2) 输出控制,程序框图,ORG 0 START:CLR P1.0 LCALL DELAY SETB P1.0 LCALL DELAY LJMP START DELAY:MOV R5.#20;延迟子程序,延迟0.2秒 D1:MOV R6,#20 D2:MOV R7,#248 DJNZ R7,$。

5、 DJNZ R6,D2 DJNZ R5,D1 RET END,汇编源程序,#include sbit L1=P10; void delay02s(void)/延时0.2秒子程序 unsigned char i,j,k; for(i=20;i0;i-) for(j=20;j0;j-) for(k=248;k0;k-); void main(void) while(1) L1=0; delay02s(); L1=1; delay02s(); ,C语言源程序,2.2 I/O并直接驱动行口LED显示,设计要求: 利用AT89S51单片机的P0端口的P0.0-P0.77连接到共阴数码管a-h的笔段上。

6.数字管的公共端接地。0-9数字在数字管上循环显示,时间间隔为0.2s。,单片机系统区域中的电路原理图P0.0/AD0P0.7/AD7端口用8芯线连接到四路静态数字显示模块区域的任何数字管ah端口;要求:P0.0/AD0与a相连,P0.1/AD1与b相连,P0.2/AD2与c相连,P0.7/AD7与h相连。,(1)系统板上的硬件连接 LED数字显示原理 七段LED显示器由七条发光二极管和一个小圆点发光二极管组成。根据每根管道的接线形式,可分为共阴极和共阳极。 LED数码管的ga由于加正电压,七个发光二极管发光,由于加零电压而不发光,不同的明暗组合可以形成不同的字符。

形状,这种组合称为字形码。,033FH “8”7FH “1”06H “9”6FH “2”5BH “A”77H “3”4FH “B”7CH “4”66H “C”39H “5”6DH “D”5EH “6”7DH “E”79H “7”07H “F”71H,共阴极字形码,(2) 由于显示的数字09的字形码没有规则可循,只能通过查表来完成要求。 按数字09的顺序,按顺序排列每个数字的笔段代码! 按数字09的顺序,按顺序排列每个数字的笔段代码!建立的表格如下:TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,程序框图,ORG 0 START: MOV R1,#00H NE。

8、XT: MOV A,R1 MOV DPTR,#TABLE MOVC A,A DPTR MOV P0,A LCALL DELAY INC R1 CJNE R1,#10,NEXT LJMP START DELAY: MOV R5,#20 D2:MOV R6,#20 D1:MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END,汇编源程序,#include unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,。

9、0 x66, 0 x6d,0 x7d,0 x07,0 x7f,0 x6f; unsigned char dispcount; void delay02s(void) unsigned char i,j,k; for(i=20;i0;i-) for(j=20;j0;j-) for(k=248;k0;k-); void main(void) while(1) for(dispcount=0;dispcount10;dispcount ) P0=tabledispcount; delay02s(); ,C语言源程序,2.3 多路开关状态指示,设计要求 AT89S51单片机的P1.0P1.三接四个发光。

10、二极管L1L4,P1.4P1.七接了四个开关K1K4,编程将开关的状态反映到发光二极管上。(开关闭合,相应的灯亮,开关断开,相应的灯熄灭)。,电路原理图,系统板上的硬件连接,1 单片机系统区域P1.0P1.3将导线连接到八路发光二极管指示模块区域L1L4端口上; 2 单片机系统区域P1.4P1.7将导线连接到四路拨动开关区域K1K4端口,程序设计内容,1 检测开关状态 对于检测开关状态,与单片机相比,它是一种输入关系。我们可以轮流检测每个开关的状态,并根据每个开关的状态指示相应的发光二极管JBP1.X,REL或JNBP1.X,REL完成指令;也可以一次性完成。

11.检测四路开关的状态,然后让指示,可以使用MOVA,P1指令一次把P读入所有端口状态,然后取高4位状态指示。 2 输出控制 发光二极管根据开关状态L1L我们可以用4来指示SETBP1.X和CLRP1.X指令也可以用来完成MOVP1,1111XXXXB一次指示方法。,方法1:程序框图,ORG 00H START:MOV A,P1 ANL A,#0F0H RR A RR A RR A RR A XOR A,#0F0H MOV P1,A SJMP START END,方法一(C语言源程序),#include /改为REG51.H unsigned char temp;。

12、 void main(void) while(1) temp=P14; temp=temp | 0 xf0; P1=temp; ,方法二(汇编源程序),ORG 00H START:JB P1.4,NEXT1 CLR P1.0 SJMP NEX1 NEXT1:SETB P1.0 NEX1:JB P1.5,NEXT2 CLR P1.1 SJMP NEX2 NEXT2:SETB P1.1 NEX2:JB P1.6,NEXT3 CLR P1.2 SJMP NEX3 NEXT3:SETB P1.2 NEX3:JB P1.7,NEXT4 CLR P1.3 SJMP NEX4 NEXT4:SETB P1.3。

13、 NEX4:SJMP START END,方法二(C语言源程序),#include void main(void) while(1) if(P1_4=0) P1_0=0; else P1_0=1; if(P1_5=0) P1_1=0; else P1_1=1; ,if(P1_6=0) P1_2=0; else P1_2=1; if(P1_7=0) P1_3=0; else P1_3=1; ,2.4 定时计数器T0定期应用技术,设计要求 用AT89S51单片机定时/计数器T0产生一秒定时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60,自动从0开始。如下图所示,硬件电路。硬件电路如下图所示,电路。

14.原理图,系统板上的硬件连接,1 单片机系统区域P0.0/AD0P0.7/AD7端口连接到四路静态数字显示模块区域中的任何一个ah端口;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,P0.7/AD7对应着h。 2 单片机系统区域P2.0/A8P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个ah端口;要求:P2.0/A8对应着a,P2.1/A9对应着b,P2.7/A15对应着h。,程序设计内容,AT89S51单片机内部16位定时/计数器是一种可编程定时/计数器,可工作在13位定时或16位定时和8位定时。

15、时方式。只需设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是通过软件设置的TCON完成特殊功能寄存器。 现在我们选择16位定时工作模式T最大定时只有65536us,即65.536ms,因此,我们必须通过软件来处理这个问题,假设我们不能达到我们需要的1秒定时。T最大定时为50ms,50次需要定时1秒,需要20次。ms的定时。我们可以用软件的方法来统计这20次。 因此,我们设定TMOD00000001B,即TMOD01H 下面我们要给T0定时/计数器TH0,TL0通过以下公式计算预置初始值 TH0(21650000)/256 。

16、TL0(21650000)MOD256 当T0工作时我们怎么样?知50ms的定时时间已到,这回我们通过检测TCON特殊功能寄存器中的TF0标志位,如果TF01表示定时时间已到。,程序框图,汇编源程序(查询法),SECONDEQU 30H TCOUNTEQU 31H ORG 00H START:MOV SECOND,#00H MOV TCOUNT,#00H MOV TMOD,#01H MOV TH0,#(65536-50000) / 256 MOV TL0,#(65536-50000) MOD 256 SETB TR0 DISP:MOV A,SECOND MOV B,#10 DIV AB 。

17、MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,B MOVC A,A+DPTR MOV P2,A,WAIT:JNB TF0,WAIT CLR TF0 MOV TH0,#(65536-50000) / 256 MOV TL0,#(65536-50000) MOD 256 INC TCOUNT MOV A,TCOUNT CJNE A,#20,NEXT MOV TCOUNT,#00H INC SECOND MOV A,SECOND CJNE A,#60,NEX MOV SECOND,#00H NEX:LJMP DISP NEXT:LJMP WAIT TABL。

18、E:DB FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END,C语言源程序(查询法),#include unsigned char code dispcode=0 x3f,0 x06,0 x5b,0 x4f, 0 x66,0 x6d,0 x7d,0 x07, 0 x7f,0 x6f,0 x77,0 x7c, 0 x39,0 x5e,0 x79,0 x71,0 x00; unsigned char second; unsigned char tcount; void main(void) TMOD=0 x01; TH0=(65536-50000)/256; TL。

19、0=(65536-50000)%256; TR0=1; tcount=0; second=0; P0=dispcodesecond/10; P2=dispcodesecond%10;,while(1) if(TF0=1) tcount+; if(tcount=20) tcount=0; second+; if(second=60) second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; TF0=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ,SECONDEQU 30H TCOUNTEQU 3。

20、1H ORG 00H LJMP START ORG 0BH LJMP INT0X START:MOV SECOND,#00H MOV A,SECOND MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,B MOVC A,A+DPTR MOV P2,A MOV TCOUNT,#00H MOV TMOD,#01H MOV TH0,#(65536-50000) / 256 MOV TL0,#(65536-50000) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $,汇编源程序(中断法),INT。

21、0X: MOV TH0,#(65536-50000) / 256 MOV TL0,#(65536-50000) MOD 256 INC TCOUNT MOV A,TCOUNT CJNE A,#20,NEXT MOV TCOUNT,#00H INC SECOND MOV A,SECOND CJNE A,#60,NEX MOV SECOND,#00H NEX:MOV A,SECOND MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,B MOVC A,A+DPTR MOV P2,A NEXT:RETI TABLE:DB 3F。

22、H,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END,#include unsigned char code dispcode=0 x3f,0 x06,0 x5b,0 x4f, 0 x66,0 x6d,0 x7d,0 x07, 0 x7f,0 x6f,0 x77,0 x7c, 0 x39,0 x5e,0 x79,0 x71,0 x00; unsigned char second; unsigned char tcount; void main(void) TMOD=0 x01; TH0=(65536-50000)/256; TL0=(65536-50000)%25。

23、6; TR0=1; ET0=1; EA=1; tcount=0; second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; while(1); ,C语言源程序(中断法),void t0(void) interrupt 1 using 0 tcount+; if(tcount=20) tcount=0; second+; if(second=60) second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; TH0=(65536-50000)/256; TL0=(65536-50000)%256; 。

24、,2.5 “嘀、嘀、”报警声,设计要求 用AT89S51单片机产生“嘀、嘀、”报警声从P1.0端口输出,产生频率为1KHz,根据下图可知:1KHZ方波从P1.0输出0.2秒,接着0.2秒从P1.0输出电平信号,如此循环下去,就形成我们所需的报警声了。,电路原理图,系统板硬件连线,1 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; 2 在“音频放大模块”区域中的SPK OUT端口上接上一个8欧或者是16欧的喇叭。,程序设计方法,1生活中我们常常到各种各样的报警声,例如“嘀、嘀、”就是常见的一种声音报警声,但对于这种报警声,嘀0.2秒钟,然后断0.2秒。

25、钟,如此循环下去,假设嘀声的频率为1KHz,则报警声时序图如下图所示:,上述波形信号如何用单片机来产生呢? 2 由于要产生上面的信号,我们把上面的信号分成两部分,一部分为1KHZ方波,占用时间为0.2秒;另一部分为电平,也是占用0.2秒;因此,我们利用单片机的定时/计数器T0作为定时,可以定时0.2秒;同时,也要用单片机产生1KHZ的方波,对于1KHZ的方波信号周期为1ms,高电平占用0.5ms,低电平占用0.5ms,因此也采用定时器T0来完成0.5ms的定时;最后,可以选定定时/计数器T0的定时时间为0.5ms,而要定时0.2秒则是0.5ms的400倍,也就是说以0.5ms定时400次就达到。

26、0.2秒的定时时间了。,主程序框图,中断服务程序框图,汇编源程序,T02SA EQU 30H T02SB EQU 31H FLAG BIT 00H ORG 00H LJMP START ORG 0BH LJMP INT_T0 START:MOV T02SA,#00H MOV T02SB,#00H CLR FLAG MOV TMOD,#01H MOV TH0,#(65536-500) / 256 MOV TL0,#(65536-500) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $,INT_T0: MOV TH0,#(65536-500) / 256 MOV 。

27、TL0,#(65536-500) MOD 256 INC T02SA MOV A,T02SA CJNE A,#100,NEXT MOV T02SA,#00H INC T02SB MOV A,T02SB CJNE A,#04H,NEXT ;MOV T02SA,#00H (不要) MOV T02SB,#00H CPL FLAG NEXT:JB FLAG,DONE CPL P1.0 DONE:RETI END,C语言源程序,#include unsigned int t02s; unsigned char t05ms; bit flag; void main(void) TMOD=0 x01; TH0=(65536-500)/256; TL0=(65536-500)%256; TR0=1; ET0=1; EA=1; while(1); ,void t0(void) interrupt 1 using 0 TH0=(65536-500)/256; TL0=(65536-500)%256; t02s+; if(t02s=400) t02s=0; flag=flag; if(flag=0) P1_0=P1_0;。

标签: 2sa1106晶体管2sb1293晶体管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台