51单片机的基本外围电路设计以及相关C语言程序免积分_第1页
51单片机的基本外围电路设计以及相关C语言程序免积分_第2页
51单片机的基本外围电路设计以及相关C语言程序免积分_第3页
51单片机的基本外围电路设计以及相关C语言程序免积分_第4页
51单片机的基本外围电路设计以及相关C语言程序免积分_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

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 ,既用1KC电阻接电源正极,此时 P0口输出高电平时 LED亮;另一种电路为 P0.7低电平驱动有效,在 P0.7输出低

2、电平时, STC-89C51端口灌入电流达 20mA,可直接驱动小负载.图 3-3-1中的R3为限流电阻,限 制LED2的工作电流.VCC (+5V)R1 1K-1C3 10 心OVCCAXTAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7RESETP2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11P2.4/A12P2.5/A13EAP2.6/A14P2.7/A15P1.0P3.0/RXDP1.1P3.1/TXDP1.2P3.2/IWP1.3P3.3/INT1P1.4P3.4/T0

3、P1.5P3.5/T1P1.6P3.6/WRP1.7P3.7/RDIC STC89C5118929393830311011121314151621-22-232425 2620 27281234567C1 30P CY 12MHz 19, 19C2 30P tk5-36735 5433-32-图3-1-1驱动LED电路原理R2 1KLED1R3 1KLED20加电复位电路,同时要求单片机的 31引脚EA接C1、C2为独石电容,用于微小调整单片机时钟的C3为电解电容器;整个电路由 +5V电压供电.电单片机的最小系统包括晶体振荡电路, 高电平.时钟频率主要由晶体 CY决定, 振荡频率;R1和C3组

4、成加电复位电路, 路使用的元件参数见表 3.1.1.表3.1.1 3-1-1电路元件表序号标称单片机ICSTC89C51DIP40核心芯片电容器C130PF独石振荡电容器C230PF独石振荡电容器C310 "F点解电容器复位文案大全实用标准文档晶振CY12MHzS型振荡电阻R11K'11/4W,金属膜电容器C3放电电阻电阻R21K'J1/4W,金属膜端口电位上拉电阻电阻R31K'J1/4W,金属膜限流电阻发光二极管LED1:'/' 5红色高亮显示发光二极管LED2中5红色高亮显示、程序设计1.程序设计平台程序设计采用 keil C 软件,为了养

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

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

7、以利用 proteus软件仿真调试,也可以检验你的程序设计结果.2.程序设计(1)利用P0.0 口驱动LED闪烁,高电平有效/*/#include<reg51.h>sbit LED = P0A0;void delay(unsigned char x)(unsigned char i,j;for(i = 0;i < x;i+)for(j = 0;j < 200;j+);)void main(void)(While(1)(LED = 0;void delay(100);LED = 1;void delay(100); )包含头文件/ LED 接 P0.0.在 kell C5

8、1 软件中,定义 P0.0 为 P0A.,延时函数主函数程序死循环/P0.0输出低电平,LED灭调用延时函数,延时一段时间,约 0.3秒,不精确/P0.0输出高电平,LED亮/*/(2)利用P0.7端口驱动LED闪烁,低电平有效/*/#include<reg51.h>sbit LED = P0A7;void delay(unsigned char x)(unsigned char i,j;for(i = 0;i<x;i+)包含头文件,程序为小 5号字延时函数文案大全实用标准文档for(j = 0;j < 1000;j+);)void main(void) while(1

9、)(LED =LED;void delay(100);)主函数/LED初始状态为灭,执行一次,延时一段时间LED改变一次状态/*/三、程序说明1 .应为使用的单片机芯片为STC89C51 ,因此程序开始处参加 #include<reg51.h> ,文件reg51.h中包含了 51芯片所有特殊功能存放器的名称定义和相对应的地址值;2 .单片机程序单步顺序执行,先执行主函数,在主函数可以调用分函数,分函数可以 调用分函数,但分函数不能调用主函数,程序执行一条命令再执行下一条,单片机等待的过程是执行了一个循环命令或一个浪费时间的程序,实际执行过程永远不会结束.delay ()为函数延,单

