单片机实验报告 下载本文

内容发布更新时间 : 2024/12/23 20:05:33星期一 下面是文章的全部内容请认真阅读。

{ 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 sbit led=P2^1; void main() {

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 sbit P2_0=P2^0; sbit P2_1=P2^1;

#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只能赋负值才能正确闪烁,如果赋正值两个灯就会一直亮着。