单片机实验报告
南京理工大学紫金学院电光系
一、 实验目的
1、 学习Proteus软件基本使用方法;
2、 掌握定时/计数器与外部中断工作原理;
3、 学习设计单片机控制的多位数码管扫描显示电路;
4、 理解数码管动态显示的原理。
二、 实验原理
AT89C51单片机为控制器,八位7段数码管分别显示小时的十位、小时的个位、连接符、分的十位、分的个位、连接符、秒的十位和秒的个位,其中数码管的位选口为P2口,段选口为P0口,小时、分和秒的能动态显示。定时器实现1秒准确定时,外部中断0引脚外接键盘BUTTON1,实现手动校分功能;外部中断1外接键盘BUTTON2,实现清零功能。
三、 实验内容
根据实验任务设计要求,在Keil软件中实现程序编辑、编译与执行等操作。对编译通过的过程可选择单步调试的方式来观察运行的结果,以及各个寄存器的值如何变化。参考程序流程:主程序流程:开始→变量赋初值→定时器T1赋计数初值→设置外部中断控制字→开中断→开计数器→送位选字→送段选码→延时→送位选字,定时器T1中断流程:定时器T1赋计数初值→到1秒了吗?→Y秒加1 or N结束→到1分钟了吗?→Y秒清零 or N结束→分钟加1→到60分钟了吗?→Y分钟清零 or N结束→结束,外部中断0流程:分钟加1→到60分钟了吗?→Y分钟清零 or N结束→结束,外部中断1:分钟清零→秒清零→结束。
1、程序代码:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
//共阳 0-9
uchar dis_dat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar k,second,minute,secondl,secondh,minutel,minuteh;
void init()
{
k=20;
second=0;
minute=0;
secondl=0;
minutel=0;
secondh=0;
minuteh=0;
}
void Timeinit()
{
TMOD=0x10;
TH1=(65536-46082)/256;
TL1=(65536-46082)%256;
TR1=1;
EA=1;
ET1=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
}
void delay()
{
uchar i,j;
for(i=0;i<50;i++)
for(j=0;j<100;j++);
}
void display(uchar a,b,c,d)
{
P2=0x1f;
P0=dis_dat[a];
delay();
P2=0x2f;
P0=dis_dat[b];
delay();
P2=0x4f;
P0=dis_dat[c];
delay();
P2=0x8f;
P0=dis_dat[d];
delay();
}
void main()
{
Timeinit();
init();
while(1)
{
minuteh=minute/10;
minutel=minute%10;
secondh=second/10;
secondl=second%10;
display(minuteh,minutel,secondh,secondl);
}
}
void Time1()interrupt 3
{
TH1=(65536-46082)/256;
TL1=(65536-46082)%256;
k--;
if(k==0)
{
k=20;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
second=0;
}
}
}
}
void int_0()interrupt 0
{
minute++;
if(minute==60)
{
minute=0;
}
}
void int_1()interrupt 2
{
minute=0;
second=0;
}
2.实验原理图
四、 小结与体会
通过此次实验我学会了利用定时/计数器与外部中断的工作原理,设计了一个简单的时钟,具备小时,分,秒计时与显示功能。
第二篇:定时器及外部中断实验,南京理工大学紫金学院单片机实验报告
单片机实验报告
实验名称:
定时器及外部中断实验
姓 名:
学 号: 班 级:
时 间:
通信 2013.11
南京理工大学紫金学院电光系
一、 实验目的
1、理解定时/计数器的工作原理;
2、掌握外部中断的基本处理方法;
3、学习中断处理程序的编程方法。
二、 实验原理
1、P1口为计数值输出口,利用定时器实现1秒定时,计数初值为0,每隔1秒加1;另外,外部中断0引脚外接键盘BUTTON,按键使得显示数值加1。电路原理图如图:
电路原理图
2、系统板上硬件连线
把“单片机系统”A2区的J61接口的P1.0~P1.6端口与D1区的J52接口相连。 把“单片机系统”A2区的INT0端口用导线连接到D1区的KEY1端口上。
3、程序设计流程
(a)主流程图 (b)定时器中断流程图 (c)外部中断流程
三、 实验内容
1、 按流程编得代码:
#include<reg51.h>
#define uchar unsigned char
sbit p32=P3^2;
sbit p33=P3^3;
uchar num,a;
uchar b;
void main()
{
TMOD=0x01;
TH0=(65536-46082)/256; TL0=(65536-46082)%256; EA=1;
ET0=1;
TR0=1;
TF0=0;
EX0=1;
IT0=0;
EX1=1;
IT1=0;
P1=0xff;
a=0;
while(1)
{
b=a+(a/10*6); P1=b;
if(b==160)
{
a=0;
}
}
}
void T0_time()interrupt 1 {
TH0=(65536-46082)/256; TL0=(65536-46082)%256; num++;
if(num==20)
{
num=0;
a++;
}
}
void X0()interrupt 0 {
a++;
while(!p32);
}
void X1()interrupt 2 {
a=0;
while(!p33);
}
2、将代码与电路图连接调试仿真,观察到现象:
四、 小结与体会
通过此次实验,我们更深地理解了定时/计数器的工作原理,掌握了外部中断的基本处理方法以及在学习中断处理程序的编程方法