10、片机在执行此函数相关指令时占用的时间过长,在执行过程中,如果没有中断,单片机只能忙这一件事情.利用delay ()不能得到精确的延时.延时函数还可以利用下面的函数实现./*/ void delay (unsigned int x)while(x)x-;/*/3 .利用位定义命令让 LED等价于P0.0或P0.7,等于先sbit P0_0 = P0A0 ,然后#defined LED P0_0 ,也在程序前面不做此类定义,在程序里面直接写成P0A0 = 1或P0A0 = 0 ,先定义是为亍增加程序的可读性.程序执行P0A0 = 1后,P0.0对以的单片机内部位存放器就设置为高电平,同时 P0.0

11、端口也输出高电平,单片机的所有 I/O 口都可位未定义,也可以字 节定义.4 .单片机C语言程序设计需要的 C语言关键字不多,并且在 keil C中用到的关键字是 独有的,因此对于没有学习过C语言的人学习单片机 C语言程序设计困难并不是很大,主要掌握单片机 C语言书写格式,怎样用 C语言限制单片机的硬件资源,另外在编程时,还 要有清楚的逻辑思维头脑和认真实践,由浅逐步深入学习,当你坚持到最后时,单片机C语言程序设计实际上很简单.5 .每个人在编写程序时都有自己的风格.一般情况下,函数的字符左行距为0,其下每条语句前留一个“ tab键空.算数逻辑符号的左右留一个空格,关键语句要有中文或英文 说明

12、,每一个函数有时也可以用"/*.*/上下隔开这样有助于提升程序的层次感和可读性.3.1.2利用P0 口驱动8个LED ,产生跑马灯或流水灯效果、参考电路实验电路见图3-3-2所示,在单片机的最小系统的根底上,P0 依次接入8个LED ,P0 口的上拉电阻可以使用 8个1KC电阻.文案大全实用标准文档VCC (+5V)R2-9 1KC1 30P .CY 12MHzC2 30P=R1 1K IC STC89C51VCC19“TAL1P0.0/AD039-38-18P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7RE

13、SETP2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11P2.4/A12ALEP2.5/A13EAP2.6/A14P2.7/A15P1.0P3.0/RXDP1.1P3.1/TXD-37-36-935-34-S3-32212229-23- -24-2530-26-T7-311T8-102-312P1.2P3.2/rNT0-P1.3P3.3/rNTTP1.4P3.4/T0P1.5P3.5/TTP1.6P3.6WP1.7P3.7/RD413514615716-8-17OODDOOO0 必q IILED1-8图3-1-2流水灯电路在利用Proteus软件仿真时,可以用电阻排代替.单片

14、机最小系统在单片机元件放置后已经默认,即C1、C2、C3、CY、R1可以省略.其它元件选取见表 3.1.2所示.表3.1.1 3-1-2电路Proteus软件元件表元件名称component总类 Category分类 Sub- CategoryResultsModel type单片机Micoroprocessor IC8051 Family80C51电阻排ResistorResistor PackRESPACK-8ANALOG发光二极管OptoelectronicsLEDsled-redDIGITAL、参考程序/*/#include<reg51.h>void delay(void)

15、unsigned char i,j;for(i = 0;i < 255;i+) for(j = 0;j < 255;j+);void main(void)unsigned char j = 0x01;while (1)j = j << 1;if(j = 0x00) j = 0x01;P0 = j;delay();/*/三、程序说明1.语句j = j << 1 ,执行的目的是限制P0整个字节的数据在循环时左移变化,程序循环第一次, P0 = 0x02, P0.1连接的LED亮,其它灭;循环第七次, P0.7连接的LED亮,其 它灭;循环第八次,j = 0x00

