欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C51单片机C语言编程基础和实例.docx

    • 资源ID:68332974       资源大小:81.20KB        全文页数:55页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C51单片机C语言编程基础和实例.docx

    基础知识:C51单片机编程基础单片机的外部结构:1 . DIP40双列直插;2 . PO, PI, P2, P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3 .电源 V8 (PIN40)和地线 GND (PIN20);4 .髙电平复位RESET (PI N9) ; (10uF电容接V8与RESET,即可实现上电复位)5 .内置振荡电路,外部只要接晶体至X1 (PIN18)和XO (PIN19);(频率为主频的 12倍)6 .程序配置EA (PIN31)接高电平V8;(运行单片机内部ROM中的程序)7 . P3 支持第二功能:RXD、TXD、INTO、INT!、TO、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件, 完成指定任务)1 .四个8位通用I/O端口,对应引脚PO、PI、P2和P3;2 .两个 16 位定时计数器;(TMOD, TOON, TLO, THO, TL1, TH1)3 . 一个串行通信接口; (SOON, SBUF)4 . 个中断控制器;(IE, IP)针对AT89c52单片机,头文件AT89x52.h给出了 SFR特殊功能寄存器所有端口 的定义。C语言编程基础;1.十六进制表示字节0x5a:二进制为0101101OB: 0x6E为01101110。2. 如果将一个16位二进数赋给个8位的字节变量,则自动截断为低8位,而丢掉 髙8位。3. + + var表示对变量var先增;var表示对变量后减。4. x |= OxOf;表示为 x = x | OxOf;5. TMOD = ( TMOD & OxfO ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变 TMOD的高四位。6. While( 1 );表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是 ;在某引脚输出高电平的编程方法:(比如P1.3 (PIN4)引脚)代码1. #include 该头文档中有单片机内部资源的符号化定义,其中包含P1.32. . void main ( void ) /void发示没有输入参数,也没有函数返值,这入单片机运行的复 位入口3. (4. . Pl_3 = 1;/给Pl_3赋值1,引脚P1.3就能输岀髙电平VCC5. While ( 1 ) ;/死循环,相当 LOOP: goto LOOP;6. 1注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至V8电 源。在某引脚输出低电平的编程方法:(比如P2.7引脚)代码1. #include 该头文档中有单片机内部资源的符号化定义,其中包含P2.72. . void main ( void ) /void表示没仃输入参数,也没有函数返值,这入单片机运行的复 位入口3. (4. P2_7 = 0;/给P2_赋值。,引脚P2.就能输出低电平GND5. While ( 1 ) ;/死循环,相当 LOOP: goto LOOP;6. .在某引脚输出方波编程方法:(比如P3.1引脚)代码1. #include 该头文档中有单片机内部资源的符号化定义,其中包含P3.12. . void main ( void ) /void表示没有输入参数,也没仃函数返值,这入单片机运行的复 位入口3. (4. While ( 1 )/非零表示真,如果为真则执行面循环体的语句6. P3_l = 1;/给P3_l赋值1,引脚P3.1就能输出髙电平VCC7. P3_l = 0; /给P3_l赋值0,引脚P3.1就能输出低电平GND8. /由于一直为真,所以不断输出髙、低、髙、低.,从而形成方波9. 将某引脚的输入电平取反后,从另个引脚输出:(比如P0.4= NOT( P1.1) 代码1. #include 该头文档中有单片机内部资源的符号化定义,其中包含PO. 4和Pl. 12. . void main ( void ) /void表示没仃输入参数,也没有函数返值,这入单片机运行的复 位入口3. (4. Pl_l = 1;/初始化。P1.1作为输入,必须输出髙电平5. While ( 1 ) /非零表示真,如果为真则执行下面循环体的语句6. 17. if (Pl_l= 1)/读取Pl.l,就是认为Pl.l为输入,如果Pll输入高电平VCC8. P0_4=0;/给P0_4赋值,引脚P0.4就能输岀低电平GND9. else 否则P1.1输入为低电平GND10. / P0_4= 0; 给P0_4赋值0,弓I脚P0.4就能输出低电平GND11. P0_4=1;/给P0_4赋值1,引脚P0.4就能输出髙电平VCC12./由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输岀电平13. 将某端口 8个引脚输入电平,低四位取反后,从另个端口 8个引脚输出:(比如 P2 = NOT( P3 )代码1. #include 该头文档中有单片机内部资源的符号化定义,其中包含P2和P32. . void main ( void ) /void表示没有输入参数,也没有函数返位,这入单片机运行的爱 位入口3. (4. P3 = Oxff; /初始化。P3作为输入,必须输出高电平,同时给P3 口的8个引脚输出高 电平5. While ( 1 ) 非零表示真,如果为真则执行下面循环体的语句6. (/取反的方法是异或1,而不取反的方法则是异或。7. P2 = P3OxOf /读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出8. /由于一直为真,所以不断将P3取反输出到P29. )注意:个字节的8位D7、D6至DO,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则 P3.7、P3.6、P3.5、P3.4 四个引脚都输出低电平,而 P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口 P2,即是将P2.7、P2.6至P2.0,读入到个字节的8位D7、D6至DO。#eeOOOO; FONT-FAMILY:宋体”初始化。pi . 1作为输入,必须输出高电平5. While ( 1 )/非零表示真,如果为真则执行下面循环体的语句6. (7. if (Pl-l= 1)/读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC8. P0_4= 0;/给P0_4赋值,引脚P0.4就能输出低电平GND9. else /否则Pl.1输入为低电平GND10. / P0_4 = 0; /给P0_4赋值0,引脚P0.4就能输出低电平GND11. P0_4= 1;/给P0_4赋值1,I脚P0.4就能输出高电平VCC12. /由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平13. 将某端口 8个引脚输入电平,低四位取反后,从另个端口 8个引脚输出:(比如 P2 = NOT( P3 )代码1. #include 该头文档中有单片机内部资源的符号化定义,其中包含P2和P32. void main( void ) /void表示没有输入参数,也没有函数返值,这入单片机运行的复 位入口3. 14. P3 = Oxff; /初始化。P3作为输入,必须输制髙电平,同时给P3 ”的8个引脚输岀髙 电平6. (/取反的方法是异或1,而不取反的方法则是异或7. P2 = P30xOf 读収P3,就是认为P3为输入,低四位异或者1,即取反,然后输出8. /由于一直为真,所以不断将P3取反输出到P29. 注意:个字节的8位D7、D6至DO,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f»则 P3.7、P3.6、P3.5、P3.4 四个引脚都输出低电平,而 P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口 P2,即是将P2.7、P2.6 至P2.0,读入到个字节的8位D7、D6至DO。第一节:单数码管按键显示单片机最小系统的硬件原理接线图:1 . 接电源:V8(PIN4O)、GND (PIN20)。加接退耦电容 0.1uF2 .接晶体:X1 (PIN18) , X2 (PIN19) «注意标出晶体频率(选用12MHz),还有 辅助电容30pF3 .接复位:RES (PIN9) 接上电复位电路,以及手动复位电路,分析复位工作原理4 .接配置:EA (PIN31) »说明原因。发光二极的控制:单片机I/O输出将发光二极管LED的正极(阳极)接P1.1, LED的负极(阴极)接地GND。只要P1.1输出高电平V8, LED就正向导通(导通时LED上的压降大于1V), 有电流流过LED,至发LED发亮。实际上由于P1.1高电平输出电阻为10K,起 到输出限流的作用,所以流过LED的电流小于(5V-1V) /10K= 0.4mAo只要 P1.1输出低电平GND,实际小于0.3V, LED就不能导通,结果LED不亮。开关双键的输入:输入先输出高个按键KEY_ON接在P1.6与GND之间,另个按键KEYJDFF接P1.7与GND 之间,按KEGON后LED亮,按KE£OFF后LED灭。同时按下LED半亮,LED 保持后松开键的状态,即ON亮FF灭。代码1. #include2. #define LED P1A1 用符号 ED 代替3. #define KEY_ON P1A6用符号 KEY_ON 代替 Pl_64. . #define KEY_OFF P1A7用符号 KEY_OFF 代替 Pl_5. . void main( void )/单片机复位后的执行入口,void表示空,无输入参数,无返回值6. (7. KEY_ON = 1; 作为输入,首先输出髙,接下KEY_ON, P1.6则接地为0,杏则输入为18. KEY_OFF = 1; /作为输入,首先输出髙,接下KEY_OFF, P1.则接地为0,否则输入10. (11. . if ( KEY_ON=0 ) LED=1; /是 KEY_ON 接下,所示 Pl. 1 输出髙,LED 亮12. if ( KEY_OFF=0 ) LED=0; / / 是 KEY_OFF 接下,所示 Pl. 1 输 111 低,LED 灭13. /松开键后,都不给LED赋值,所以LED保持最后按键状态。14. /同时按下时,LED不断亮火,各占一半时间,交替频率很快,由于人眼惯性,看上去为半亮 态15. 数码管的接法和驱动原理支七段数码管实际由8个发光二极管构成,其中7个组形构成数字8的七 段笔画,所以称为七段数码管,而余下的1个发光二极管作为小数点。作为习惯, 分别给8个发光二极管标上记号:a,b,c,d,e,f,g,h。对应8的顶上一画,按顺时 针方向排,中间一画为g,小数点为h。我们通常又将各二极与一个字节的8位对应,a(DO),b(D1),c( D2) ,d(D3) ,e(D4) ,f(D5),g(D6),h(D7),相应 8 个发光二极管正好与单片机个端口 Pn的8个引脚连接,这样单片机就可以通过引脚输出高低电 平控制8个发光二极的亮与灭,从而显示各种数字和符号;对应字节,引脚接法 为:a(Pn.O), b(Pn.1), c(Pn.2), d(Pn.3), e(Pn.4), f(Pn.5), g(Pn.6), h(Pn.7)0 如果将8个发光二极管的负极(阴极)内接在起,作为数码管的个引脚, 这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。否则,如果是将正极(阳极)内接在起引出的,则称为共阳数码管,共同的引脚则称为共阳极,8个负极则为段极。以单支共阴数码管为例,可将段极接到某端口 Pn,共阴极接GND,则可编写 出对应十六进制码的七段码表字节数据如右图:16键码显示的程序我们在P1端口接支共阴数码管SLED,在P2、P3端口接16个按键,分别编 号为KEY_O, KBC1到KBGF,操作时只能按个键,按键后SLED显示对应键 编号。代码1. #include2. . #define SLED Pl3. #define KEY_0P2Ao4. .#define KEY_1P2A15. #define KEY_2P2A26. #define KEY_3P2A37. .#define KEY_4P2A48. #define KEY_5P2A59. #define KEY_6P2A610. #define KEY_7P2A711. #define KEY_8 P3A012. #define KEY_9 P3A113. #define KEY_A P3A214. #define KEY_B P3A315. #define KEY_C P3A416. #define KEY_D P3A5#define KEY_E P3A618.#define KEY_F P3A719. . Code unsigned char Seg7Code 16 = /用|一六进数作为数组下标,可直接取得对应的七段编码字节20. / 012345678 9AbC d E F21. 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71;22. void main( void )23. (24. . unsigned char i=0; /作为数组下标25. P2 = Oxff; P2作为输入,初始化输出高26. P3 = Oxff; /P3作为输入,初始化输出高29. if ( KEY_O = 0 ) i=0; if ( KEY=0 ) i=l;30. if(KEY_2=0)i=2;if(KEY_3=0)i=3;31. if(KEY_4=0)i=4;if(KEY_5=0)i=5;32. if(KEY_6=0)i=6;if(KEY_7=0)i=7;33. if(KEY_8=0)i=8;if(KEY_9=0)i=9;34. if(KEY_A=0)i=0xA;if(KEY_B=0)i=OxB;35. if(KEY_C=0)i=0xC;if(KEY_D=0)i=OxD;36. if(KEY_E=0)i=0xE;if(KEY_F=0)i=0xF;37. SLED = Seg7Code i ; /开始时显示。,根据i取应七段编码38. 39. 第二节:双数码管可调秒表解:只要满足题冃要求,方法越简单越好。由于单片机I/O资源足够,所以双数 码管可接成静态显示方式,两个共阴数码管分别接在P1 (秒十位)和P2 (秒个 位),它们的共阴极都接地,安排两个按键接在P3.2 (十位数调整)和P3.3(个位数调整)上,为了方便计时,选用12MHz的晶体。为了达到精确计时,选用定时器方式2,每计数250重载一次,即250US,定义一整数变量计数重载次数,这样计数4000次即为一秒。定义两个字节变量S10和S1分别计算秒十位和秒个位。编得如下程序:代码1. #include2. . Code unsigned char Seg7Code 16 = /用卜六进数作为数组下标,可直接取得对应的 七段编码字节3. / 0123456789 A bC d E F4. 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71;5. . void main( void )6. (7. . unsigned int us250 = 0;8. unsigned char slO = 0;9. unsigned char si = 0;10. . unsigned char keylO = 0; /记忆按键状态,为1按下11. unsigned char keyl = 0;/记忆按键状态,为1按下12. 初始化定时器TimerO13. TMOD = (TMOD & 0xF0) | 0x02;14. TH1 = -250; 对于8位 观数朿说,-250 = 6,也就是加250次1时为256,即为017. Pl = Seg7Code slO ; /显示秒十位18. P2 = Seg7Code si ; /显示秒个位19. while ( 1 )/循环 220. /计时处理21. if( TFO = 1 )22. TFO = 0;23. if ( +US250 >= 4000 ) (24. us250 = 0;25. if( +sl >= 10 )26. si - 0;27. if ( +S10 >= 6 ) slO = 0;28. break; / /,結朿 、 循环2 ,修改显示30. 31. 32. /按十位键处理33. P3.2 = 1;/P3.2作为输入,先要输岀髙电平34. if ( keylO = 1 ) /等松键36. 37. else /未按键38. if( P3.2 = 0 )39. .keylO = 1;40. if( +slO >- 6 ) slO = 0;41. break; /结束、循环2”,修改显示42. 43. 44. /按个位键处理45. P3.3 = 1;/P3.3作为输入,先要输出高电平46. if ( keyl = 1 ) /等松键47. if( P3.3 = 1 ) keyl=O; )48. else /未按键49. if( P3.3 = 0 ) keyl = 1;50. if( +sl >= 10 ) si = 0;J.break; /”束、循、2,修改旧小52.54.55. /循环l'end56. /main* end第三节:十字路口交通灯如果个单位时间为1秒,这里设定的十字路口交通灯按如下方式四个步骤循环工作:60个单位时间,南北红,东西绿;X10个单位时间,南北红,东西黄;入60个单位时间,南北绿,东西红;X10个单位时间,南北黄,东西红;X解:用P1端口的6个引脚控制交通灯,高电平灯亮,低电平灯灭。代码1 . #include2 ./sbit用来定义个符号位地址,方便编程,提高可读性,和可移植性3 . sbit SNRed =P1 A0; 南北方向纟.灯4 . sbit SNYellow =P1A1;/南北方向黄灯5 . sbit SNGreen =P1 A2;/南北方向绿灯6 . sbit EWRed =P1 A3;/东西方向红灯7 . sbit EWYellow =P1A4;/东西方向黄灯8 . sbit EWGreen =P1 A5;/东西方向绿灯9.10111213141516171819202122232425/用软件产生延时个单位时间/. void DelaylUnit( void ) 1. unsigned int i, j;. for( i=0; i<1000; i+ ). for ( j<0; j<1000; j+ ) ; /通过实测,调整j循环次数,产生1ms延时./还可以通过生成汇编程序来计算指令周期数,结合晶体频率来调整j循环次数,接近1ms. ./延时n个单位时间/. void Delay( unsigned int n ) for( ; n!=0; n- ) DelaylUnit(); .void main( void ).(. while( 1 ).(. SNRed=0; SNYellow=0; SNGreen=l; EWRed=l; EWYellow=0; EWGreen=0; De lay ( 60 );. SNRed=0; SNYellow=l; SNGreen=0; EWRed=l; EWYellow=0; EWGreen=0; De lay( 10 );. SNRed=l; SNYellow=0; SNGreen=0; EWRed=0; EWYellow=0; EWGreen=l; Delay( 60 );26.SNRed=l; SNYellow=0; SNGreen=O; EWRed=O; EWYellow=l; EWGreen=O; Delay( 10 );27. )28. 第四节:数码管驱动显示“12345678”P1端口接8联共阴数码管SLED8的段极:P1.7接段h,,P1.0接段aP2端口接8联共阴数码管SLED8的段极:P2.7接左边的共阴极,,P2.0接右边的共阴极方案说明:晶振频率fosc=12MHz,数码管采用动态刷新方式显示,在1ms定时 断服务程序中实现代码1. #include2. . unsigned char DisBuf 8 ;/全局显示缓冲区,DisBuf 对应右SLED,DisBuf 对应左SLED,3. . void DisplayBrush( void )4. . code unsigned char cathode8=0xfe,0xfd,0xfb,0xf7,0xefr Oxdf,Oxbf,0x7f; /阴极控制码5. . Code unsigned char Seg7Code 16 = /用十六进数作为数组下标,可直接取得对应的七段编码字节6. .0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39, Ox5e,0x79,0x71);7. . static unsigned char i = 0; / (0<i7 )箱环刷新显示,由于是静态变量,此赋值 只做一次。8. P2 = Oxff; 显示消隐,以免下一段码值显示在前支S耳陋9. Pl = Seg7Code DisBuf i; 从显示线冲区取出原始数据,査表变为七段码后送出 显示10. . P2 = cathode i ;/将对应阴极置低,显示11. if ( +i >= 8 ) i=0;/指向下一个数码管和相应数据12. 13. void TimerOIntRoute( void ) interrupt 114. (15. TLO = -1000;/由于 TLO 只有 8bits,所以將(-1000)低 8 位赋给 TL016. TH0 = (-1000) >>8; /取(-1000)的髙 8 位赋给 THO, ®新定时 1ms17. DisplayBrush();18. 19. void TimerOInit( void )20. TMOD= (TMOD & OxfO) | 0x01; 初始化,定时器 TO,工作方式 121. TL0 = -1000;/定时 1ms22. TH0(-1000)»8;23. TRO1;/允许TO开始计数24. ETO = 1;/允许TO计数溢出时产生中断请求25. 26. void Display( unsigned char index, unsigned char dataValue ) DisBuf index = dataValue; 2" 1. void main( void )28. (29. 9 . unsigned char i;30. . for ( i=0; i<8; i+ ) Display (i, 8-i) ; /DisBuf 为右,DisBuf7为左31. TimerOInit();32. EA = 1:允许CPU响应中断请求33. While(1);34. 第五节:键盘驱动指提供些函数给任务调用,获取按键信息,或读取按键值。定义一个头文档,描述可用函数,如下:代码1 . #ifndef _KEY_H_ 防止重复引用该文档,如果没有定义过符号.KEY_H_,则编译下面 语句2 . #define _KEY_H_ 只要引用过一次,即#include ,则定义符号_KEY_H_3 .unsigned char keyHit ( void ) ; /如果按键,则返冋非,否则返回4 .unsigned char keyGet ( void ) ; /i实取按键值,如果没有按键则等待到按犍为止5 .void keyPut ( unsigned char ucKeyVal ) ; /保存按键值 ucKeyVal 至按键缓冲队列末6 .void keyBack ( unsigned char ucKeyVal ) ; /退冋键值 ucKeyVal.到按键缓冲队列首7 . #endif定义函数体文档KEY.C,如下:代码1. #include ''key.h/z2. . #define KeyBufSize 16 /定义按键缓冲队列字节数3. .unsigned char KeyBuf KeyBufSize ; /定义一个无符号?符数组作为按键缓冲队歹。该队列为先进4. 先出,循环存取,下标从。到KeyBufSize-15. unsigned char KeyBufWp=O; /作为数组下标变鼠,记录存入位置6. .unsigned char KeyBufRp=O; /作为数组标变依,记录读出位置7. ./如果存入位置与读出位置相同,则表明队列中无按键数据8. unsigned char keyHit( void )9. if( KeyBufWp = KeyBufRp ) return ( 0 ); else return( 1 ); 11. unsigned char keyGet( void )12. unsigned char retVal; /暂存读出键值13. while ( keyHit ()=0 ) ; /等:待按键,因为函数keyHit ()的返I川值为0表示无按键14. . retVal = KeyBuf KeyBufRp ; /从数组中读出键值15. . if ( +KeyBufRp >= KeyBuf Size ) KeyBufRp=0; /读位置加 1 ,超出队列则循环冋 初始位置16. return( retVal );17. 18.19. void keyPut( unsigned char ucKeyVal )20. KeyBuf KeyBufWp = ucKeyVal; /键值存入数组21. if ( +KeyBufWp >= KeyBuf Size ) KeyBufWp=0; 存入位置加 1 ,超出队列则循 环冋初始位置22. 24.由于某种原因,读出的按键,没有用,但其它任务要用该按键,但传送又不方便“此时可以退回按键队列。就如取错了信件,有必要退回样26. void keyBack ( unsigned char ucKeyVal )27. (28. /*29. 如果KeyBufRp=O;减1后则为FFH,大于KeyBufSize,即从数组头退回到数组尾。或者 由于干扰使得KeyBufRp超出队列位置,也要调整回到正常位置,30. */31. if( KeyBufRp >= KeyBufSize ) KeyBufRp=KeyBufSize-l;32. KeyBuf KeyBufRp = ucKeyVal; /回存键值33. 下面渐进讲解键盘物理层的驱动。电路共同点:P2端口接共阴数码管,共阴极接GND, P2.0接a段、P2.1接b段P2.7接h段。软件共同点:code unsigned char Seg7Code10是七段数码管共阴编码表。Code unsigned char Seg7Code 16=/ 012345678 9AbCdEF0x3f, 0x06, 0x5b, Ox4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71);例:P1.0接按键到GND,键编号为,6,,显示按键。代码1. #include2. #include "KEY.H"3. . void main( void )4. Pl.。= 1; /作为输入引脚,必须先输出高电平5. . while ( 1 ) 永远为真,即死循环6. if Pl_0 = 0 ) /如果按键,则为低电平7. keyPut ( 6 ) ; /保存按键编号值为按键队列8. while ( Pl_0 = 0 ); 如果一直按着键,则不停地执行该循环,实际是等待松键9. )10. if ( keyHitO != 0 ) 如果队列中有按键11. P2=Seg7Code keyGetO ; 解8剧中取出按键值,并显示在数码管上12. )13. 例二:在例一中考虑按键20ms抖动问题。代码1. #include3. . void main( void )4. Pl_0 = 1;/作为输入引脚,必须先输出髙电平5. while ( 1 ) 永远为真,即死循环6. if( Pl_0 = 0 ) 如果按键,则为低电平7. delay20ms (); 延时20ms,跳过接抖动8. keyPut ( 6 ); 保存按键编号值为按键队列9. while ( Pl_0 = 0 ); /如果一直按看键,则不停地执行该循环,实际是等待松键10. . delay20ms (); 延时20ms,跳过松开抖动11. )12. if ( keyHit != 0 ) /如果队列中有按键13. P2=Seg7Code keyGet () ; /从队列中取出按键值,并显示在数码管上14. )15. 例三:在例二中考虑干扰问题。即小于20ms的负脉冲干扰。代码1. #include2. #include、KEY.H4. P1_O = 1;/作为输入引脚,必须先输出髙电平5. while ( 1 ) 永远为真,即死循环6. if( P1_O = 0 ) 如果按键,则为低电平7. delay20ms (); 延时20ms,跳过接下抖动8. if ( Pl_0 = 1 ) continue; /假按键9. keyPut ( 6 ); /保存按键编号值为按键队列10. while ( Pl_0 = 0 ); 如果一宜按着键,则不停地执彳亥常环,实际是等待松键11. delay20ms (); /延时20ms,跳过松开抖动12. )13. if ( keyHit () != 0 ) /如果队列中有按键14. P2=Seg7Code keyGetO ; /从队列中取出按键值,并显示在数码管上15. 16. 例四:状态图编程法。通过20ms周期中断,扫描按键。代码1 /*2 . 采用晶体为12KHz时,指令周期为1ms (即主频为IKHz),这样TO工作在定时器方式2, 8 位自动重载。计数值为20,即可产生20ms的周期性中断,在中断服务程序中实现按键扫描3.4 .5.6.8.9.1011121314151617181920#include#include ''KEY.H"void main( void )TMOD = (TMOD & OxfO ) | 0x02; / /(改变T1的I :作-3 TO为定时器方式2TH0 = -20;/计数周期为20个匕频咏,即20ms.TL0=TH0;/先软加载次计数值.TR0=l; 允许TO开始计数.ETO = 1;/允许TO计数溢出时产生中断请求.EA=1;/允许CPU响应中断请求.while ( 1 ) 永远为真,即死循环. (.if ( keyHit != 0 ) /如果队列中有按键.P2=Seg7Code keyGet 0 ; /从队列中取出按键值,并显示在数码管上.void timerOint ( void ) interrupt 1 /20ms: TO 的中断号为 121. static unsigned char sts=O;22. P1_O = 1;/作为输入I脚,必须先输出髙电平23. switch( sts )24. (25. case 0

    注意事项

    本文(C51单片机C语言编程基础和实例.docx)为本站会员(无***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开