收藏 分享(赏)

51单片机的基本外围电路设计以及相关C语言程序(免积分).doc

上传人:dzzj200808 文档编号:2650738 上传时间:2018-09-24 格式:DOC 页数:61 大小:1.25MB
下载 相关 举报
51单片机的基本外围电路设计以及相关C语言程序(免积分).doc_第1页
第1页 / 共61页
51单片机的基本外围电路设计以及相关C语言程序(免积分).doc_第2页
第2页 / 共61页
51单片机的基本外围电路设计以及相关C语言程序(免积分).doc_第3页
第3页 / 共61页
51单片机的基本外围电路设计以及相关C语言程序(免积分).doc_第4页
第4页 / 共61页
51单片机的基本外围电路设计以及相关C语言程序(免积分).doc_第5页
第5页 / 共61页
点击查看更多>>
资源描述

1、主要学习 51 单片机的外部引脚和内部结构等,叙述一下。本书任务驱动教学,引入案例有浅变深,循序渐进,给读者留下思考和发挥空间。3.1 利用单片机的 I/O 口驱动 LED3.1.1 利用单片机的 P0.0 端口驱动 1 只 LED 闪烁编程的目的是利用 C 语言控制单片机 I/O 端口按要求输出矩形波脉冲信号,信号的周期由延时函数决定。一、电路原理STC-89C51 单片机的 P0 口采用为 OD 门输出,不存在拉出电流,因此利用 P0 驱动负载时有两种接法:一种是加上拉电阻 R2,见图 3-1-1,既用 1K电阻接电源正极,此时P0 口输出高电平时 LED 亮;另一种电路为 P0.7 低电

2、平驱动有效,在 P0.7 输出低电平时,STC-89C51 端口灌入电流达 20mA,可直接驱动小负载。图 3-3-1 中的 R3 为限流电阻,限制 LED2 的工作电流。P 1 . 0P 1 . 1P 1 . 2P 1 . 3P 1 . 4P 1 . 5P 1 . 62345678P 0 . 0 / A D 0P 0 . 1 / A D 1P 0 . 2 / A D 2P 0 . 3 / A D 3P 0 . 4 / A D 4P 0 . 5 / A D 5P 0 . 6 / A D 6P 0 . 7 / A D 7P 2 . 7 / A 1 5P 2 . 6 / A 1 4P 2 . 5

3、/ A 1 3P 2 . 4 / A 1 2P 2 . 3 / A 1 1P 2 . 2 / A 1 0P 2 . 1 / A 9P 2 . 0 / A 8R E S E TX T A L 2X T A L 1E AA L EP S E N3 93 83 73 63 53 43 33 23 13 02 92 82 72 62 52 42 32 22 1P 3 . 0 / R X DP 3 . 1 / T X DP 3 . 2 / I N T 0P 3 . 3 / I N T 1P 3 . 4 / T 0P 3 . 5 / T 1P 3 . 6 / W RP 3 . 7 / R D1 01 11

4、 21 31 41 51 61 7P 1 . 711 91 89C 1 3 0 PC 2 3 0 PC Y 1 2 M H zR 1 1 KC 3 1 0I C S T C 8 9 C 5 1V C CR 2 1 KL E D 1V C C ( + 5 V )R 3 1 KL E D 2图 3-1-1 驱动 LED 电路原理单片机的最小系统包括晶体振荡电路,加电复位电路,同时要求单片机的 31 引脚EA接高电平。时钟频率主要由晶体 CY 决定,C1 、C2 为独石电容,用于微小调整单片机时钟的振荡频率;R1 和 C3 组成加电复位电路,C3 为电解电容器;整个电路由+5V 电压供电。电路使用的

5、元件参数见表 3.1.1。表 3.1.1 3-1-1 电路元件表元件名称 序号 标称 规格(封装,功率电压等参数) 作用单片机 IC STC89C51 DIP40 核心芯片电容器 C1 30PF 独石 振荡电容器 C2 30PF 独石 振荡电容器 C3 10F 点解电容器 复位晶振 CY 12MHz S 型 振荡电阻 R1 1K1/4W,金属膜 电容器 C3 放电电阻电阻 R2 1K 1/4W,金属膜 端口电位上拉电阻电阻 R3 1K 1/4W,金属膜 限流电阻发光二极管 LED1 5 红色高亮 显示发光二极管 LED2 5 红色高亮 显示二、程序设计1.程序设计平台程序设计采用 keil C