16、, if语句条件满足,j = 0x01 , P0.0连接的LED亮,其它灭,然 后依次变化下去.如果P0 口驱动8个LED低电平有效,如下修该:/*/ void main(void) 文案大全实用标准文档unsigned char j = 0xfe;while (1)(j =(j << 1) | 0x01 ;if(j = 0xff) j = 0xfe;P0 = j;delay();2. delay()函数无形参,延时时间不能设置.3.1.3利用P0 口驱动一个数码管,显示 0 - 9,并循环一、参考电路实验电路在单片机的最小系统根底上,P0 口接一只共阳数码管,见图 3-1-3.带

17、小数点的数码管是由8个LED组成,七个LED组成数字,另一只 LED用来显示小数点.如果数 码管内部的8只LED的正极接在一起,负极分别引出,引脚依次命名为a、b、c、d、e、f、g和dot,称为带小数点的 7段共阳极性数码管.VCC (+5V)0VCCC1 30PCY12MHzHI J_C2 30PHHclJR1IC STC89C511XTAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7RESETP2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12P2.5/A

18、13EAP2.6/A14P2.7/A15P1.0P3 0/RXDP1.1P3.1/TXDP1.2P3.2/INT0pa -P1.4P3.4/T0P1.5P3.5/TTP1.6P3.6/WRP1.7P3.7/RD1918929303125262728123 ,45610111213 -14151617R29 200AC39"38o-b37i c36d35e=e3411-g-32dF=L212223SEVENSEG图3-1-3单片机驱动共阳数码管电路单片机的P0.0-P0.7 分别接数码管的a-dot引脚,如果让数码管显示1,数码管b、c段亮,程序限制P0输出0xbe十六进制编码即可,因

19、此共阳数码管显示0-9十进制数字,需要利用10个显示码组成的数组.对于共阴数码管,也有相应的编码要求.小数点在不用时 一般不让显示,高位端口P0.7输出高电平即可.由于P0每个端口的灌电流达 20mA,数码管每段LED正常显示5mA即可,因此需要 R29用来P士制数码管每一段电流, 以预防驱动电流过大而烧毁器件.利用Proteus软件仿真时,数码管采用 Optoelectronics 元件库中 7-Segment Displays 下的 7-SEG-COM-ANODE .、参考程序/*/ #include<reg51.h>code unsigned char seven_seg10

20、 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;void delay (void)/* 时间延迟函数 */unsigned char i,j;for (i = 0;i < 255;i+) for (j = 0;j = 255;j+);void main (void)unsigned char i;/*变量i用来储存 09 */*无穷循环 */while (1) for (i = 0; i<10; i+)文案大全实用标准文档P0 = seven_segi;/*输出09到共阳七段显示器*/delay();)/*调用时间延迟函数d

21、elay*/*/三、程序说明1 .当程序中使用常量数据时,可以把数据存储在单片机的程序存储器中,对此类数据声明时,前面需要加上关键字code或const,如本实验中的共阳数码管数字显示需要的编码,表 3-1-3是共阳数码管编码, 表3-1-4是共阴数码管编码.单片机驱动液晶显示器显示的汉字也是一种常量数据.表3-1-3共阳数码管显示编码dotgfedcba160110000000xc01111110010xf92101001000xa43101100000xb04100110010x995100100100x926100000100x827111110000xf88100000000x8091

22、00100000x90表3-1-4共阴数码管显示编码dotgfedcba160001111110x3f1000001100x062010110110x5b3010011110x4f4011001100x665011011010x6d6011111010x7d7000001110x078011111110x7f9011011110x6f2 .本程序数码管显示使用了一个for循环,让变量i依次由0递增到9,并将数字显示码送到 P0,需要注意,seven_seg10有10各数据,seven_seg0为第一个数据,seven_seg9为第10个数据.数码管显 示的数据变化时间由延时函数决定.for循环

23、体嵌套在 while循环体中,痴血管回循环显示09,永不结束,除非电路断电.利用数码管也可以显示日期和时间,在以后的程序设计案例中就可以学到.文案大全实用标准文档3.2单片机定时器/计数器应用3.2.1 利用Timer0中断产生1秒延时,让数1个码管显示秒计数本案例主要目的是熟练掌握单片机内部Timer0或Timeri的编程限制方法,会利用Timer0或Timeri中断精确定时.同时掌握数码管动态显示原理,学会6位数字显示的程序设计.本案例使用的电路为图3-1-3.一、程序设计/*/#include<reg51.h>code unsigned char seven_seg10 =

24、0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char cp,i;void timer0_isr(void) interrupt 1一TR0 = 0;TL0 = 0x11;TH0 = 0xee;TR0 = 0;cp+;if(cp = 200)cp = 0;i +; if(i = 10) i = 0;P0 = seven_segi一void timer0_initialize(void)一EA = 0;TMOD = 0x01 ;TR0 = 0;TL0 = 0x11;TH0 = 0xee;声明全局变量/ timer0中断效劳函

25、数停止计数/ TL0重新预置/ TH0重新预置开始计数/ timer0中断1次,变量cp加1中断200次,时间刚好为1秒PT0 = 1;ET0 = 1;EA = 1;TR0 = 1;void main (void)timer0_initialize() while (1);/ P0输出显示数据/ timer0中断初始化函数设置中断允许存放器IE中的EA位,关闭中断总开关设置计时器模式限制存放器,Time0工作在定时方式1设置计时器限制存放器 TCON存放器的TR0位为0, Timer0停止计数/ Timer0的16位计数器初始值为 0xee11, 12MHz晶体振频率,单片机的机器周期为1微妙

26、,Timer0每1微秒加1计数,加满溢出变产生中断,从计数到中断刚好为 5毫秒设置中断优先次序存放器 IP中的PT0位,Timer0中断优先设置中断允许存放器IE中ET0的位,开启中断小开关翻开中断总开关开始计数/ timer0初始化,为中断做好准备 等待中断/*/、程序说明1 .中断效劳函数名中,interruput为关键字,1为timer0中断号.在reg51.h头文件中已 经定义,表3.2.1为单片机常用中断的中断号.在使用中断效劳函数时,直接在名后加interruput和中断号即可.表3.2.1 reg51.h中单片机常用中断号定义中断源中断触发原因中断号INT0外部INT0引脚有低电

