1
福建农林大学计算机与信息学院
信息工程类
实验报告
课程名称: 姓 名:
系:
专 业: 年 级: 学 号: 指导教师: 职 称:
单片机技术 詹缓辉
电子信息工程系 电子信息工程 2011级 3116004094 易金聪 副教授
2013 年 10 月 28 日
实验项目列表
序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
实验项目名称 Keil C51 和Proteus 软件的使用 单片机I/O接口应用实验—流水灯 中断优先级实验 60秒倒计时时钟实验 4×4矩阵键盘按键识别实验 成绩 指导教师 易金聪 易金聪 易金聪 易金聪 易金聪 福建农林大学计算机与信息学院信息工程类实验报告
系: 电子信息工程 专业: 电子信息工程 年级: 2011级
姓名: 詹缓辉 学号: 3116004094 实验课程: 单片机技术
实验室号:_____田C513__ 实验时间: 10.26
指导教师签字: 易金聪 成绩:
实验一 Keil C51 和Proteus 软件的使用
1.实验目的和要求
1)熟悉Keil C51软件界面,以及编辑、编译、运行程序的步骤;
2)熟悉Proteus软件界面,掌握用Proteus画仿真图的方法。 3)掌握电子电路的设计与仿真调试的方法。
2.实验原理
1)Keil C51软件使用
在Keil C51集成开发环境下,建立一个工程并编辑以下源程序,熟悉Keil C51集成开发环境下各种菜单、命令的使用。
#include \
#define uchar unsigned char #define uint unsigned int sbit in=P3^0; sbit out=P1^0;
void main(void) { while(1) { in=1;
if(in= =0)out=0; else out=1; }
2)Protues软件使用
下图为利用单片机、1个开关和1个发光二极管,构成一个简单的开关检测系统的仿真电路图。单片机P3.0引脚接按钮开关,P1.0引脚接发光二极管的阴极。当开关闭合时,发光二极管亮;开关打开时,发光二极管灭;按钮开关与发光二极管没有任何电气上的联系。利用Protues仿真软件画出仿真电路图,并进行电气规则检查。
C2U130pF19XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617 }
X112MHz18XTAL2D1R24.7K930pFRSTR4220293031C310uFPSENALEEAKR310K10K12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51LED-GREENC1R1220 3)Proteus仿真
电路图绘制完毕后,加载“.hex”文件到电路图中的单片机内进行仿真,观察运行结果。注意系统时钟频率的设置 3.主要仪器设备(实验用的软硬件环境)
安装有Keil C51软件与Proteus仿真软件PC机1台 4.操作方法与实验步骤
1)Keil C51软件使用 (1)建立用户文件夹 (2)建立工程
(3)建立文件并编码。输入以下源程序,并保存在项目所在的目录中 (4)把文件加入工程中
(5)编译工程。编译时观察在界面下方的“Build”页中的到编译错误信息和使用的系统资源情况等。
(6)调试。利用常用调试命令,如复位、运行、暂停、单步、单步跳过、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令进行调试,观察并分析调试结果。
(7)目标代码文件的生成。运行生成相应的.HEX文件。 2)proteus电路设计
(1)建立新文件 (2)设定绘图纸大小
(3)选取元器件并添加到对象选择窗口中 (4)放置、调整元器件位置 (5)放置电源、地(终端)
(6)电路图布线调 (7)电气检测 (8)电路图存盘。
3)Keil C与Proteus连接仿真调试
在Keil C中编译输出*.HEX文件,右键选中工作区中单片机芯片,左键单击打开属性对话框,在弹出的选择文件对话框中选择相应的*.HEX文件。通过运行控制按钮控制程序的执行,观察K1闭合和打开时的程序运行过程。
5.实验内容及实验数据记录 每当按下K时,LED灯就会发光。 6.实验数据处理与分析
每当按下K时,in(p3.0)I/O口就会变为低电平,该信号使得CPU给out(p3.0)I/O口发送低电平,使得LED灯发亮。 7.质疑、建议、问题讨论
1、建议增加延迟函数,因为轻触按键按下的时间短,LED亮的时间就会
很短,或者直接换成自锁开关。
2、建议增加一个判断按键抖动的函数,防止非实验因素。
福建农林大学计算机与信息学院信息工程类实验报告
系: 电子信息工程 专业: 电子信息工程 年级: 2011级
姓名: 詹缓辉 学号: 3116004094 实验课程: 单片机技术
实验室号:______田C513_ 实验时间: 10.26
指导教师签字: 易金聪 成绩:
实验二 单片机I/O接口应用实验—流水灯
1.实验目的和要求
1)进一步掌握单片机仿真软件的使用方法。
2)掌握单片机最小系统的构成。
3)掌握单片机I/O口的使用方法,如何控制I/O口来驱动LED发光二极管。 4)熟悉C51程序编程和调试方法。 2.实验原理
利用AT89C51单片机控制8个发光二极管按照要求实现以下各个功能: (1)点亮板子上的第一个灯D0。
(2)点亮D0、D2、D4、D6灯,与D1、D3、D5、D7灯交替闪烁。 (3)按顺序循环移动点亮。 3.主要仪器设备(实验用的软硬件环境)
安装有Keil C51软件与Proteus仿真软件PC机1台 4.操作方法与实验步骤
1)利用Proteus软件设计以下电路图。
C130pFX1U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161719CRYSTALC21830pFXTAL2R5D0LED-YELLOW9RSTC31uF10kD1LED-YELLOWVCCR610k293031PSENALEEAD2LED-YELLOWD3LED-YELLOWR7R8R9470RR10470RR11470RR12470RR13470RR14470R470R470R12345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C52D4LED-YELLOWD5LED-YELLOWD6LED-YELLOWD7LED-YELLOW 2)源程序设计
分析设计要求,根据任务要求,绘制源程序流程图,然后使用Keil C进行源程序文件的设计与调试,观察并分析程序调试结果。
3)Proteus仿真
加载目标代码至单片机中,利用Proteus硬件仿真功能,进行流水灯的仿真运行,观察运行结果
代码 (1)
#include
{P1=0xfd;(1111 1101)
} (2)
#include
#define uint unsigned int #define uchar unsigned char void delay( ); void main( ) { while(1) }
void delay() { uint x,y;
for(x=100;x>0;x--)
for(y=600;y>0;y--) { P1=0xaa;(1010 1010) }
delay();
P1=0x55;(0101 0101) delay();
; } (3)
#include
#include
void main()
{ P1=0xfe;(1111 1110) while(1) {
P1=_crol_(P1,1);
delay();
} }
5.实验内容及实验数据记录
第一个实验使得D1保持常亮;第二个实验的现象为:奇数位数码管D1,D3,D5,D7与偶数位的数码管D0,D2,D4,D6交替发亮。第三个实验现象为:从D0开始向高位跑马灯式的亮。 6.实验数据处理与分析
(1) #include
(2)
#include
#define uint unsigned int #define uchar unsigned char void delay( );void main( ) { while(1) }
void delay()//延时程序 { uint x,y; } (3)
#include
#include
}//由于延时函数写在main函数之前,所以不必向上面的程序对延时进行声
for(x=100;x>0;x--)
for(y=600;y>0;y--); { P1=0xaa;
P1=0x55; delay();
} delay();
明
void main()
{ P1=0xfe;//P1=11111110,低电平二极管发光 while(1) { } }
7.质疑、建议、问题讨论
延时参数的选定是个比较麻烦的事,要不断的实时调试才能找到一个好的延时参数。
P1=_crol_(P1,1); delay();//调用延时程序
福建农林大学计算机与信息学院信息工程类实验报告
系: 电子信息工程 专业: 电子信息工程 年级: 2011级
姓名: 詹缓辉 学号: 3116004094 实验课程: 单片机技术
实验室号:___田C513____ 实验时间: 10.26
指导教师签字: 易金聪 成绩:
实验三 中断优先级实验
1.实验目的和要求
1)掌握单片机系统中断嵌套及中断优先级的原理和使用方法。 2)掌握中断处理程序的编写方法 2.实验原理
(1)在单片机的P1口上接有8只LED,单片机主程序控制P1口发光二极管进行同亮同灭的闪烁显示,按钮K0接至P3.2/INT0*引脚,按钮K1接至P3.3/INT1*引脚。
(2)当只单击K0按钮时,一个黑灯(8个发光二极管只有一个熄灭,其余为亮)由下向上流水显示一次,然后P1口的发光二极管进行同亮同灭的闪烁显示;当只单击K1按钮时,一个亮灯(8个发光二极管只有一个为亮,其余为暗)由下向上流水显示一次,然后然后P1口的发光二极管进行同亮同灭的闪烁显示;如果先单击K0按钮再单击K1按钮,一个黑灯由下向上流水显示一次后,才能再一个亮灯由下向上流水显示一次,然后再回到8个灯同亮同灭的闪烁显示状态;如果先单击K1按钮后,一个亮灯由下向上流水显示,在亮灯显示没有到达D0
显示时,此时再单击K0按钮,则一个黑灯由下向上流水显示,表明执行了外中断0的高优先级中断。一个黑灯向上流水显示完毕时,再执行一个亮灯到D0显示完毕的外中断0中断程序,从而说明高优先级的外部中断0能够把低优先级的外中断1的中断服务程序打断。
3.主要仪器设备(实验用的软硬件环境)
安装有Keil C51软件与Proteus仿真软件PC机1台
4.操作方法与实验步骤
1)利用Proteus软件设计以下电路图。 2)源程序设计
分析设计要去,根据任务要求,绘制源程序流程图,然后使用Keil C51进行源程序文件的设计与调试,观察并分析程序调试结果。
3)Proteus仿真
加载目标代码至单片机中,利用Proteus硬件仿真功能,进行仿真运行,观察当K0、K1分别按下再松开时的LED显示情况;观察先单击K1按钮后,在亮灯显示没有到达D0显示时,此时再单击K0按钮时的LED显示情况。
5.实验内容及实验数据记录 参考源程序代码如下:
#include
//注意,理论上使用\类型的循环结构,多数情况下汇编效率要略高于\。
//但由于有时候会软件冲突,Proteus仿真时,使用\类型将会仿真出错。
//因此这里使用\。但在硬件试验下建议使用\。
void delay_10ms(unsigned char delay_ms_num) { unsigned int i,j,k;
for(i=0;i<=delay_ms_num;i++) for(j=0;j<=100;j++) }
//中断初始化函数 void tx_init() { EA=1;
PX0=1;(IP=0x01;)//中断优先级设置,打开INIT0口。 EX0=1;(IE=0x81;)//中断允许设置。 IT0=1;(SCON=0x01;)//中断请求标志设置。 EX1=1; IT1=1; }
void main() { tx_init(); P1=0x00; while(1)
{ delay_10ms(100);
P1=~P1;
for(k=0;k>=100;k++);
} }
void tx0_func( ) interrupt 0
{ unsigned char i;
//C51语言中调用循环移位不便,且有时候会与Proteus有冲突,故采用查表实现循环移位。
unsigned char code
table0[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
for(i=0;i<7;i++) { P1=table0[i];
delay_10ms(255); delay_10ms(255);
}
P1=0xff;//完成中断后灯全部熄灭 }
void tx1_func()interrupt 2 { unsigned char i; unsigned char code
table2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
for(i=0;i<=7;i++) { P1=table2[i];
delay_10ms(255); delay_10ms(255);
}
P1=0x00;//完成中断后灯全部点亮 }
6.实验数据处理与分析
实验现象为:开始两个按键都不按下时,LED灯为交替闪烁,当按下只单击K0按钮时,一个黑灯(8个发光二极管只有一个熄灭,其余为亮)由下向上流水显示一次,然后P1口的发光二极管进行同亮同灭的闪烁显示;当只单击K1按钮时,一个亮灯(8个发光二极管只有一个为亮,其余为暗)由下向上流水显示一次,然后然后P1口的发光二极管进行同亮同灭的闪烁显示;如果先单击K0按钮再单击K1按钮,一个黑灯由下向上流水显示一次后,才能再一个亮灯由下向上流水显示一次,然后再回到8个灯同亮同灭的闪烁显示状态;如果先单击K1按钮后,一个亮灯由下向上流水显示,在亮灯显示没有到达D0显示时,此时再单击K0按钮,则一个黑灯由下向上流水显示 7.质疑、建议、问题讨论
建议增加按键抖动时的判断函数,防止系统误差;建议最好使用白色的LED,这样实验现象会比较明显。
福建农林大学计算机与信息学院信息工程类实验报告
系: 电子信息工程 专业: 电子信息工程 年级: 2011级
姓名: 詹缓辉 学号: 3116004094 实验课程: 单片机技术
实验室号:_____田C513__ 实验时间: 10.26
指导教师签字: 易金聪 成绩:
实验四 60秒倒计时时钟实验
1.实验目的和要求
1)掌握单片机定时器中断的使用。 2)了解定时器/计数器各工作模式的区别。 3)掌握定时器/计数器定时模式的使用及编程。 2.实验原理
利用单片机的定时器/计数器实现60秒倒计时实验,采用两只数码管从59开始静态显示倒计时的秒值,当显示为00时,再从59开始显示倒计时。 3.主要仪器设备(实验用的软硬件环境)
安装有Keil C51软件与Proteus仿真软件PC机1台 4.操作方法与实验步骤
1)利用Proteus软件设计以下电路图。其中,带公共端的共阳极七段绿色数码管为:7SEG-COM-AN-GRN,四输入译码器为:74LS47,电容、电解电容为:CAP、CAP-ELEC。电路采用两片74LS47 BCD-7段数码管译码器/驱动器,即用于将BCD码转化为数码管的显示数字。
2)源程序设计
分析设计要去,根据任务要求,绘制源程序流程图,然后使用Keil C进行源程序文件的设计与调试,观察并分析程序调试结果。
3)Proteus仿真
加载目标代码至单片机中,利用Proteus硬件仿真功能,进行仿真运行,观察七段数码管的显示。
4、参考源程序
#include
unsigned char second,timer; void t1_init( ) { TMOD=0x10; IE=0x88; TH1=0x3c; TL1=0xb0; TR1=1;
}
void main() { t1_init(); second=59; timer=0; while(1); }
void t1_func( ) interrupt 3 { TH1=0x3c; TL1=0xb0; if(timer<20) { timer=timer+1; }
else if(timer==20) { timer=0; if(second==0) { second=59; } else
{ second=second-1; }
}
P2=second/10; P3=second; }
5.实验内容及实验数据记录
利用单片机的定时器/计数器实现60秒倒计时实验,采用两只数码管从59开始静态显示倒计时的秒值,当显示为00时,再从59开始显示倒计时。
6.实验数据处理与分析
#include
unsigned char second,timer; void t1_init( ) { TMOD=0x10; IE=0x88; TH1=0x3c; TL1=0xb0;
TR1=1; }
void main() { t1_init(); second=59; timer=0; while(1); }
void t1_func( ) interrupt 3 { TH1=0x3c; TL1=0xb0; if(timer<20) { timer=timer+1; }
else if(timer==20) { timer=0; if(second==0) { second=59; } else
{ second=second-1;
} }
P2=second/10; P3=second; }
7.质疑、建议、问题讨论
引脚占用过多,建议采用LED二合一式的。
福建农林大学计算机与信息学院信息工程类实验报告 系: 电子信息工程 专业: 电子信息工程 年级: 2011级 姓名: 詹缓辉 学号: 3116004094 实验课程: 单片机技术 实验室号: 田c513 实验设备号: 实验时间: 10.26 指导教师签字: 易金聪 成绩:
实验五 4×4矩阵键盘按键识别实验
1.实验目的和要求
1)理解掌握矩阵键盘扫描的工作原理。 2)掌握矩阵键盘与单片机接口的编程方法。 2.实验原理
利用4×4矩阵键盘和一个LED数码管构成简单的输入显示系统,实现对键盘的扫描和LED数码管显示键盘按下键的键号。当某个键按下时,可将相应按键值(十进制)在两位数码管上显示出来。 3.主要仪器设备(实验用的软硬件环境)
安装有Keil C51软件与Proteus仿真软件PC机1台
4.操作方法与实验步骤
1)利用Proteus软件设计以下电路图。其中,带公共端的共阳极七段绿色数码管为:7SEG-COM-AN-GRN,四输入译码器为:74LS47,电容、电解电容为:
CAP、CAP-ELEC。电路采用两片74LS47 BCD-7段数码管译码器/驱动器,即用于将BCD码转化为数码管的显示数字。P2口和P3口的低四位通过74LS47与数码管相连;P1口的低四位与键盘的行线相连接,P1口的高四位与键盘的列线相连接。
2)源程序设计
分析设计要去,根据任务要求,绘制源程序流程图,然后使用Keil C进行源程序文件的设计与调试,观察并分析程序调试结果。
3)Proteus仿真
加载目标代码至单片机中,利用Proteus硬件仿真功能,进行仿真运行,分别按下各个键盘观察七段数码管的显示。
5.实验内容及实验数据记录
6.实验数据处理与分析
#include
unsigned char key_scan()
{ unsigned char key_temp0,key_temp1; unsigned char key_num=0; P1=0x0f; key_temp0=P1; if(key_temp0!=0x0f) { delay_5ms();
key_temp0=P1; if(key_temp0!=0x0f) { P1=0xf0; key_temp1=P1; if(key_temp0==0x0e) {
switch(key_temp1)
{ case 0xe0: key_num=4;break; case 0xd0: key_num=3;break; case 0xb0: key_num=2;break; case 0x70: key_num=1;break; default: key_num=0;break; }
}
else if(key_temp0==0x0d) {
switch(key_temp1)
{ case 0xe0: key_num=8;break; case 0xd0: key_num=7;break; case 0xb0: key_num=6;break; case 0x70: key_num=5;break; default: key_num=0;break;
} }
7.质疑、建议、问题讨论
引脚联系过于复杂,建议使用二合一数码管。