内容发布更新时间 : 2024/12/24 0:01:25星期一 下面是文章的全部内容请认真阅读。
{ if(key==0) { delay(); if(key==0) { if(i!=10) { P2=tab[i]; i++;} else {i=0; P2=tab[i]; i++;}}}}} 四.结果分析
听了老师的讲解和对实验原理图的理解,此次实验进行很顺利。
实验四.中断实验
一. 设计题目
1、利用外部中断控制灯亮 2、利用外部中断控制数码管亮0-9
二. 实验原理:
当CPU 正在执行程序时,单片机外部或内部发生了某一件事情,请求CPU迅速去处理,
于是CPU暂时中止当前的工作,转到中断服务处理程序处理所发生的事件,处理完该事件后再回到原被中断的地方,继续做原来的工作,CPU处理事件的过程,称为CPU的中断服务。 在MCS-51单片机中,用户(设计者)用3个特殊功能寄存器对中断进行管理。
三. 软件设计:
1、程序流程图 2、源代码:
<1> //外部中断控制灯亮: #include
led=1;
IT0=0;//低电平有效 EA=1; //中断总开关
EX0=1; //外部中断INT0 ,P3^2
}
void deng() interrupt 0 //外部中断0 ,方式0 {
led=0; }
<2> //外部中断控制数码管亮0-9 #include
unsigned char code tab[10]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; //定义数码管是显示0~9 unsigned char i; unsigned int j; void main() { EA=1; //中断总开关打开 IT0=0; //定义中断是低电平有效 EX0=1; //允许中断IT0有效 P2=0xc0; //开始数码管显示0 while(1); }
void EX_INT0() interrupt 0 //选择方式0 { for(j=0;j<25000;j++); //消抖 if(i<9) //判断是否超过显示tab内定义的10个数 { i++ ; P2=tab[i]; //显示下一个数 for(j=0;j<25000;j++); //延时 }
else {i=0 ; //如果i大于9,定义i=0,使显示再次进入tab P2=0xc0; } }
四实验结果分析:
实验时由于没有设置消抖,数码管显示数字异常,通过添加一个延时程序,数字正常显示。
实验五 定时器实验
一. 设计题目
用定时器0工作方式1控制两个LED以不同周期闪烁,
说明:设计一个LED以200MS为周期闪烁,另一个LED以800MS为周期闪烁。设计定时
器0每50MS产生一次中断,由2个变量分别对这中断次数计数,其中一个变量计数
2次,即100MS,控制LE亮灭,另一个变量计数8次,即400MS,控制LED亮灭。
二. 实验原理
51单片机有两个定时/计数器,分别称为T0和T1,它们功能完全相同,可作为定时器或计数器使用。其核心是一个16位加1计数器,它们由两个8位寄存器组成,其中THX为高8位,TLX为低8位(X=0或1,0表示定时/计数器T0,1表示定时/计数器T1);在定时方式下,对单片机振荡器的12分频后的脉冲计数;在计数方式下,对来自T0引脚(P3.4)或T1引脚(P3.5)的外部脉冲计数。加1计数器可按需求装入初值,当加法计数器计满回零时,定时/计数器中断(溢出)标志位TFX置1(X=0或1,0表示定时/计数器T0,1表示定时/计数器T1),可利用查询方式或中断方式得知TFX=1。依据计数器计数个数和输入脉冲的周期,得到定时时间。
有TMOD和TCON两个特殊功能寄存器,设置定时/计数器的工作方式和控制它们的工作。
三.软件设计:
#include
#define uchar unsigned char uchar num1; uchar num2; void main() {
TMOD=0x01; //0000 0001 用方式1 T0 TH0=-0xf6; ///高八位置0xf6H TL0=-0x3c; //低八位置0x3cH TR0=1; // EA=1; //中断总开关打开 ET0=1; //计数功能 P2_0=0; //初始化置0 P2_1=0; //初始化置0 while(1); }
void deng() interrupt 1 //用中断计数控制灯亮 方式1:计数/定时 {
TH0=-0xf6; //高八位置0xf6H TL0=-0x3c; //低八位置0x3cH num1++; // num2++; //
if(num1==2) // 当计数num1等于2时 {num1=0;
P2_0=~P2_0;} // 计数2次控制灯亮 100ms if(num2==8) //当计数num2等于8时 {num2=0; //
P2_1=~P2_1;} // 计数8次控制灯亮 400ms
}
四、实验结果分析
在赋值过程中TH0和TL0只能赋负值才能正确闪烁,如果赋正值两个灯就会一直亮着。