27、平或下降沿信号输入0Timer0Timer0计数溢出1INT1外部INT0引脚有低电平或下降沿信号输入2文案大全实用标准文档Timer1Timer1计数溢出3串行中断串口缓存SBUF写入数据或读出数据42 .timer0 可以用作计数,也可以用来定时,由由 TMOD存放器中C/为决定,作为计数器使用时,接受单片机外部引脚P3.4输入的脉冲加计数;作为定时器使用时,接受单片机内部的机器周期脉冲.如果单片机的振荡频率为f ,振荡周期为t=1f ,那么机器周期为T =12/f.本案例中f =12MHz ,那么T =1微秒,timer0工作在模式1为16为加计数器,当计 数器初始值为0xee11时,那

28、么从开始计数到产生中断需要的时间为0xffff 0xee11个微秒,刚好为5000微秒,也即5毫秒.本案例timer.的初装也可以利用下面语句完成:/*/#defined TEMOR0_COUNT 0xee11 TL0 = TEMOR0_COUNT & 0x00ff; TH0 = TEMOR0_COUNT >> 8;/*/利用定时器/计数器定时时,取TEMOR0_COUNT的低字节并装入TL0/ TEMOR0_COUNT左移8位,并将低字节装入 TEMOR0_COUNT需要现设置工作模式,并计算它的初装值, 计算初装值不好计算,常利用计算机中的计算器工具辅助.timer0工

29、作在模式1可以最大65535微秒中断1次,如工作模式2,最大256微秒中断1次.3 .当程序中只涉及一个中断时,可以不对中断的优先级进行设置,因此在本案例中语句 PT0 = 1可以省略.程序中有多个中断但没有进行优先级设定的情况下,单片机中断优先级 默认按终端号递增而依次降低.4 .数码管显示语句放在了 timer0中断效劳函数里面,由于5毫秒中断1次,因此数码管显示的数据会每5毫秒更新1次.1秒内更新200次,更新过程是把原来的数据覆盖,但显 示数据1秒内变化1次.3.2.2 利用4个数码管,实现秒信号加计数、电路原理图3-2-1所示的电路中,4位七段数码管采用 4只单个数码管组成,可以显示

30、00009999, 数据输入端并联后接 P0 口,位选即每个数码管的阳极分别接P2 口,中间加非门驱动.因为P2 口反相驱动,因此,如果千位数码管显示,P2.7输出低电平,P2的其它端口输出高电平,并且此时 P0输出千位数据.在利用Proteuse软件仿真时,数码管 SEVEN_SEG使用7SEG-MPX4-CA ,非门 电阻R29是限流电阻.C1IC STC89C51VCCC230PIPCY 12MHz19>XTAL118XTAL2SEVENSEGR1 1KC3 10 科P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0

31、.7/AD73739 R29 2003635343332293031RESETPSENALEEAP2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A152122-25-26-28NOT1NOT2NOT3NOT41 丁P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P3.0/RXDP3.1/TXDP3.2/INT0-P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD10 JI T2 T3 T4- -15-1617NOT 选用 74 HC series 类型中 Gates & Inv