6、 软件,为了养成一个良好的文件管理习惯,建议:编程前,在计算机的某个硬盘分区下建立一个目录,目录的名字为你编写程序的主题,然后把 keil C产生的所有文件都放在该目录下。程序设计步骤如下:(1)运行 keil C,创建一个项目。利用 keil C 菜单栏中 project-new project 创建,项目的名字为你编程的主题,如本案例可以用“LED_1.uv2”或“一个 LED 闪烁实验.uv2”,存放目录为你的主题目录下;(2)创建建一个文件,然后以“.c”后缀名,文件存放在你的主题目录下;(3) 把 c 文件添加在你的项目中,在 project workspace 窗口利用 add f

7、ile to group实现。如果软件界面不显示这个窗口,运行 keil C 菜单栏中的 view-project window。(4)设置编译器,是编译过程中能生成“.hex”文件。默认文件名与主题名字相同。运行 project-option fortarget 1-output 窗口下点击 create HEX file。(5)在编程区域写你的程序,结束后存储文件并编译,要做检查,尽量避免警告出现,直到程序编译无误为止。(6)程序烧写并试运行。这个过程称为软件和硬件联合调试,如果实验板无误,程序编译通过,但在硬件上运行不成功是常用的事情,需要对程序进行多次调试。在没有实验板的情况下,可以利

8、用 proteus 软件仿真调试,也可以检验你的程序设计结果。2.程序设计(1)利用 P0.0 口驱动 LED 闪烁,高电平有效/*/#include /包含头文件sbit LED = P00; / LED 接 P0.0。在 kell C51 软件中,定义 P0.0 为 P00,void delay(unsigned char x) /延时函数unsigned char i,j;for(i = 0;i /包含头文件,程序为小 5 号字sbit LED = P07; void delay(unsigned char x) /延时函数unsigned char i,j;for(i = 0;i ,文

9、件 reg51.h 中包含了 51 芯片所有特殊功能寄存器的名称定义和相对应的地址值;2. 单片机程序单步顺序执行,先执行主函数,在主函数可以调用分函数,分函数可以调用分函数,但分函数不能调用主函数,程序执行一条命令再执行下一条,单片机等待的过程是执行了一个循环命令或一个浪费时间的程序,实际执行过程永远不会结束。delay()为函数延,单片机在执行此函数相关指令时占用的时间过长,在执行过程中,如果没有中断,单片机只能忙这一件事情。利用 delay()不能得到精确的延时。延时函数还可以利用下面的函数实现。/*/void delay(unsigned int x)while(x)x-;/*/3.

10、利用位定义命令让 LED 等价于 P0.0 或 P0.7,等于先 sbit P0_0 = P00,然后#defined LED P0_0,也在程序前面不做此类定义,在程序里面直接写成 P00 = 1 或 P00 = 0,先定义是为了增加程序的可读性。程序执行 P00 = 1 后,P0.0 对以的单片机内部位寄存器就设置为高电平,同时 P0.0 端口也输出高电平,单片机的所有 I/O 口都可位未定义,也可以字节定义。4. 单片机 C 语言程序设计需要的 C 语言关键字不多,并且在 keil C 中用到的关键字是独有的,因此对于没有学习过 C 语言的人学习单片机 C 语言程序设计困难并不是很大,主

11、要掌握单片机 C 语言书写格式,怎样用 C 语言控制单片机的硬件资源,另外在编程时,还要有清晰的逻辑思维头脑和认真实践,由浅逐步深入学习,当你坚持到最后时,单片机 C语言程序设计实际上很简单。5. 每个人在编写程序时都有自己的风格。一般情况下,函数的字符左行距为 0,其下每条语句前留一个“tab”键空。算数逻辑符号的左右留一个空格,关键语句要有中文或英文说明,每一个函数有时也可以用“/*.*/”上下隔开这样有助于提高程序的层次感和可读性。3.1.2 利用 P0 口驱动 8 个 LED,产生跑马灯或流水灯效果 一、参考电路实验电路见图 3-3-2 所示,在单片机的最小系统的基础上, P0 口依次

