单片机c语言学习好资料_第1页
单片机c语言学习好资料_第2页
单片机c语言学习好资料_第3页
单片机c语言学习好资料_第4页
单片机c语言学习好资料_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前言2基础知识单片机编程基础2第一节单数码管按键显示4第二节双数码管可调秒表6第三节十字路口交通灯6第四节数码管驱动7第五节键盘驱动8第六节低频频率计14第七节电子表17第八节串行口应用17基础知识单片机编程基础单片机的外部结构1、DIP40双列直插;2、P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3、电源VCC(PIN40)和地线GND(PIN20);4、高电平复位RESET(PIN9);(10UF电容接VCC与RESET,即可实现上电复位)5、内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)6、程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)7、P3支持第二功能RXD、TXD、INT0、INT1、T0、T1单片机内部I/O部件所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务1、四个8位通用I/O端口,对应引脚P0、P1、P2和P3;2、两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)3、一个串行通信接口;(SCON,SBUF)4、一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89X52H给出了SFR特殊功能寄存器所有端口的定义。教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。C语言编程基础1、十六进制表示字节0X5A二进制为01011010B;0X6E为01101110。2、如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。3、VAR表示对变量VAR先增一;VAR表示对变量后减一。4、X|0X0F表示为XX|0X0F5、TMODTMOD表示给变量TMOD的低四位赋值0X5,而不改变TMOD的高四位。6、WHILE1表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是在某引脚输出高电平的编程方法(比如P13(PIN4)引脚)INCLUDE/该头文档中有单片机内部资源的符号化定义,其中包含P13VOIDMAINVOID/VOID表示没有输入参数,也没有函数返值,这入单片机运行的复位入口P1_31/给P1_3赋值1,引脚P13就能输出高电平VCCWHILE1/死循环,相当LOOPGOTOLOOP注意P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。在某引脚输出低电平的编程方法(比如P27引脚)INCLUDE/该头文档中有单片机内部资源的符号化定义,其中包含P27VOIDMAINVOID/VOID表示没有输入参数,也没有函数返值,这入单片机运行的复位入口P2_70/给P2_7赋值0,引脚P27就能输出低电平GNDWHILE1/死循环,相当LOOPGOTOLOOP在某引脚输出方波编程方法(比如P31引脚)INCLUDE/该头文档中有单片机内部资源的符号化定义,其中包含P31VOIDMAINVOID/VOID表示没有输入参数,也没有函数返值,这入单片机运行的复位入口WHILE1/非零表示真,如果为真则执行下面循环体的语句P3_11/给P3_1赋值1,引脚P31就能输出高电平VCCP3_10/给P3_1赋值0,引脚P31就能输出低电平GND/由于一直为真,所以不断输出高、低、高、低,从而形成方波将某引脚的输入电平取反后,从另一个引脚输出(比如P04NOTP11)INCLUDE/该头文档中有单片机内部资源的符号化定义,其中包含P04和P11VOIDMAINVOID/VOID表示没有输入参数,也没有函数返值,这入单片机运行的复位入口P1_11/初始化。P11作为输入,必须输出高电平WHILE1/非零表示真,如果为真则执行下面循环体的语句IFP1_11/读取P11,就是认为P11为输入,如果P11输入高电平VCCP0_40/给P0_4赋值0,引脚P04就能输出低电平GNDELSE/否则P11输入为低电平GND/P0_40/给P0_4赋值0,引脚P04就能输出低电平GNDP0_41/给P0_4赋值1,引脚P04就能输出高电平VCC/由于一直为真,所以不断根据P11的输入情况,改变P04的输出电平将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出(比如P2NOTP3)INCLUDE/该头文档中有单片机内部资源的符号化定义,其中包含P2和P3VOIDMAINVOID/VOID表示没有输入参数,也没有函数返值,这入单片机运行的复位入口P30XFF/初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平WHILE1/非零表示真,如果为真则执行下面循环体的语句/取反的方法是异或1,而不取反的方法则是异或0P2P30X0F/读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出/由于一直为真,所以不断将P3取反输出到P2注意一个字节的8位D7、D6至D0,分别输出到P37、P36至P30,比如P30X0F,则P37、P36、P35、P34四个引脚都输出低电平,而P33、P32、P31、P30四个引脚都输出高电平。同样,输入一个端口P2,即是将P27、P26至P20,读入到一个字节的8位D7、D6至D0。第一节单数码管按键显示单片机最小系统的硬件原理接线图1、接电源VCC(PIN40)、GND(PIN20)。加接退耦电容01UF2、接晶体X1(PIN18)、X2(PIN19)。注意标出晶体频率(选用12MHZ),还有辅助电容30PF3、接复位RES(PIN9)。接上电复位电路,以及手动复位电路,分析复位工作原理4、接配置EA(PIN31)。说明原因。发光二极的控控制单片机I/O输出将一发光二极管LED的正极(阳极)接P11,LED的负极(阴极)接地GND。只要P11输出高电平VCC,LED就正向导通(导通时LED上的压降大于1V),有电流流过LED,至发LED发亮。实际上由于P11高电平输出电阻为10K,起到输出限流的作用,所以流过LED的电流小于(5V1V)/10K04MA。只要P11输出低电平GND,实际小于03V,LED就不能导通,结果LED不亮。开关双键的输入输入先输出高一个按键KEY_ON接在P16与GND之间,另一个按键KEY_OFF接P17与GND之间,按KEY_ON后LED亮,按KEY_OFF后LED灭。同时按下LED半亮,LED保持后松开键的状态,即ON亮OFF灭。INCLUDEDEFINELEDP11/用符号LED代替P1_1DEFINEKEY_ONP16/用符号KEY_ON代替P1_6DEFINEKEY_OFFP17/用符号KEY_OFF代替P1_7VOIDMAINVOID/单片机复位后的执行入口,VOID表示空,无输入参数,无返回值KEY_ON1/作为输入,首先输出高,接下KEY_ON,P16则接地为0,否则输入为1KEY_OFF1/作为输入,首先输出高,接下KEY_OFF,P17则接地为0,否则输入为1WHILE1/永远为真,所以永远循环执行如下括号内所有语句IFKEY_ON0LED1/是KEY_ON接下,所示P11输出高,LED亮IFKEY_OFF0LED0/是KEY_OFF接下,所示P11输出低,LED灭/松开键后,都不给LED赋值,所以LED保持最后按键状态。/同时按下时,LED不断亮灭,各占一半时间,交替频率很快,由于人眼惯性,看上去为半亮态数码管的接法和驱动原理一支七段数码管实际由8个发光二极管构成,其中7个组形构成数字8的七段笔画,所以称为七段数码管,而余下的1个发光二极管作为小数点。作为习惯,分别给8个发光二极管标上记号A,B,C,D,E,F,G,H。对应8的顶上一画,按顺时针方向排,中间一画为G,小数点为H。我们通常又将各二极与一个字节的8位对应,AD0,BD1,CD2,DD3,ED4,FD5,GD6,HD7,相应8个发光二极管正好与单片机一个端口PN的8个引脚连接,这样单片机就可以通过引脚输出高低电平控制8个发光二极的亮与灭,从而显示各种数字和符号;对应字节,引脚接法为APN0,BPN1,CPN2,DPN3,EPN4,FPN5,GPN6,HPN7。如果将8个发光二极管的负极(阴极)内接在一起,作为数码管的一个引脚,这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。否则,如果是将正极(阳极)内接在一起引出的,则称为共阳数码管,共同的引脚则称为共阳极,8个负极则为段极。以单支共阴数码管为例,可将段极接到某端口PN,共阴极接GND,则可编写出对应十六进制码的七段码表字节数据如右图16键码显示的程序我们在P1端口接一支共阴数码管SLED,在P2、P3端口接16个按键,分别编号为KEY_0、KEY_1到KEY_F,操作时只能按一个键,按键后SLED显示对应键编号。INCLUDEDEFINESLEDP1DEFINEKEY_0P20DEFINEKEY_1P21DEFINEKEY_2P22DEFINEKEY_3P23DEFINEKEY_4P24DEFINEKEY_5P25DEFINEKEY_6P26DEFINEKEY_7P27DEFINEKEY_8P30DEFINEKEY_9P31DEFINEKEY_AP32DEFINEKEY_BP33DEFINEKEY_CP34DEFINEKEY_DP35DEFINEKEY_EP36DEFINEKEY_FP37CODEUNSIGNEDCHARSEG7CODE16/用十六进数作为数组下标,可直接取得对应的七段编码字节/0123456789ABCDEF0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71VOIDMAINVOIDUNSIGNEDCHARI0/作为数组下标P20XFF/P2作为输入,初始化输出高P30XFF/P3作为输入,初始化输出高WHILE1IFKEY_00I0IFKEY_10I1IFKEY_20I2IFKEY_30I3IFKEY_40I4IFKEY_50I5IFKEY_60I6IFKEY_70I7IFKEY_80I8IFKEY_90I9IFKEY_A0I0XAIFKEY_B0I0XBIFKEY_C0I0XCIFKEY_D0I0XDIFKEY_E0I0XEIFKEY_F0I0XFSLEDSEG7CODEI/开始时显示0,根据I取应七段编码第二节双数码管可调秒表解只要满足题目要求,方法越简单越好。由于单片机I/O资源足够,所以双数码管可接成静态显示方式,两个共阴数码管分别接在P1(秒十位)和P2(秒个位)口,它们的共阴极都接地,安排两个按键接在P32(十位数调整)和P33(个位数调整)上,为了方便计时,选用12MHZ的晶体。为了达到精确计时,选用定时器方式2,每计数250重载一次,即250US,定义一整数变量计数重载次数,这样计数4000次即为一秒。定义两个字节变量S10和S1分别计算秒十位和秒个位。编得如下程序INCLUDECODEUNSIGNEDCHARSEG7CODE16/用十六进数作为数组下标,可直接取得对应的七段编码字节/0123456789ABCDEF0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71VOIDMAINVOIDUNSIGNEDINTUS2500UNSIGNEDCHARS100UNSIGNEDCHARS10UNSIGNEDCHARKEY100/记忆按键状态,为1按下UNSIGNEDCHARKEY10/记忆按键状态,为1按下/初始化定时器TIMER0TMODTMODTH1250/对于8位二进数来说,2506,也就是加250次1时为256,即为0TR11WHILE1/循环1P1SEG7CODES10/显示秒十位P2SEG7CODES1/显示秒个位WHILE1/循环2/计时处理IFTF01TF00IFUS2504000US2500IFS110S10IFS106S100BREAK/结束“循环2”,修改显示/按十位键处理P321/P32作为输入,先要输出高电平IFKEY101/等松键IFP321KEY100ELSE/未按键IFP320KEY101IFS106S100BREAK/结束“循环2”,修改显示/按个位键处理P331/P33作为输入,先要输出高电平IFKEY11/等松键IFP331KEY10ELSE/未按键IFP330KEY11IFS110S10BREAK/结束“循环2”,修改显示/循环2END/循环1END/MAINEND第三节十字路口交通灯如果一个单位时间为1秒,这里设定的十字路口交通灯按如下方式四个步骤循环工作60个单位时间,南北红,东西绿;10个单位时间,南北红,东西黄;60个单位时间,南北绿,东西红;10个单位时间,南北黄,东西红;解用P1端口的6个引脚控制交通灯,高电平灯亮,低电平灯灭。INCLUDE/SBIT用来定义一个符号位地址,方便编程,提高可读性,和可移植性SBITSNREDP10/南北方向红灯SBITSNYELLOWP11/南北方向黄灯SBITSNGREENP12/南北方向绿灯SBITEWREDP13/东西方向红灯SBITEWYELLOWP14/东西方向黄灯SBITEWGREENP15/东西方向绿灯/用软件产生延时一个单位时间/VOIDDELAY1UNITVOIDUNSIGNEDINTI,JFORI0IUNSIGNEDCHARDISBUF8/全局显示缓冲区,DISBUF0对应右SLED,DISBUF7对应左SLED,VOIDDISPLAYBRUSHVOIDCODEUNSIGNEDCHARCATHODE80XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F/阴极控制码CODEUNSIGNEDCHARSEG7CODE16/用十六进数作为数组下标,可直接取得对应的七段编码字节0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71STATICUNSIGNEDCHARI0/(0I7)循环刷新显示,由于是静态变量,此赋值只做一次。P20XFF/显示消隐,以免下一段码值显示在前一支SLEDP1SEG7CODEDISBUFI/从显示缓冲区取出原始数据,查表变为七段码后送出显示P2CATHODEI/将对应阴极置低,显示IFI8I0/指向下一个数码管和相应数据VOIDTIMER0INTROUTEVOIDINTERRUPT1TL01000/由于TL0只有8BITS,所以将(1000)低8位赋给TL0TH010008/取(1000)的高8位赋给TH0,重新定时1MSDISPLAYBRUSHVOIDTIMER0INITVOIDTMODTMOD/初始化,定时器T0,工作方式1TL01000;/定时1MSTH010008TR01/允许T0开始计数ET01/允许T0计数溢出时产生中断请求VOIDDISPLAYUNSIGNEDCHARINDEX,UNSIGNEDCHARDATAVALUEDISBUFINDEXDATAVALUEVOIDMAINVOIDUNSIGNEDCHARIFORI0I,描述可用函数,如下IFNDEF_KEY_H_/防止重复引用该文档,如果没有定义过符号_KEY_H_,则编译下面语句DEFINE_KEY_H_/只要引用过一次,即INCLUDE,则定义符号_KEY_H_UNSIGNEDCHARKEYHITVOID/如果按键,则返回非,否则返回UNSIGNEDCHARKEYGETVOID/读取按键值,如果没有按键则等待到按键为止VOIDKEYPUTUNSIGNEDCHARUCKEYVAL/保存按键值UCKEYVAL到按键缓冲队列末VOIDKEYBACKUNSIGNEDCHARUCKEYVAL/退回键值UCKEYVAL到按键缓冲队列首ENDIF定义函数体文档KEYC,如下INCLUDE“KEYH”DEFINEKEYBUFSIZE16/定义按键缓冲队列字节数UNSIGNEDCHARKEYBUFKEYBUFSIZE/定义一个无符号字符数组作为按键缓冲队列。该队列为先进/先出,循环存取,下标从到KEYBUFSIZE1UNSIGNEDCHARKEYBUFWP0/作为数组下标变量,记录存入位置UNSIGNEDCHARKEYBUFRP0/作为数组下标变量,记录读出位置/如果存入位置与读出位置相同,则表明队列中无按键数据UNSIGNEDCHARKEYHITVOIDIFKEYBUFWPKEYBUFRPRETURN0ELSERETURN1UNSIGNEDCHARKEYGETVOIDUNSIGNEDCHARRETVAL/暂存读出键值WHILEKEYHIT0/等待按键,因为函数KEYHIT的返回值为0表示无按键RETVALKEYBUFKEYBUFRP/从数组中读出键值IFKEYBUFRPKEYBUFSIZEKEYBUFRP0/读位置加,超出队列则循环回初始位置RETURNRETVALVOIDKEYPUTUNSIGNEDCHARUCKEYVALKEYBUFKEYBUFWPUCKEYVAL/键值存入数组IFKEYBUFWPKEYBUFSIZEKEYBUFWP0/存入位置加,超出队列则循环回初始位置/由于某种原因,读出的按键,没有用,但其它任务要用该按键,但传送又不方便。此时可以退回按键队列。就如取错了信件,有必要退回一样/VOIDKEYBACKUNSIGNEDCHARUCKEYVAL/如果KEYBUFRP0减1后则为FFH,大于KEYBUFSIZE,即从数组头退回到数组尾。或者由于干扰使得KEYBUFRP超出队列位置,也要调整回到正常位置,/IFKEYBUFRPKEYBUFSIZEKEYBUFRPKEYBUFSIZE1KEYBUFKEYBUFRPUCKEYVAL/回存键值下面渐进讲解键盘物理层的驱动。电路共同点P2端口接一共阴数码管,共阴极接GND,P20接A段、P21接B段、P27接H段。软件共同点CODEUNSIGNEDCHARSEG7CODE10是七段数码管共阴编码表。CODEUNSIGNEDCHARSEG7CODE16/0123456789ABCDEF0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71例一P10接一按键到GND,键编号为,显示按键。INCLUDEINCLUDE“KEYH”VOIDMAINVOIDP1_01/作为输入引脚,必须先输出高电平WHILE1/永远为真,即死循环IFP1_00/如果按键,则为低电平KEYPUT6/保存按键编号值为按键队列WHILEP1_00/如果一直按着键,则不停地执行该循环,实际是等待松键IFKEYHIT0/如果队列中有按键P2SEG7CODEKEYGET/从队列中取出按键值,并显示在数码管上例二在例一中考虑按键20MS抖动问题。INCLUDEINCLUDE“KEYH”VOIDMAINVOIDP1_01/作为输入引脚,必须先输出高电平WHILE1/永远为真,即死循环IFP1_00/如果按键,则为低电平DELAY20MS/延时20MS,跳过接下抖动KEYPUT6/保存按键编号值为按键队列WHILEP1_00/如果一直按着键,则不停地执行该循环,实际是等待松键DELAY20MS/延时20MS,跳过松开抖动IFKEYHIT0/如果队列中有按键P2SEG7CODEKEYGET/从队列中取出按键值,并显示在数码管上例三在例二中考虑干扰问题。即小于20MS的负脉冲干扰。INCLUDEINCLUDE“KEYH”VOIDMAINVOIDP1_01/作为输入引脚,必须先输出高电平WHILE1/永远为真,即死循环IFP1_00/如果按键,则为低电平DELAY20MS/延时20MS,跳过接下抖动IFP1_01CONTINUE/假按键KEYPUT6/保存按键编号值为按键队列WHILEP1_00/如果一直按着键,则不停地执行该循环,实际是等待松键DELAY20MS/延时20MS,跳过松开抖动IFKEYHIT0/如果队列中有按键P2SEG7CODEKEYGET/从队列中取出按键值,并显示在数码管上例四状态图编程法。通过20MS周期中断,扫描按键。/采用晶体为12KHZ时,指令周期为1MS(即主频为1KHZ),这样T0工作在定时器方式2,8位自动重载。计数值为20,即可产生20MS的周期性中断,在中断服务程序中实现按键扫描/INCLUDEINCLUDE“KEYH”VOIDMAINVOIDTMOD(TMOD/不改变T1的工作方式,T0为定时器方式2TH020/计数周期为20个主频脉,即20MSTL0TH0/先软加载一次计数值TR01/允许T0开始计数ET01/允许T0计数溢出时产生中断请求EA1/允许CPU响应中断请求WHILE1/永远为真,即死循环IFKEYHIT0/如果队列中有按键P2SEG7CODEKEYGET/从队列中取出按键值,并显示在数码管上VOIDTIMER0INTVOIDINTERRUPT1/20MS;T0的中断号为1STATICUNSIGNEDCHARSTS0P1_01/作为输入引脚,必须先输出高电平SWITCHSTSCASE0IFP1_00STS1BREAK/按键则转入状态1CASE1IFP1_01STS0/假按错,或干扰,回状态0ELSESTS2KEYPUT6/确实按键,键值入队列,并转状态2BREAKCASE2IFP1_01STS3BREAK/如果松键,则转状态3CASE3IFP1_00STS2/假松键,回状态2ELSESTS0/真松键,回状态0,等待下一次按键过程例五状态图编程法。/如果采用晶体为12MHZ时,指令周期为1US(即主频为1MHZ),要产生20MS左右的计时,则计数值达到20000,T0工作必须为定时器方式1,16位非自动重载,即可产生20MS的周期性中断,在中断服务程序中实现按键扫描/INCLUDEINCLUDE“KEYH”VOIDMAINVOIDTMOD(TMOD/不改变T1的工作方式,T0为定时器方式1TL020000/计数周期为20000个主频脉,自动取低8位TH0200008/右移8位,实际上是取高8位TR01/允许T0开始计数ET01/允许T0计数溢出时产生中断请求EA1/允许CPU响应中断请求WHILE1/永远为真,即死循环IFKEYHIT0/如果队列中有按键P2SEG7CODEKEYGET/从队列中取出按键值,并显示在数码管上VOIDTIMER0INTVOIDINTERRUPT1/20MS;T0的中断号为1STATICUNSIGNEDCHARSTS0TL020000/方式1为软件重载TH0200008/右移8位,实际上是取高8位P1_01/作为输入引脚,必须先输出高电平SWITCHSTSCASE0IFP1_00STS1BREAK/按键则转入状态1CASE1IFP1_01STS0/假按错,或干扰,回状态0ELSESTS2KEYPUT6/确实按键,键值入队列,并转状态2BREAKCASE2IFP1_01STS3BREAK/如果松键,则转状态3CASE3IFP1_00STS2/假松键,回状态2ELSESTS0/真松键,回状态0,等待下一次按键过程例六4X4按键。/由P1端口的高4位和低4位构成4X4的矩阵键盘,本程序只认为单键操作为合法,同时按多键时无效。这样下面的X,Y的合法值为0X7,0XB,0XD,0XE,0XF,通过表KEYCODE影射变换可得按键值P100XEP110XDP120XBP130X7P14EP15DP16BP177123456789ABCDEF10/INCLUDEINCLUDE“KEYH”UNSIGNEDCHARKEYSCANVOID/返回0表示无按键,或无效按键,其它值为按键编码值CODEUNSIGNEDCHARKEYCODE16/0X0,0X1,0X2,0X3,0X4,0X5,0X6,0X7,0X8,0X9,0XA,0XB,0XC,0XD,0XE,0XF0,0,0,0,0,0,0,1,0,0,0,2,0,3,4,0UNSIGNEDCHARX,Y,RETVALP10X0F/低四位输入,高四位输出0XP1/P1输入后,清高四位,作为X值P10XF0/高四位输入,低四位输出0YP14/P1输入后移位到低四位,并清高四位,作为Y值RETVALKEYCODEX4KEYCODEY/根据本公式倒算按键编码IFRETVAL0RETURN0ELSERETURNRETVAL4/比如按键1,得X0X7,Y0X7,算得RETVAL5,所以返回函数值1。/双如按键7,得X0XB,Y0XD,算得RETVAL11,所以返回函数值7。VOIDMAINVOIDTMOD(TMOD/不改变T1的工作方式,T0为定时器方式1TL020000/计数周期为20000个主频脉,自动取低8位TH0200008/右移8位,实际上是取高8位TR01/允许T0开始计数ET01/允许T0计数溢出时产生中断请求EA1/允许CPU响应中断请求WHILE1/永远为真,即死循环IFKEYHIT0/如果队列中有按键P2SEG7CODEKEYGET/从队列中取出按键值,并显示在数码管上VOIDTIMER0INTVOIDINTERRUPT1/20MS;T0的中断号为1STATICUNSIGNEDCHARSTS0TL020000/方式1为软件重载TH0200008/右移8位,实际上是取高8位P1_01/作为输入引脚,必须先输出高电平SWITCHSTSCASE0IFKEYSCAN0STS1BREAK/按键则转入状态1CASE1IFKEYSCAN0STS0/假按错,或干扰,回状态0ELSESTS2KEYPUTKEYSCAN/确实按键,键值入队列,并转状态2BREAKCASE2IFKEYSCAN0STS3BREAK/如果松键,则转状态3CASE3IFKEYSCAN0STS2/假松键,回状态2ELSESTS0/真松键,回状态0,等待下一次按键过程第六节低频频率计实例目的学时定时器、计数器、中断应用说明选用24MHZ的晶体,主频可达2MHZ。用T1产生100US的时标,T0作信号脉冲计数器。假设晶体频率没有误差,而且稳定不变(实际上可达万分之一);被测信号是周期性矩形波(正负脉冲宽度都不能小于05US),频率小于1MHZ,大于1HZ。要求测量时标1S,测量精度为01。解从测量精度要求来看,当频率超过1KHZ时,可采用1S时标内计数信号脉冲个数来测量信号频,而信号频率低于1KHZ时,可以通过测量信号的周期来求出信号频率。两种方法自动转换。对于低于1KHZ的信号,信号周期最小为1MS,也就是说超过1000US,而我们用的定时器计时脉冲周期为05US,如果定时多计或少计一个脉冲,误差为1US,所以相对误差为1US/1000US01。信号周期越大,即信号频率越低,相对误差就越小。从上面描述来看,当信号频率超过1KHZ后,信号周期就少于1000US,显然采用上面的测量方法,不能达到测量精度要求,这时我们采用1S单位时间计数信号的脉冲个数,最少能计到1000个脉冲,由于信号频率不超过1MHZ,而我们定时脉冲为2MHZ,最差多计或少计一个信号脉冲,这样相对误差为1/1000,可见信号频率越高,相对误差越小。信号除输入到T1(P35)外,还输入到INT1(P33)。UNSIGNEDINTUS100/对100US时间间隔单位计数,即有多少个100US。UNSIGNEDCHARSECONDUNSIGNEDINTK64/对64K单位计数,即有多少个64KUNSIGNEDCHAROLDT0UNSIGNEDINTOLDUS,OLDK64,OLDT1UNSIGNEDLONGFCY/存放频率值,单位为HZBITHIGHLOW1/1表示信号超过1KHZ;0表示信号低于1KHZ。VOIDINITIALHIGHVOIDIE0IP0HIGHLOW1TMODTMODTH0200TL0TH0PX01T01TMODTMODTH10TL10T11ET11US1000SECOND0K640OLDK640OLDT10TCON|0X50/同时置TR01TR11EA1VOIDINITIALLOWVOIDIE0IP0HIGHLOW0TMODTMODTH0200TL0TH0ET01TR01INT11IT11EX11US1000SECOND0K640OLDK640OLDT10EA1VOIDT0INTRVOIDINTERRUPT1IFHIGHLOW0US100ELSEIFUS10010000UNSIGNEDINTTMP1,TMP2TR10TMP1TH11000LINITALHIGH/修改T0的中断服务程序,让它在完成时标的功能时,同时完成数码管显示刷新VOIDT0INTRVOIDINTERRUPT1STATICUNSIGNEDCHARMS0IFHIGHLOW0US100ELSEIFUS10010000UNSIGNEDINTTMP1,TMP2TR10TMP1TH110MS0DISPLAYBRUSH/1MS数码管刷新第七节电子表单键可调电子表主要学习编程方法。外部中断应用,中断嵌解电子表分为工作状态和调整状态。平时为工作状态,按键不足一秒,接键为换屏S。按键超过一秒移位则进入调整状态C,而且调整光标在秒个位开始。调整状态时,按键不足一秒为光标移动M,超过一秒则为调整读数,每05秒加一A,直到松键;如果10秒无按键则自动回到工作状态W。如果有年、月、日、时、分、秒。四联数码管可分三屏显示,显示格式为“年月”、“日时”、“分秒”,从小数点的位置来区分显示内容。(月份的十位数也可以用“”和“1”表示)。ENUMSTATUSWORK,CHANGE,ADD,MOVE,SCREEN/状态牧举/计时和调整都是对下面时间数组TIME进行修改UNSIGNEDCHARTIME120,4,0,6,1,0,0,8,4,5,3,2;/04年06月10日08时45分32秒UNSIGNEDCHARCURSOR12/指向秒个位,0时无光标UNSIGNEDCHARYMDHMS3/指向“分秒”显示,0时无屏显STATICUNSIGNEDCHARSTSWORK/如果CURSOR不为0,装入DISBUF的对应数位,按02秒周期闪烁,即设一个01秒计数器S01,S01为奇数时灭,S01为偶数时亮。小数点显示与

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论