单片机实验报告
南京理工大学紫金学院电光系
一、 实验目的
1、理解A/D转换工作原理。
2、学习掌握ADC0809的A/D转换原理和并行A/D转换接口的编程方法。
3、学习使用并行模数转换芯片ADC0809进行电压信号的采样和数据处理。
二、 实验原理
单片机给ADC提供一个启动转换信号后,ADC转换开始,当A/D转换结束时,ADC输出一个转换转换结束标志信号,通知单片机读取转换结果。单片机检验判断A/D转换结果的方法一般有中断和查询俩种。整个A/D转换都是在一定的时钟作用下完成的,其频率是决定芯片转换速度的基础。
三、 实验内容
1.开始试验前应做好准备工作:
(1)阅读ADC0809的数据手册,熟悉ADC0809功能及A/D转换工作原理;
(2)认真阅读2.2节内容,熟悉利用DP-51PROC进行调试仿真的基本操作流程。
2、了解本次实验涉及的各功能模块电路结构,其中,D2区有两个独立电位器,部分的电路原理图如图所示;A2区的PARK2区是ADC0809的工作区,如图所示
电位器电路原理图
ADC0809芯片部分电路原理图
3、 系统板硬件连线
(1)将ADC809PACK模块(选配件)插入PARK2区;
(2)将D2区1KΩ电位器和10KΩ电位器的左端金属孔通过导线连接到的该区GND金属孔,而右端金属孔通过导线连接到该区的VCC金属孔;
(3)将D2区的1KΩ电位器的中间金属孔连接到A7区的P2-IO2金属孔,而D2区10KΩ电位器的中间金属孔连接到A7区的P2-IO1金属孔;
(4)将A7区的P2-IO3-P2-IO5分别连接到A2区的A2-A0;
(5)将A7区的P2-CS连接到A2区的A15;
(6)运行编写好的软件程序,每次跑到断点就会停止,此时观察转换得结果与数字万用表测量的结果相比较是否正确(所需观察的存储单元或者变量在程序中依照注释执行)
(7)改变1KΩ电位器和/或10KΩ电位器的旋转位置,用数字万用表测量中间金属孔的电压,再次运行程序至断点处,观察转换的结果是否正确。
4.程序设计
程序流程图
思考题
采用中断方法等待ADC0809转换结束
1.C语言程序
#include<reg51.h>
#include<absacc.h>
#define adc0 XBYTE[0X7FF0]
#define uint unsigned int
#define uchar unsigned char
uchar num,cnt,flag;
float dat;
uint voltmeter,m,n,p;
uchar dis_dat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void inint()
{
TMOD=0x10;
TH1=(65536-46083)/256;
TL1=(65536-46083)%256;
TR1=1;
EA=1;
ET1=1;
EX0=1;
cnt=20;
adc0=0;
num=0;
}
void delay(uint n)
{
uint i;
for(i=0;i<n;i++);
}
void display(uchar a,b,c)
{
P2=0x01;
P1=dis_dat[a];
delay(100);
P2=0x02;
P1=dis_dat[b];
delay(100);
P2=0x04;
P1=dis_dat[c];
delay(100);
P2=0x08;
P1=0xc1;
delay(100);
P2=0x01;
P1=0x7f;
delay(100);
}
void main()
{
inint();
while(1)
{
if(flag==1)
{
flag=0;
dat= num/255.0*5.0;
}
EX0=0;
voltmeter=(uint)(dat*100);
m=voltmeter/100;
n=voltmeter/10%10;
p=voltmeter%10;
display(m,n,p);
EX0=1;
}
}
void time_1()interrupt 3
{
TH1=(65536-46083)/256;
TL1=(65536-46083)%256;
cnt--;
if(cnt==0)
{
cnt=20;
flag=1;
}
}
void T_0()interrupt 0
{
num=adc0;
adc0=0;
}
2.电路图
四、 小结与体会
通过此次A/D转换实验,我学会了判断A/D转换启动、结束标志,对A/D转换有了更深入的理解与体会。
第二篇:时钟综合实验,南京理工大学紫金学院单片机实验报告
单片机实验报告
南京理工大学紫金学院电光系
一、 实验目的
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.实验原理图
四、 小结与体会
通过此次实验我学会了利用定时/计数器与外部中断的工作原理,设计了一个简单的时钟,具备小时,分,秒计时与显示功能。