12、接入 8 个LED,P0 口的上拉电阻可以使用 8 个 1K电阻。P 1 . 0P 1 . 1P 1 . 2P 1 . 3P 1 . 4P 1 . 5P 1 . 62345678P 0 . 0 / A D 0P 0 . 1 / A D 1P 0 . 2 / A D 2P 0 . 3 / A D 3P 0 . 4 / A D 4P 0 . 5 / A D 5P 0 . 6 / A D 6P 0 . 7 / A D 7P 2 . 7 / A 1 5P 2 . 6 / A 1 4P 2 . 5 / A 1 3P 2 . 4 / A 1 2P 2 . 3 / A 1 1P 2 . 2 / A 1 0P

13、 2 . 1 / A 9P 2 . 0 / A 8R E S E TX T A L 2X T A L 1E AA L EP S E N3 93 83 73 63 53 43 33 23 13 02 92 82 72 62 52 42 32 22 1P 3 . 0 / R X DP 3 . 1 / T X DP 3 . 2 / I N T 0P 3 . 3 / I N T 1P 3 . 4 / T 0P 3 . 5 / T 1P 3 . 6 / W RP 3 . 7 / R D1 01 11 21 31 41 51 61 7P 1 . 711 91 89C 1 3 0 PC 2 3 0 PC Y

14、 1 2 M H zR 1 1 KC 3 1 0I C S T C 8 9 C 5 1V C C V C C ( + 5 V )R 2 9 1 KL E D 1 - 8图 3-1-2 流水灯电路在利用 Proteus 软件仿真时,可以用电阻排代替。单片机最小系统在单片机元件放置后已经默认,即 C1、 C2、C3、CY、R1 可以省略。其它元件选取见表 3.1.2 所示。表 3.1.1 3-1-2 电路 Proteus 软件元件表元件名称 component 总类 Category 分类 Sub- Category 结果 Results 模型 Model type单片机 Micoroproces

15、sor IC 8051 Family 80C51电阻排 Resistor Resistor Pack RESPACK-8 ANALOG发光二极管 Optoelectronics LEDs led-red DIGITAL二、参考程序/*/#includevoid delay(void)unsigned char i,j;for(i = 0;i code unsigned char seven_seg10 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;void delay (void) /* 时间延迟函数 */ unsigned char