32、erters 分类下的 74HC04.图3-2-1 4位七段数码管显示、程序设计/*/ #include<reg51.h>#defined unsigned char uchar文案大全实用标准文档#defined unsigned int uintcode uchar seven_seg10 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;code uchar seg_scan4 = 0xef,0xdf,0xbf,0x7f;uchar counter4 = 0,0,0,0;uint cp,i;/各个数码管对应的位选数据个位、

33、十位、百位和千位数void timer0_isr(void) interrupt 1一/ timer0中断效劳函数uchar j;TR0 = 0; TL0 = 0x11;TH0 = 0xee;TR0 = 0;cp+; if(cp = 200) 停止计数/ TL0重新预置/ TH0重新预置开始计数/ timer0中断1次,变量cp加1中断200次,时间刚好为1秒cp = 0; counter0+;个位数,1秒加1)if(counter0 = 10)if(counter1 = 10)if(counter2 = 10)if(counter3 = 10)counter0= 0; counter1+;

34、counter1= 0; counter2+; counter2= 0; counter3+; counter3= 0;P0 = seven_segcounterj;P2 = seg_scanj;j+;if(j = 4) j = 0;/ P0输出数据编码/P2输出位选信号void timer0_initialize(void)一EA = 0;TMOD = 0x01 ;TR0 = 0;TL0 = 0x11;TH0 = 0xee;PT0 = 1;ET0 = 1;EA = 1;TR0 = 1;void main (void)/ timer0中断初始化函数timer0_initialize() whi

35、le (1);/*/三、程序说明1 . imer0第1次中断,j = 0 ,显示个位,显示5毫秒后,timer0第2次中断,j = 1 ,显示十位,以后随 着中断依次显示百位和千位,最后重新显示个位.每位显示停留的时间为5毫秒.中断4次才能让4为依次扫描显示完,占用的时间为 20毫秒,1秒钟内,4位数码管扫描显示50遍,根据人眼视觉暂留特点,你 看到的结果是4位数据同时显示,这种显示方法为动态扫描显示.2 .变量j = 0时,counter0是个位十进制数,执行 P0 = seven_segcounter0, P0 口输出个位显示数据 编码;数码管的位选信号只利用了 P2的高4位,执行P2 =

36、 seg_scan0, P2 = 0xef,经过非门反相,力口在数 码管上的位选信号只有个位是高电平,此时只显示个位.3 .数组counterj也可以用/*/uint x ;1个变量代替,在显示时需做下面处理P0 = seven_segx/1000;P2 = seg_scan3;P0 = seven_segx%1000/100;P2 = seg_scan2;P0 = seven_segx%1000%100/10;/ P0输出千位数据编码千位数码管共阳极设置为高电平/ P0输出百位数据编码千位数码管共阳极设置为高电平/ P0输出十位数据编码文案大全实用标准文档P2 = seg_scan1;P0

37、= seven_segx%1000%100%10;P2 = seg_scan0;千位数码管共阳极设置为高电平/ P0输出千位数据编码千位数码管共阳极设置为高电平/*/4 .思考题(1)要让数码管在电路加电开始就显示1230 ,怎样更改有关数据?(2)为什么不用P2 口直接驱动数码管?(3)本案例如果200微秒中断1次,也可以实现1定时,显示结果会怎样?3.2.3 设计一个6位数码管时间显示程序本案例使用6位数码管显示时间,能显示时/分/秒,显示格式是 00.00.00到23.59.59.其中小时和分钟之间的小数点常亮,分钟和秒之间的小数点进行秒闪烁.一、参考电路二、参考程序/*/#includ

38、e<reg51.h>#defined unsigned char uchar各个数码管对应的位选数据时位、分位和秒位code uchar seven_seg10 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;code uchar seg_scan6 = 0xfb,0xf7,0xef,0xdf,0bf,0x7f;/tick :秒信号,cp:中断次数累计uchar counter3 = 0,0,0;uchar tick,cp,i,j;void dispaly(void)uchar d; d = d * tick; d = d |

39、 0x7f; swich(i) /d的值1秒内改变/d的值1秒内改变次,要么0x00,要么0xff次,要么0x7f,要么0xffcase 0 : P0 = seven_segcounter0%10; break;case 1 : P0 = seven_segcounter0/10; break;case 2 : P0 = d & seven_segcounter0%10; break;case 3 : P0 = seven_segcounter0/10; break;case 4 : P0 = 0x7f & seven_segcounter0%10; break;case 5

40、: P0 = seven_segcounter0/10; break; break;P2 = seg_scani;i+;if(i = 6) i = 0;/显示秒个位/显示秒十位/数据高8位1秒改变1次,实现小数点秒闪烁显示分十位显示数据高8位为低电平,小数点常亮显示时十位void timer0_isr(void) interrupt 1一TR0 = 0;TL0 = 0x11;TH0 = 0xee;TR0 = 0;cp+;if(cp = 100)/ timer0中断效劳函数停止计数/ TL0重新预置/ TH0重新预置开始计数/ timer0中断1次,变量cp加1/中断100次,时间刚好为 0.5

41、秒cp = 0;tick = tick; j+;秒脉冲信号if(j = 2) 刚好1秒j = 0;counter0+;个位数,1秒加1if(counter0 = 60)if(counter1 = 60)if(counter2 = 24)counter0= 0; counter1+; counter1= 0; counter2+; counter2= 0;文案大全实用标准文档display();/ timer0中断初始化函数/ timer0初始化,为中断做好准备)void timer0_initialize(void)(一EA = 0;TMOD = 0x01 ;TR0 = 0;TL0 = 0x1

42、1;TH0 = 0xee;PT0 = 1;ET0 = 1;EA = 1;TR0 = 1;)void main (void)(timer0_initialize() while (1);) /*/三、程序说明1 .利用counter2、counter1和counter0变量分别表示时、分和秒位的数值大小,也 可以利用结构体定义这些变量,如:/*/typedef struct(ucar hour;ucar min;ucar sec;time;time now;/now是数据类型为 time的变量/*/然后就可以用 now.hour, now.min 和 now.sec分另1J代替 counter2

