




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
定时开关控制器
相关知识与实践一、显示
1、基础知识
2、静态显示案例一
3、动态显示案例二二、按键
1、键盘接口
2、独立按键案例三、四
3、行列按键案例五、六三、单片机应用
1、数组
2、中断
3、定时器4、案例七四、拓展部分
51单片机常识
辅助任务
难点、问题分析
小结难点、问题分析1、数组2、地址的形成3、特殊功能寄存器(SFR)4、中断(定时器)
八段LED显示块基础知识--数码显示共阴结构共阳结构基础知识--数码显示共阴数码:假定Px.0-a,Px.1-b,Px.2-c,Px.3-d,Px.4-e,Px.5-f,Px.6-g,Px.7-dp则从Px口,送0x3f,显示0,送0x06,显示1
送0x5b,显示2,送0x4f,显示3
送0x66,显示4,送0x6d,显示5
送0x7d,显示6,送0x07,显示7
送0x7f,显示8,送0x6f,显示9
N位LED显示器基础知识--数码显示
四位静态LED显示器电路静态数码显示每一个数码管的显示笔画都要占用单独的具有锁存功能的I/O接口。即需N×8个I/O控制线静态显示数码管相应笔段一直处于点亮状态,因此功耗大,而且占用硬件资源多,几乎只能用在显示位数极少的场合。优点:LED亮度高,可用在室外显示场合。程序工作量小。例如:静态显示技术静态显示技术案例一显示601111101P2=0X7DDPabcdefg1在proteus上画出如下电路图.2在keil中编制程序,要求能显示学号最后4位数.3运行程序,观察电路中数码管显示.#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D;voidmain(){ Led_D=0x0800;*Led_D=0x6f;//9
Led_D=0x0900;*Led_D=0x5b;//2Led_D=0x0a00;*Led_D=0x06;//1Led_D=0x0b00;*Led_D=0x3f;//0
while(1);}
八位LED动态显示器电路
动态数码显示所有数码管的8个笔画段同名端连在一起,公共端各自独立。即需N+8个I/O控制线动态显示是多只数码管共享段码线,通过位选线(公共端)逐位逐位分时进行扫描显示(任时刻只有一只点亮)。其优点是占用硬件资源少,功耗小。软件工作量大.
必须注意:扫描周期必须控制在视觉停顿时间内,一般在20ms以内,否则会出现闪烁或跳动现象。最为广泛的一种显示方式。动态显示技术首先扫描最后扫描动态显示技术_案例二1在proteus上画出如下电路图.2在keil中编制程序,要求能显示学号最后8位数.3运行程序,观察电路中数码管显示.(注意:换位前先清段码)#include<reg51.h>#defineucharunsignedcharvoiddelay(){ uchari; for(i=0;i<100;i++);}voidmain(){ while(1) {P2=0Xfe;P0=0X7f;delay();//8
P2=0Xfd;P0=0X06;delay();//1P2=0Xfb;P0=0X5b;delay();//2P2=0Xf7;P0=0X4f;delay();//3P2=0Xef;P0=0X66;delay();//4P2=0Xdf;P0=0X6d;delay();//5P2=0Xbf;P0=0X7d;delay();//6P2=0X7f;P0=0X07;delay();//7}}P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;消除拖尾重影现象#include<reg52.h>#defineucharunsignedcharcodeuchardisplay[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};voiddelay(){ uchari; for(i=0;i<100;i++);}voidmain(){ while(1) {P2=Tab[7];P0=display[8];delay();//8
P2=Tab[6];P0=display[1];delay();//1P2=Tab[5];P0=display[2];delay();//2P2=Tab[4];P0=display[3];delay();//3P2=Tab[3];P0=display[4];delay();//4P2=Tab[2];P0=display[5];delay();//5P2=Tab[1];P0=display[6];delay();//6P2=Tab[0];P0=display[7];delay();//7
}}P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];使用数组1在proteus上画出如下电路图.2在keil中编制程序,要求能显示学号最后8位数.3运行程序,观察电路中数码管显示.(注意:换位前先清段码)#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x0};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};ucharled[8];//数组长度要给出voiddelay(){ uchari; for(i=0;i<100;i++);}voiddisplay(){ inti;for(i=0;i<8;i++){*Led_D=0;*Led_W=Tab[i];*Led_D=led[i];delay();}voidmain(){ led[0]=display[0];led[1]=display[1];led[2]=display[2];led[3]=display[3];led[4]=display[4];led[5]=display[5]; led[6]=display[6];led[7]=display[7];
while(1){display(); }}辅助任务一设计两位数的十进制减法显示电路原理图并编制程序.二设计电子时钟显示(时-分-秒)电路原理图并编制程序.三设计用数码显示8只LED循环次数,显示的范围为0-99.减法运算显示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;
ucharled[8];//数组长度要给出voiddelay(){ uchari; for(i=0;i<100;i++);}voiddisplay(){ inti;for(i=0;i<8;i++){ *Led_D=0; *Led_W=Tab[i];*Led_D=led[i]; delay(); }}voidmain(){ unsignedintX=98,Y=56,Z;Z=X-Y; *Led_D=0; *Led_W=0xff; led[2]=display_code[10];led[5]=display_code[11]; while(1) { if(bzie){ led[0]=display_code[X/10];led[1]=display_code[X%10]; led[3]=display_code[Y/10];led[4]=display_code[Y%10]; led[6]=display_code[Z/10];led[7]=display_code[Z%10];bzie=0;} display(); }}X-Y=Z显示#include<reg52.h>#include<absacc.h>#defineucharunsignedchar#defineLed_DXBYTE[0xc000]#defineLed_WXBYTE[0xc800]ucharcodedisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};ucharcodeTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};ucharled[8];bitbzie=1;voiddelay(){ uchari; for(i=0;i<100;i++);}voiddisplay(){ inti;for(i=0;i<8;i++){ Led_D=0; Led_W=Tab[i];Led_D=led[i]; delay(); }}voidmain(){ unsignedintX=98,Y=56,Z;Z=X-Y;
Led_D=0; Led_W=0xff; led[2]=display_code[10];led[5]=display_code[11]; while(1) { if(bzie){ led[0]=display_code[X/10];led[1]=display_code[X%10]; led[3]=display_code[Y/10];led[4]=display_code[Y%10]; led[6]=display_code[Z/10];led[7]=display_code[Z%10]; bzie=0; } display(); }}X-Y=Z显示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;inti;ucharled[8];
voiddisplay()interrupt1{ TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;
if(i==8)i=0;*Led_D=0; *Led_W=Tab[i];*Led_D=led[i];i++;}voidmain(){ unsignedintX=98,Y=56,Z;Z=X-Y;
TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;//1ms时间间隔不能长
i=0;IE=0x82;TMOD=0x01;TCON=0x10;led[2]=display_code[10];led[5]=display_code[11]; while(1) { if(bzie){ led[0]=display_code[X/10];led[1]=display_code[X%10]; led[3]=display_code[Y/10];led[4]=display_code[Y%10]; led[6]=display_code[Z/10];led[7]=display_code[Z%10];bzie=0;} }}X-Y=Z显示时钟显示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;
unsignedintx=0;ucharled[8];//数组长度要给出voiddelay(){ uchari; for(i=0;i<100;i++);if((++x)==1000){x=0;bzie=1;}}voiddisplay(){ inti;for(i=0;i<8;i++){*Led_D=0; *Led_W=Tab[i];*Led_D=led[i]; delay(); }}voidmain(){ unsignedinthour=0,mit=0,sec=0; *Led_D=0; *Led_W=0xff; led[2]=display_code[10];led[5]=display_code[10]; while(1){ if(bzie){
if((++sec)>=60){sec=0;if((++mit)>=60){mit=0;if((++hour)>=24)hour=0;}} led[0]=display_code[hour/10];led[1]=display_code[hour%10]; led[3]=display_code[mit/10];led[4]=display_code[mit%10]; led[6]=display_code[sec/10];led[7]=display_code[sec%10];bzie=0;} display(); }}时分秒显示#include<reg52.h>#include<absacc.h>#defineucharunsignedchar#defineLed_DXBYTE[0xc000]#defineLed_WXBYTE[0xc800]ucharcodedisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};ucharcodeTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};ucharled[8];bitbzie=1;unsignedintx=0;
voiddelay(){ uchari; for(i=0;i<100;i++);if((++x)==1000){x=0;bzie=1;}}voiddisplay(){ inti;for(i=0;i<8;i++){ Led_D=0; Led_W=Tab[i];Led_D=led[i]; delay(); }}voidmain(){ unsignedinthour=0,mit=0,sec=0;
Led_D=0; Led_W=0xff; led[2]=display_code[10];led[5]=display_code[10]; while(1){ if(bzie){
if((++sec)>=60){sec=0;if((++mit)>=60){mit=0;if((++hour)>=24)hour=0;}}
led[0]=display_code[hour/10];led[1]=display_code[hour%10]; led[3]=display_code[mit/10];led[4]=display_code[mit%10]; led[6]=display_code[sec/10];led[7]=display_code[sec%10]; bzie=0; } display(); }}时分秒显示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;inti;ucharled[8];unsignedintx=0;
voiddisplay()interrupt1{ TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;
if(i==8)i=0;*Led_D=0; *Led_W=Tab[i];*Led_D=led[i];i++;if((++x)==1000){x=0;bzie=1;}}voidmain(){ unsignedinthour=0,mit=0,sec=0;
TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;//1ms,时间间隔不能长
i=0;IE=0x82;TMOD=0x01;TCON=0x10;led[2]=display_code[10];led[5]=display_code[10]; while(1) {if(bzie){
if((++sec)>=60){sec=0;if((++mit)>=60){mit=0;if((++hour)>=24)hour=0;}}
led[0]=display_code[hour/10];led[1]=display_code[hour%10]; led[3]=display_code[mit/10];led[4]=display_code[mit%10]; led[6]=display_code[sec/10];led[7]=display_code[sec%10];bzie=0;} }}时分秒显示根据实验电路图.在keil中编制程序,实现数码管显示LED循环点亮的次数.数组概念数组的本质则是一系列的数据元素(变量)。该数组中若干个元素必须是同一个类的。对象数组的定义、赋值和引用和普通数组相同。
1.数组的定义
数组定义格式如下:
<类名><数组名>[<大小>]...
其中,<类名>指出该数组元素是属于该类的对象,方括号内的<大小>给出某一维的元素个数。一维对象数组只有一个方括号,二维对象数组要有两个方括号,等等,例如:datadates[7];
表明dates是一维对象数组名,该数组有7个元素,每个元素都是类data的对象。
2.对象数组的赋值
对象数组能够被赋初值,也能在程序中被赋值(除code类)。例如codeadd[3]={0x3f,0x06,0x4f};数组应用(查表程序)codeunsignedcharLEDMAP[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsignedchari;unsignedcharLED;………….LED=LEDMAP[i];//i取值0-15或16进制0-F键盘接口技术1、键盘消抖2、键盘形式软件去抖动
前沿抖动稳定后沿抖动
按键抖动信号波形键盘消抖即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。键盘消抖硬件消抖:如RC滤波电路键盘消抖硬件消抖:如双稳态电路:RS触发器为常用的硬件消抖电路。CD键盘的形式有以下两种:独立式键盘行列式键盘2、键盘的形式独立式键盘结构每一个按键的电路是独立的,占用一条I/O数据线1在proteus上画出如下电路图.2在keil中编制程序,要求能显示按键数值.3运行程序,观察电路中数码管显示.4用本图实现键控0-9秒表程序案例三、四
if((P1=P1|0x55)!=0xff){delay();if((P1=P1|0x55)==0xfd)*pled=0x06;if((P1=P1|0x55)==0xf7)*pled=0x5b;if((P1=P1|0x55)==0xdf)*pled=0x4f;if((P1=P1|0x55)==0x7f)*pled=0x66;}1在proteus上画出如下电路图.2在keil中编制程序,要求能显示按键数值.3运行程序,观察电路中数码管显示.拓展题行列式键盘结构每一个按键的电路是由行列组成,每一个按键占用两条I/O数据线。当键盘按下时,相应的行列线呈现短路。求键的位置(行、列)若D1=0,则D5=0假定S6按下求键的位置(行、列)假定S7按下若D1=0,则D5=?只有D2=0,则D5=0扫描原理:首先确定是否有键闭合(消抖,再判)然后逐一扫描以进一步确定是哪一键闭合
(用编码方式,找出唯一)
以4×4键盘为例:
(1)判断是否有键按下:使列线D0~D3都输出0,检测行线D4~D7的电平。如果D4~D7上的电平全为高,则表示没有键被按下。如果D4~D7上的电平不全为高,则表示有键被按下。(2)扫面按键键值:如果有键闭合,进行逐列扫描,找出闭合键的键号。行列式键盘的工作原理unsignedcharI;全局变量voidScankey(){ unsignedcharN,m,L; P1=P1&0Xf0;//列全送低电平
delay(1);//等低电平稳定
while((P1|0X0f)!=0Xff){ delay(2);//有按键,延时
if((P1|0X0f)!=0Xff){//再判,有按键
L=0X01;//第一列
for(m=0;m<4;m++){//共四列
P1=~L;//送m列零
delay(1);if((N=
P1&0Xf0)!=0Xf0){I=N|L;return;}//返回行列信息
L<<=1;}//下一列送低电平
}
}}switch(I){//根据行列信息,键盘处理程序
case0x
:….;break;case0x
:…..;break;default:…….;break;}P1
高4位(.7,.6,.5,.4)为行,输入低4位(.3,.2,.1,.0)为列,输出#include"reg52.h"#defineuncharunsignedchar#defineunintunsignedint#definerowkey()(~P3)&0x0funcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管代码unchardisp=0xff;voiddelay(unintt){unintx,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}voidscanner(){uncharcol,row,scan,keyin,kcode;scan=0xef;for(col=0;col<4;col++){P3=scan;P2=disp;keyin=rowkey();if(keyin!=0){for(row=0;row<4;row++){if(keyin==(0x01<<row))//判断列号
{kcode=row+4*col;//求出具体的按键号
disp=table[kcode];P2=disp;//显示
break;}}while(rowkey()!=0);delay(10);}scan=(scan<<1)|0x01;//这个扫描信号用来判断行号
}}voidmain(){while(1){scanner();}}左边程序为行列键盘、数码显示程序。要求:分析程序功能,画出原理图,调试,并修正程序。1在proteus上画出如下电路图.2在keil中编制程序,要求能显示按键数值.3运行程序,观察电路中数码管显示.提示逐列扫描参考:P1_4=0;P1_5=1;P1_6=1;P1_7=1; if(P1_0==0)P0=0X3F; //KEY0 if(P1_1==0)P0=0X06; //KEY1 if(P1_2==0)P0=0X..; //KEY2 if(P1_3==0)P0=0X..; //KEY3P1_4=1;P1_5=0;P1_6=1;P1_7=1; if(P1_0==0)P0=0X..; //KEY4 if(P1_1==0)P0=0X..; //KEY5 if(P1_2==0)P0=0X..; //KEY6 if(P1_3==0)P0=0X..; //KEY7P1_4=1;P1_5=1;P1_6=0;P1_7=1; if(P1_0==0)P0=0X..; //KEY8 if(P1_1==0)P0=0X..; //KEY9 if(P1_2==0)P0=0X..; //KEY- if(P1_3==0)P0=0X..; //KEY+P1_4=1;P1_5=1;P1_6=1;P1_7=0; if(P1_0==0)P0=0X..; //KEY= if(P1_1==0)P0=0X..; //KEY* if(P1_2==0)P0=0X..; //KEY/ if(P1_3==0)P0=0X..; //KEY
1在proteus上画出如下电路图.2在keil中编制程序,要求能显示按键数值.3运行程序,观察电路中数码管显示.4在本图上编程实现键控99-0倒计数秒显示案例五、六根据本图实现定时开关控制器(用中断)编程参考程序见书MCS系列单片机:以8XC51表示,X不同片内ROM类型不同。注:X=0,类型为:ROMX=7,类型为:EPROM(电写入,紫外线擦除)X=9,类型为:FLSAHROM(电改写)
支持ISP(InSystemProgramming)在系统/线中编程
IAP(InApplicationProgramming)应用中编程51子系列和52子系列
“51”是基本,“52”是增强:单片机芯片51子系列和52子系列单片机的区别片内ROM:4K增加到8K片内RAM:128B增加到256B定时器:2个增加到3个中断源:5个增加到6个MCS-51单片机结构内部数据区内部数据存储器物理上分为两大区域:00H~7FH即128B内RAM区
80H~FFH即SFR区(idatasbitbit)。R0、R1、R2、R3、R4、R5、R6、R7(using0~3)即可位寻址,又可字节寻址(bitsbitbdatadataidata)数据缓冲区、堆栈区、工作单元(dataidata)bit与sbit区别:前者不能定义绝对地址。如:sbitT1_1=P1^1;MCS-51单片机的外部扩展性能MCS-51单片机的片外总线结构
MCS-51系列单片机片外引脚可以构成三总线结构:地址总线(AB)数据总线(DB)控制总线(CB)所有外部芯片都通过这三组总线进行扩展。三总线的概念:地址总线——AB,P0口提供(A7~A0);
P2口提供(A15~A8),共16位。数据总线——DB,P0口提供(D7~D0),共8位。控制总线——CB,ALE、、、、等。单片机总线引脚结构
日常中断的例子返回
你正在专心看书,突然电话铃响,于是你记下正在看的书的页数,去接电话,接完电话后再回来接着看书。时间
计算机中的中断概念返回定义:中断是指由于某种随机事件的发生,计算机暂停现行程序的运行,转去执行另一程序(处理发生的事件),处理完毕后又自动返回原来程序暂停的位置继续运行。将能引起中断的事件称为中断源。CPU现行运行的程序称为主程序。处理随机事件的程序称为中断服务子程序。
中断技术的优点提高工作效率
——CPU可以同多个外设“同时”工作实时处理
——CPU及时处理随机事件(智能技术)故障处理
——电源掉电、存储出错、运算溢出
中断处理过程
中断处理过程分为三个阶段:中断响应、中断处理和中断返回。中断响应中断处理(又称中断服务)
中断返回
中断请求撤除中断响应中断返回MCS-51中断系统中断源中断标志中断允许中断优先级中断寄存器(主要为5个学习重点)
MCS-51的中断系统——中断源8051单片机有5个中断请求源:单片机INT0或
外部输入中断源INT0(P3.2)INT1或
外部输入中断源INT1(P3.3)T0
定时/记数器T0的溢出T1
定时/记数器T1的溢出串行口
片内串行口发送或接收中断源
MCS-51的中断系统——中断标志
每一个中断源都有相应的中断标志位;某一个中断源申请中断,相应中断标志位置1。特殊功能寄存器(SFR)IE
中断允许SFRIP
中断优先SFRTCON
中断控制SFRTMOD
定时器方式SFRSCON
串行口控制SFR(SBUF串行口缓冲SFR)单片机中断响应条件
中断源有中断请求;此中断源的中断允许位为1;
CPU开中断(即EA=1)。以上三条同时满足时,CPU才有可能响应中断。中断请求的撤除
CPU响应某中断请求后,在中断返回前,应该撤除该中断请求,否则会引起另一次中断。
定时器0或1溢出:CPU在响应中断后,硬件清除了有关的中断请求标志TFO或TF1,即中断请求是自动撤除的。
外部中断:CPU在响应中断后,也是用硬件自动清除有关的中断请求标志IE0或IE1。
串行口中断:CPU响应中断后,没有用硬件清除T1、R1,故这些中断不能自动撤除,而要靠软件来清除相应的标志。C51中断程序设计的完整语法如下:void函数名interruptn[usingm]
m、n为正整数,不允许使用表达式。n取值范围0~5,对应该中断源的编号。通常对普通8051系列单片机来说,外部中断0、定时器0、外部中断1、定时器1、串口的中断源编号依次为0、1、2、3、4。m取值范围0~3。例如:
voidserial_serviceinterrupt4using2{……;}KeilC51编译器用特定的编译器指令分配寄存器组。当前工作寄存器由using指定,“using”后的变量为一个0~3的整数。“using”只允许用于中断函数,它在中断函数入口处将当前寄存器组保留,并在中断程序中使用指定的寄存器组,在函数退出前恢复原寄存器组。
中断举例程序#include<reg51.h>#defineucharunsignedcharsbitkey1=P1^0;sbitkey2=P1^2;sbitkey3=P1^4;sbitkey4=P1^6;sbitkled1=P3^4;sbitkled2=P3^5;sbitkled3=P3^6;sbitkled4=P3^7;ucharnkey1=0,nkey2=0,nkey3=0,nkey4=0,nkey;codeuchardis[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};codeucharwie[]={0x01,0x02};ucharled[2];voiddelay(){ uchark;for(k=0;k<250;k++);}voidkey()interrupt0{kled1=1;kled2=1;kled3=1;kled4=1;if(key1==0){nkey1++;nkey=nkey1;kled1=0;}if(key2==0){nkey2++;nkey=nkey2;kled2=0;}if(key3==0){nkey3++;nkey=nkey3;kled3=0;}if(key4==0){nkey4++;nkey=nkey4;kled4=0;}led[1]=nkey/10;led[0]=nkey%10;}voidmain(){ucharii; IE=0X81;IP=0X0;TCON=0X01;while(1){for(ii=0;ii<2;ii++){P0=0x00;P2=wie[ii];P0=dis[led[ii]]; delay(); }}}1在proteus上画出如下电路图.2在keil中编制程序,要求能对应LED显示按键按下的次数值(累计).Key1Key2key3123#include<reg51.h>#defineucharunsignedcharuchardisplayD[2];//显示段码缓冲单元ucharcodedisplayW[]={0x01,0x02};//显示位码ucharcodedisplayB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};sbitled1=P1^0;sbitled2=P1^1;sbitled3=P1^2;//LED显示uchari=0,key=0;ucharNUMW=0,NUMC=0,NUMG=0; //计数初值
voiddisW()interrupt0using1 // led1{ if((++NUMW)==100)NUMW=0;key=0x01;}voiddisG()interrupt2using1 // led2{ if((++NUMC)==100)NUMC=0; key=0x02;}voiddisC()interrupt3using1 // led3{ if((++NUMG)==100)NUMG=0;TH1=0xff;TL1=0xff; key=0x03;}voiddispllay()interrupt1using2 //显示程序{TH0=(65536-10*11059/12)/256;//10MSTL0=(65536-10*11059/12)%256;P0=0x00;P2=displayW[i];P0=displayD[i];if(++i==2)i=0;}voidmain(){ IE=0x8f;TMOD=0x51;TH1=0xff;TL1=0xff;IP=0x02;TH0=(65536-10*11059/12)/256;//10msTL0=(65536-10*11059/12)%256;TCON=0x55; //下降沿触发0x50电平触发
led1=0;led2=0;led3=0;P2=0x0ff; displayD[0]=0x3f;displayD[1]=0x3f; while(1) { switch (key){case0x01:displayD[1]=displayB[NUMW/10];displayD[0]=displayB[NUMW%10];led1=1;led2=0;led3=0;break;case0x02:displayD[1]=displayB[NUMC/10];displayD[0]=displayB[NUMC%10];led1=0;led2=1;led3=0;break;case0x03:displayD[1]=displayB[NUMG/10];displayD[0]=displayB[NUMG%10];led1=0;led2=0;led3=1;break; default:break; } }}MCS-51的中断系统——中断寄存器
IE
EA
ESET1EX1ET0EX0
IE寄存器——中断允许寄存器EA中断允许总控位ES串行通讯中断允许ET1、ET0定时/记数1、0溢出中断允许EX1、EX0外部中断1、0允许76543210SFR
MCS-51的中断系统——中断允许INT0INT1T0T1串口IE0TF0IE1TF1TIRI中断源中断标志位
EA——总中断允许位,EA=1开放所有中断,EA=0,禁止所有中断;某一个中断源还有相应的中断允许位,1允许相应中断源的中断,0禁止相应中断源的中断。中断允许IEESET0EX0EX1ET1EA
51单片机有两个中断优先级——高级和低级专用寄存器IP为中断优先级寄存器,用户可用软件设定相应位为1,对应的中断源被设置为高优先级,相应位为0,对应的中断源被设置为低优先级系统复位时,均为低优先级
PSPT1PX1PT0PX0MCS-51的中断系统——中断寄存器
IP
76543210IP寄存器——中断优先级寄存器SFR
MCS-51的中断系统——中断优先级INT0INT1T0T1串口中断源
单片机中有两个中断优先级,即高优先级中断和低优先级中断,前者优先权高于后者(在程序中设置,IP相应位=1,为高优先级);同一优先级别的中断源按照自然优先级顺序确定优先级别(硬件形成,无法改变)。自然优先级高低优先控制IPPSPT0PX0PX1PT1
同一优先级(IP)中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:MCS-51的中断系统——中断寄存器TF1
TR1TF0
TR0IE1IT1IE0IT0TCON
T1溢出中断标志(TCON.7):
T1启动计数(TR1=1)后,计满溢出由硬件置位TF1=1,向CPU请求中断,此标志一直保持到CPU响应中断后,才由硬件自动清0。也可用软件查询该标志,并由软件清0。(同样T0在TR0=1,TF0的状态处理)76543210TCON寄存器——T0和T1控制寄存器SFRTF1
TR1TF0
TR0IE1IT1IE0IT0TCON外部中断INT1中断标志位(TCON.3):
IE1=1,外部中断INT1向CPU申请中断
外部中断INT1触发方式控制位(TCON.2):
IT1=0,电平触发方式
IT1=1,下降沿触发方式76543210TCON寄存器——T0和T1控制寄存器(同理外部中断INT0)TMODD7D6D5D4D3D2D1D0GATA
M1M0GATAM1M0←T1方式字段→←T0方式字段→GATE——门控位。
GATE=0启动不受/INT0或/INT1的控制;
GATE=1启动受
/INT0或
/INT1的控制。
C/T——外部计数器/定时器方式选择位
C/T=0定时方式;
C/T=1计数方式。
M1M0——工作模式选择位(编程可决定四种工作模式)。
SFR(1)定时/计数器的工作方式M1M0——工作模式选择位(编程可决定四种工作模式)0013位定时/计数器模式00116位定时/计数器模式108位定时/计数器(自动重装初值)模式211T08位定时/计数模式3T1停止工作
串行口控制寄存器SCONSM0、SM1:控制串行口的工作方式。SM2:允许方式2和方式3进行多机通信控制位。REN:允许串行接收控制位。REN=1,允许接收。TB8:是工作在方式2和方式3时要发送的第9位数据,根据需要由软件置位和复位。RB8:是工作在方式2和方式3时接收到的第9位数据。TI:发送中断标志位。必须由软件清零。RI:接收中断标志位。必须由软件清零。返回
TI(SCON.1)——串行发送中断标志。
RI(SCON.0)——串行接收中断标志。
TIRIMCS-51的中断系统——中断寄存器SCON76543210SCON寄存器——串行口控制寄存器SFR返回
TI(SCON.1)——串行发送中断标志。
RI(SCON.0)——串行接收中断标志。
TIRIMCS-51的中断系统——中断寄存器SCON76543210SCON寄存器——串行口控制寄存器SFR#include<reg51.h>#defineucharunsignedcharsbitkey1=P1^0;sbitkey2=P1^2;sbitkey3=P1^4;sbitkey4=P1^6;sbitkled1=P3^4;sbitkled2=P3^5;sbitkled3=P3^6;sbitkled4=P3^7;ucharnkey1=0,nkey2=0,nkey3=0,nkey4=0,nkey;codeuchardis[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};codeucharwie[]={0x01,0x02};ucharled[2];voiddelay(){ uchark;for(k=0;k<250;k++);}voidkey()interrupt0{kled1=1;kled2=1;kled3=1;kled4=1;if(key1==0){nkey1++;nkey=nkey1;kled1=0;}if(key2==0){nkey2++;nkey=nkey2;kled2=0;}if(key3==0){nkey3++;nkey=nkey3;kled3=0;}if(key4==0){nkey4++;nkey=nkey4;kled4=0;}led[1]=nkey/10;led[0]=nkey%10;}voidmain(){ucharii; IE=0X81;IP=0X0;TCON=0X01;while(1){for(ii=0;ii<2;ii++){P0=0x00;P2=wie[ii];P0=dis[led[ii]]; delay(); }}}C51中断服务程序的注意事项:1)为提高中断响应的实时性,中断服务程序应尽量简短,并避免使用复杂变量类型及复杂算术运算。通常在中断服务程序中使用一些标志,由主程序或相应背景程序根据对应的标志作相应的处理。
2)外部中断0、1及定时器0、1的中断申请标志在CPU响应中断后会自动清0,但串行口中断标志TI/RI及定时器2的中断申请标志TF2不会自动清0,必须在中断服务程序中用软件清0,否则
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合金污水管施工方案
- 能源行业绿色能源项目开发方案
- 建设工程施工合同99
- 三农电子商务服务模式研究手册
- 办公楼安装施工方案
- 临近鱼塘安全施工方案
- 铝板墙面施工方案
- 凹凸镜施工方案
- 道路工程拆除施工方案
- 修路施工方案公众号
- 2024全国各省高考诗歌鉴赏真题及解析
- 《临床科研思维》课件
- GA/T 761-2024停车库(场)安全管理系统技术要求
- 大学生创新创业基础(创新创业课程)完整全套教学课件
- 人教版小学数学四年级下册第一单元测试卷附答案(共9套)
- 广西版三年级美术下册全册教案
- 2024年青岛酒店管理职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 部编版四年级道德与法治下册第3课《当冲突发生》优秀课件(含视频)
- 油田科研单位有效发挥技术专家作用初探
- 席位卡A4纸打印模板(共3页)
- 阳泉气象地质资料
评论
0/150
提交评论