16、i,j;for (i = 0;i code unsigned char seven_seg10 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char cp,i; /声明全局变量void timer0_isr(void) interrupt 1 / timer0 中断服务函数TR0 = 0; /停止计数TL0 = 0x11; / TL0 重新预置TH0 = 0xee; / TH0 重新预置TR0 = 0; /开始计数cp+; / timer0 中断 1 次,变量 cp 加 1if(cp = 200) /中断 200 次

17、,时间刚好为 1 秒cp = 0;i +;if(i = 10) i = 0;P0 = seven_segi / P0 输出显示数据void timer0_initialize(void) / timer0 中断初始化函数EA = 0; /设置中断允许寄存器 IE 中的 EA 位,关闭中断总开关TMOD = 0x01; /设置计时器模式控制寄存器,Time0 工作在定时方式 1TR0 = 0; /设置计时器控制寄存器 TCON 寄存器的 TR0 位为 0,Timer0/停止计数TL0 = 0x11;TH0 = 0xee; / Timer0 的 16 位计数器初始值为 0xee11,12MHz 晶

18、体振/频率,单片机的机器周期为 1 微妙,Timer0 每 1 微秒加 1/计数,加满溢出变产生中断,从计数到中断刚好为 5 毫秒PT0 = 1; /设置中断优先次序寄存器 IP 中的 PT0 位,Timer0 中断优先ET0 = 1; /设置中断允许寄存器 IE 中 ET0 的位,开启中断小开关EA = 1; /打开中断总开关TR0 = 1; /开始计数void main (void)timer0_initialize() / timer0 初始化,为中断做好准备while (1); /等待中断/*/二、程序说明1.中断服务函数名中,interruput 为关键字,1 为 timer0 中断

19、号。在 reg51.h 头文件中已经定义,表 3.2.1 为单片机常用中断的中断号。在使用中断服务函数时,直接在名后加interruput 和中断号即可。表 3.2.1 reg51.h 中单片机常用中断号定义中断源 中断触发原因 中断号INT0 外部 INT0 引脚有低电平或下降沿信号输入 0Timer0 Timer0 计数溢出 1INT1 外部 INT0 引脚有低电平或下降沿信号输入 2Timer1 Timer1 计数溢出 3串行中断 串口缓存 SBUF 写入数据或读出数据 42.timer0 可以用作计数,也可以用来定时,由由 TMOD 寄存器中 TC/为决定,作为计数器使用时,接受单片机

20、外部引脚 P3.4 输入的脉冲加计数;作为定时器使用时,接受单片机内部的机器周期脉冲。如果单片机的振荡频率为 f,振荡周期为 ft1,则机器周期为fT12。本案例中 12fMHz,则 1T微秒,timer0 工作在模式 1 为 16 为加计数器,当计数器初始值为 0xee11 时,则从开始计数到产生中断需要的时间为 0xffff 0xee11 个微秒,刚好为 5000 微秒,也即 5 毫秒。本案例 timer0 的初装也可以利用下面语句完成:/*/#defined TEMOR0_COUNT 0xee11TL0 = TEMOR0_COUNT /取 TEMOR0_COUNT 的低字节并装入 TL0

21、TH0 = TEMOR0_COUNT 8; / TEMOR0_COUNT 左移 8 位,并将低字节装入 TEMOR0_COUNT/*/利用定时器/计数器定时时,需要现设置工作模式,并计算它的初装值,计算初装值不好计算,常利用计算机中的计算器工具辅助。timer0 工作在模式 1 可以最大 65535 微秒中断 1 次,如工作模式 2,最大 256 微秒中断 1 次。3.当程序中只涉及一个中断时,可以不对中断的优先级进行设置,因此在本案例中语句 PT0 = 1 可以省略。程序中有多个中断但没有进行优先级设定的情况下,单片机中断优先级默认按终端号递增而依次降低。4.数码管显示语句放在了 timer

22、0 中断服务函数里面,由于 5 毫秒中断 1 次,因此数码管显示的数据会每 5 毫秒更新 1 次。1 秒内更新 200 次,更新过程是把原来的数据覆盖,但显示数据 1 秒内变化 1 次。3.2.2 利用 4 个数码管,实现秒信号加计数一、电路原理图 3-2-1 所示的电路中,4 位七段数码管采用 4 只单个数码管组成,可以显示00009999,数据输入端并联后接 P0 口,位选即每个数码管的阳极分别接 P2 口,中间加非门驱动。因为 P2 口反相驱动,因此,如果千位数码管显示,P2.7 输出低电平,P2 的其它端口输出高电平,并且此时 P0 输出千位数据。在利用 Proteuse 软件仿真时,

23、数码管SEVEN_SEG 使用 7SEG-MPX4-CA,非门 NOT 选用 74 HC series 类型中 Gates code uchar seg_scan4 = 0xef,0xdf,0xbf,0x7f; /各个数码管对应的位选数据uchar counter4 = 0,0,0,0; /个位、十位、百位和千位数uint cp,i;void timer0_isr(void) interrupt 1 / timer0 中断服务函数uchar j;TR0 = 0; /停止计数TL0 = 0x11; / TL0 重新预置TH0 = 0xee; / TH0 重新预置TR0 = 0; /开始计数cp+

24、; / timer0 中断 1 次,变量 cp 加 1if(cp = 200) /中断 200 次,时间刚好为 1 秒cp = 0;counter0+; /个位数,1 秒加 1if(counter0 = 10) counter0= 0; counter1+; if(counter1 = 10) counter1= 0; counter2+;if(counter2 = 10) counter2= 0; counter3+;if(counter3 = 10) counter3= 0;P0 = seven_segcounterj; / P0 输出数据编码P2 = seg_scanj; /P2 输出位

25、选信号j+;if(j = 4) j = 0;void timer0_initialize(void) / timer0 中断初始化函数EA = 0; TMOD = 0x01; TR0 = 0; TL0 = 0x11;TH0 = 0xee; PT0 = 1; ET0 = 1; EA = 1; TR0 = 1; void main (void)timer0_initialize() while (1); /*/三、程序说明1imer0 第 1 次中断,j = 0,显示个位,显示 5 毫秒后,timer0 第 2 次中断,j = 1,显示十位,以后随着中断依次显示百位和千位,最后重新显示个位。每位显

26、示停留的时间为 5 毫秒。中断 4 次才能让 4 为依次扫描显示完,占用的时间为 20 毫秒,1 秒钟内,4 位数码管扫描显示 50 遍,根据人眼视觉暂留特点,你看到的结果是 4 位数据同时显示,这种显示方法为动态扫描显示。2变量 j = 0 时,counter0是个位十进制数,执行 P0 = seven_segcounter0,P0 口输出个位显示数据编码;数码管的位选信号只利用了 P2 的高 4 位,执行 P2 = seg_scan0,P2 = 0xef,经过非门反相,加在数码管上的位选信号只有个位是高电平,此时只显示个位。3数组 counterj也可以用 1 个变量代替,在显示时需做下面

27、处理/*/uint x;P0 = seven_segx/1000; / P0 输出千位数据编码P2 = seg_scan3; /千位数码管共阳极设置为高电平P0 = seven_segx%1000/100; / P0 输出百位数据编码P2 = seg_scan2; /千位数码管共阳极设置为高电平P0 = seven_segx%1000%100/10; / P0 输出十位数据编码P2 = seg_scan1; /千位数码管共阳极设置为高电平P0 = seven_segx%1000%100%10; / P0 输出千位数据编码P2 = seg_scan0; /千位数码管共阳极设置为高电平/*/4思考

28、题(1)要让数码管在电路加电开始就显示 1230,怎样更改有关数据?(2)为什么不用 P2 口直接驱动数码管?(3)本案例如果 200 微秒中断 1 次,也可以实现 1 定时,显示结果会怎样?3.2.3 设计一个 6 位数码管时间显示程序本案例使用 6 位数码管显示时间,能显示时/分/ 秒,显示格式是 00.00.00 到 23.59.59。其中小时和分钟之间的小数点常亮,分钟和秒之间的小数点进行秒闪烁。一、参考电路二、参考程序/*/#include#defined unsigned char ucharcode uchar seven_seg10 = 0xc0,0xf9,0xa4,0xb0,

29、0x99,0x92,0x82,0xf8,0x80,0x90;code uchar seg_scan6 = 0xfb,0xf7,0xef,0xdf,0bf,0x7f; /各个数码管对应的位选数据uchar counter3 = 0,0,0; /时位、分位和秒位uchar tick,cp,i,j; /tick:秒信号,cp:中断次数累计void dispaly(void) uchar d;d = d * tick; /d 的值 1 秒内改变 1 次,要么 0x00,要么 0xffd = d | 0x7f; /d 的值 1 秒内改变 1 次,要么 0x7f, 要么 0xffswich(i)case

30、0 : P0 = seven_segcounter0%10; break; /显示秒个位case 1 : P0 = seven_segcounter0/10; break; /显示秒十位case 2 : P0 = d break; /数据高 8 位 1 秒改变 1 次,实现小/数点秒闪烁case 3 : P0 = seven_segcounter0/10; break; /显示分十位case 4 : P0 = 0x7f break; /显示数据高 8 位为低电平,小数点常亮case 5 : P0 = seven_segcounter0/10; break; /显示时十位 break; P2 =

31、 seg_scani;i+;if(i = 6) i = 0;void timer0_isr(void) interrupt 1 / timer0 中断服务函数TR0 = 0; /停止计数TL0 = 0x11; / TL0 重新预置TH0 = 0xee; / TH0 重新预置TR0 = 0; /开始计数cp+; / timer0 中断 1 次,变量 cp 加 1if(cp = 100) /中断 100 次,时间刚好为 0.5 秒cp = 0;tick = tick; /秒脉冲信号j+;if(j = 2) /刚好 1 秒j = 0; counter0+; /个位数,1 秒加 1if(counter

32、0 = 60) counter0= 0; counter1+; if(counter1 = 60) counter1= 0; counter2+;if(counter2 = 24) counter2= 0;display(); void timer0_initialize(void) / timer0 中断初始化函数EA = 0; TMOD = 0x01; TR0 = 0; TL0 = 0x11;TH0 = 0xee; PT0 = 1; ET0 = 1; EA = 1; TR0 = 1; void main (void)timer0_initialize() / timer0 初始化,为中断做

33、好准备while (1); /*/三、程序说明1.利用 counter2、counter1 和 counter0变量分别表示时、分和秒位的数值大小,也可以利用结构体定义这些变量,如:/*/typedef structucar hour;ucar min;ucar sec;time;time now; /now 是数据类型为 time 的变量/*/然后就可以用 now.hour,now.min 和 now.sec 分别代替 counter2、counter1 和counter0.变量2.执行 timer0 中断服务函数时调用了 dispaly()函数,直接把 dispaly()的函数体程序写在中

34、断函数体内也行,但中断服务函数会显得臃肿。timer0 每 5 毫秒中断 1 次,调用 dispaly()函数执行 1 次,在执行 dispaly()过程中,当 i = 0 时,只显示秒个位,当 i = 1 时,只显示秒十位,依次类推。为了让小时的个位小数点常亮,让小时个位显示时,把显示编码数据的高8 位设置为 0;为了分个位小数点秒闪烁,把分个位小数点位设置一个周期变化的量即可。3.程序与复杂,使用的变量就愈多,在程序分析和设计时,需要注意使用的变量最好使用有一定含义的字符表示。3.3 键盘程序设计按键是一种开关,通过外界作用力,导电金属或导电非金属接触与分离实现电路通断的控制是按键的基本机

35、械原理,如计算机键盘、手机、MP3 以及电子表按键。按键是计算机系统输入设备,也是人机信息交换的主要途径。按键按下会产生抖动现象,不能安全有效的对系统控制,本节根据按键产生的抖动机理,提出以中断、延时等措施消除键盘输入过程中的不稳定因素,实现单片机系统键盘的稳定输入。3.3.1 键盘抖动现象按键按下都会发出一声响,谁然有的按键声音很轻微,但这都是导体碰撞产生的震动。这种现象称为键盘抖动。如果不对键盘的抖动进行处理,按键会对系统电路或程序产生意外的干扰。为了观察按键的抖动现象,我们先做一个小实验,分析一下一个微触按键产生抖动对系统的影响。图 3-3-1 加数计数小系统 图 3-3-2 加数计数小

36、系统 在图 3-3-1 所示的一个加数计数小系统中,设计数器的脉冲输入端 CP 为上升沿有效,加计数器初始显示为 0。按键不按时,CP = 0,计数器不加 1 计数。一般认为:按键按下,CP 端由低电平变为高电平,含有电平上升沿,计数器加 1 计数,并且按下 1 次,计数器加1。实际实验时会发现,按键按下 1 次,计数器不是加 1,而是跳跃一次性增加 3 或 4。原因是按键按下在导体接触的瞬间产生了震动。图 3-3-2 是按键按下过程中 CP 端实际电平改变情况。T1 为不按按键时刻,T2 为按键按下瞬间的抖动,T3 为按键按下稳定时刻,T4 为按键放开时刻瞬间,T5 为按键放开时刻。从图中可

37、以了解到,按键按下的瞬间由于震动会是按键内部的导体稳定接触,而是在导通和不导通之间来回弹跳,虽然时间一瞬间,但使CP 端获得了多个电平的上升沿。按键抖动时间的长短由按键的机械特性决定,一般为5ms10ms。因此不能直接把按键作为 1 个脉冲的输入。在数字电路中,常利用触发器消除键盘抖动,但在单片机系统中,按键可以直接接在单片机的 I/O 口上,常利用键盘程序来消除键盘的抖动现象。3.3.2 利用外部中断 INT0 实现键盘输入本案列利用外部中断 INT0 作为键盘输入端,当按键按下时,让单片机执行外部中断服务程序,在中断服务中完成键盘控制。一、参考电路在最小系统基础上,单片机的 P0.0 口接

38、一只 LED,键盘接在 P3.2 端口,按键不按时,由于 P3.2 接有上啦电阻 R3,所以 P3.2 此时为高电平+5V,如果按键按下,P3.2 电源地短路,P3.2 为低电平。为了消除键盘抖动现象,键盘两端并联滤波电容器 C4。T1T2T3T4T5高 电 平低 电 平 加 计 数 器+VCCPKEYRP 1 . 0P 1 . 1P 1 . 2P 1 . 3P 1 . 4P 1 . 5P 1 . 62345678P 0 . 0 / A D 0P 0 . 1 / A D 1P 0 . 2 / A D 2P 0 . 3 / A D 3P 0 . 4 / A D 4P 0 . 5 / A D 5P

39、 0 . 6 / A D 6P 0 . 7 / A D 7P 2 . 7 / A 1 5P 2 . 6 / A 1 4P 2 . 5 / A 1 3P 2 . 4 / A 1 2P 2 . 3 / A 1 1P 2 . 2 / A 1 0P 2 . 1 / A 9P 2 . 0 / A 8R E S E TX T A L 2X T A L 1E AA L EP S E N3 93 83 73 63 53 43 33 23 13 02 92 82 72 62 52 42 32 22 1P 3 . 0 / R X DP 3 . 1 / T X DP 3 . 2 / I N T 0P 3 . 3 /

40、 I N T 1P 3 . 4 / T 0P 3 . 5 / T 1P 3 . 6 / W RP 3 . 7 / R D1 01 11 21 31 41 51 61 7P 1 . 711 91 89C 1 3 0 PC 2 3 0 PC Y 1 2 M H zR 1 1 KC 3 1 0 I C S T C 8 9 C 5 1V C CR 2 1 KL E D 1V C C ( + 5 V )R 3 1 0 KC 4 0 . 1K E Y图 3-3-3 利用外部中断 INT0 实现键盘输入电路二、程序设计/*/#includesbit LED = P00;void int0_isr(void)

41、 interrrupt 0 /INT0 中断服务函数,INT0 的中断号为 0 unsigned char i = 0;i = i; /INT0 中断 1 次, i 值改变 1 次LED = i; /INT0 中断 1 次, LED 工作状态变化 1 次delay(); /调用延时函数void main(void) LED = 0; /芯片初始化时, LED 灭EA = 0; EX0 = 1; /开启 INT0 中断PX0 = 1; /INT0 中断优先,可以省去EA = 1; /开启总中断开关while(1); /等待按键按下,中断发生/*/三、程序说明这里没有设置 INT0 是下降沿触发中

42、断或是低电平触发中断,原因是按键按下,不管产生不产生键抖现象,总能使 INT0 引脚产生 1 个下降沿和低电平。如果设置只有下降沿才触发 INT0 中断,需要利用设置计时器控制寄存器 TCON 的 IT0 = 1 位,按键按下是否产生中断,可以利用程序检测 TCON 的 IE0 位。利用外部中断触发作为按键输入很好的解决了键盘抖动问题。如果需要多个键盘,把 INT0 口与 I/O 口之间用键盘连接,I/O 输出低电平扫面信号即可。在数码管动态显示电路中,为了节省硬件资源,可以在 INT0 口和 P2 口之间接入键盘,实现 8 只按键输入。3.3.3 利用延时程序防止键盘抖动,实现键盘输入按键按

43、下产生的抖动现象持续的时间不会很久,因此在按键按下后,可延时一段时间跳过抖动,再对按键的状态检测,从而实现键盘输入。本案例完成通过两个键盘设计,实现对数码管显示数据的调整。一、电路原理在单片机最系统的基础上,KEY1、KEY2 两个键盘一端分别接 P3.0、P3.1 ,另一端接地,见图 3-3-2 所示。数码管仍使用共阳型。在 Proteuse 软件中,按键的英文名字为BUTTON,在 Switches sbit key1 = P3.0;sbit key2 = P3.1;uchar key1_state,key2_state; /按键按下的状态变量void delay(uchar i) while(i) i-; void key_scan(void) /键盘扫描函数

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报