43、、counter1 和 counter0.2 .执行timer0中断效劳函数时调用了 dispaly()函数,直接把dispaly()的函数体程序写在 中断函数体内也行,但中断效劳函数会显得臃肿.timer0每5毫秒中断1次,调用dispaly()函数执行1次,在执行dispaly()过程中,当i = 0时,只显示秒个位,当i = 1时,只显示秒 十位,依次类推.为了让小时的个位小数点常亮,让小时个位显示时,把显示编码数据的高8位设置为0;为了分个位小数点秒闪烁,把分个位小数点位设置一个周期变化的量即可.3 .程序与复杂,使用的变量就愈多,在程序分析和设计时,需要注意使用的变量最好使 用有一定

44、含义的字符表示.文案大全实用标准文档3.3键盘程序设计按键是一种开关,通过外界作用力,导电金属或导电非金属接触与别离实现电路通断的限制是按键的根本机械原理,如计算机键盘、 、 MP3以及电子表按键.按键是计算 机系统输入设备,也是人机信息交换的主要途径.按键按下会产生抖动现象,不能平安有效的对系统限制,本节根据按键产生的抖动机 理,提出以中断、延时等举措消除键盘输入过程中的不稳定因素,实现单片机系统键盘的稳定输入.3.3.1 键盘抖动现象按键按下都会发出一声响,谁然有的按键声音很稍微,但这都是导体碰撞产生的震动.这种现象称为键盘抖动.如果不对键盘的抖动进行处理,按键会对系统电路或程序产生意外

45、的干扰.为了观察按键的抖动现象,我们先做一个小实验,分析一下一个微触按键产生抖动 对系统的影响.高电平低电平T1 T5+VCC8CP CP 加计数器图3-3-1加数计数小系统图3-3-2加数计数小系统在图3-3-1所示的一个加数计数小系统中,设计数器的脉冲输入端CP为上升沿有效,加计数器初始显示为 0.按键不按时,CP = 0,计数器不加1计数.一般认为:按键按下, CP端由低电平变为高电平,含有电平上升沿,计数器加1计数,并且按下1次,计数器加1.实际实验时会发现,按键按下 1次,计数器不是加1,而是跳跃一次性增加 3或4.原因 是按键按下在导体接触的瞬间产生了震动.图3-3-2是按键按下过

46、程中 CP端实际电平改变情况.T1为不按按键时刻,T2为按键按下瞬间的抖动,T3为按键按下稳定时刻,T4为按键放开时刻瞬间,T5为按键放开时刻.从图中可以了解到,按键按下的瞬间由于震动会是 按键内部的导体稳定接触,而是在导通和不导通之间往返弹跳,虽然时间一瞬间,但使CP端获得了多个电平的上升沿.按键抖动时间的长短由按键的机械特性决定,一般为5ms10ms.因此不能直接把按键作为1个脉冲的输入.在数字电路中,常利用触发器消除键盘抖动,但在单片机系统中,按键可以直接接在 单片机的I/O 口上,常利用键盘程序来消除键盘的抖动现象.3.3.2 利用外部中断INT0实现键盘输入本案列利用外部中断INT0作为键盘输入端,当按键按下时,让单片机执行外部中断服 务程序,在中断效劳中完成键盘限制.一、参考电路在最小系统根底上,单片机的P0.0 口接一只LED,键盘接在P3.2端口,按键不按时,由于P3

温馨提示

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

评论

0/150

提交评论