《单片机原理及应用》实验报告.docx
- 文档编号:11320688
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:53
- 大小:621.39KB
《单片机原理及应用》实验报告.docx
《《单片机原理及应用》实验报告.docx》由会员分享,可在线阅读,更多相关《《单片机原理及应用》实验报告.docx(53页珍藏版)》请在冰豆网上搜索。
《单片机原理及应用》实验报告
《单片机原理及应用》实验报告
2017/2018学年第1学期
系别计算机学院
专业软件工程
班级17软件工程班
姓名XXXXXX
学号**********
授课老师******
实验一:
流水灯实验
1.实验目的
(1)学习编译和仿真环境使用
(2)学习P3口的使用方法
(3)学习延时子程序的编写
2实验容
(1)通过对P3口地址的操作控制8位LED流水点亮,从而认识单片机的接口;
(2)通过改变并行口输出电平控制LED灯的点亮与否,通过延时程序控制亮灯时间。
3.实验运行结果图
4.源代码
//流水灯实验
#include
sfrx=0xb0;//P3口在存储器中的地址是b0H,通过sfr可定义8051核单片机
//的所有部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作
/****************************************
函数功能:
延时一段时间
*****************************************/
voiddelay(void)
{
unsignedchari,j;
for(i=0;i<255i++)
for(j=0;j<255j++)
;//利用循环等待若干机器周期,从而延时一段时间
}
/*****************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
while
(1)
{
x=0xfe;//第一个灯亮
delay();//调用延时函数
x=0xfd;//第二个灯亮
delay();//调用延时函数
x=0xfb;//第三个灯亮
delay();//调用延时函数
x=0xf7;//第四个灯亮
delay();//调用延时函数
x=0xef;//第五个灯亮
delay();//调用延时函数
x=0xdf;//第六个灯亮
delay();//调用延时函数
x=0xbf;//第七个灯亮
delay();//调用延时函数
x=0x7f;//第八个灯亮
delay();//调用延时函数
}
}
实验二:
中断实验
1.实验目的
(1)熟悉51单片机中断初始化编程方法。
(2)掌握51单片机外部中断源的设计使用。
(3)中断处理应用程序的设计与调试技巧。
2.实验容
通过对P3.2、P3.3引脚的电平控制,实现外部中断处理,从而控制输出口P1的输出效果变化。
3.实验运行结果图
4.源代码
/用外中断0的中断方式进行数据采集和处理
#include
sbitS=P3^2;//将S位定义为P3.2,
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
EA=1;//开放总中断
EX0=1;//允许使用外中断
IT0=1;//选择负跳变来触发外中断
P1=0xff;
while
(1)
;//无限循环,防止程序跑飞
}
/**************************************************************
函数功能:
外中断T0的中断服务程序
**************************************************************/
voidint0(void)interrupt0using0//外中断0的中断编号为0
{
P1=~P1;//每产生一次中断请求,P1取反一次。
}
//用外中断0的中断方式进行数据采集和处理
#include
#defineucharunsignedchar
voidDelay(unsignedinti)
{
ucharj;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}
//sbitS=P3^2;//将S位定义为P3.2,
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
uchardisplay[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedinta;
while
(1){
EA=1;//开放总中断
EX0=1;//允许使用外中断
EX1=1;
IT0=1;//选择负跳变来触发外中断
IT1=1;
IP=0;
for(a=0;a<9;a++){
Delay(500);
P1=display[a];
}
}
}
/**************************************************************
函数功能:
外中断T0的中断服务程序
**************************************************************/
voidint0_isr(void)interrupt0using1//外中断0的中断编号为1
{
ucharn;
for(n=0;n<10;n++){
p1=0x0f;
Delay(500);
P1=0xf0;
Delay(500);
}
}
voidint1_isr(void)interrupt2using2{
ucharn;
for(n=0;n<10;n++){
p1=0xff;
Delay(500);
P1=0;
Delay(500);
}
}
实验三:
定时器/计数器实验
1.实验目的
(1)熟悉51单片机中断初始化编程方法
(2)熟悉51单片机定时计数器的初始化编程方法
(3)掌握定时计数器的应用
2.实验容
通过使用定时器T0的中断来控制P2.0引脚的的LED的灯闪烁,要求闪烁时间2S,既亮1S,灭1S。
3.实验运行结果图
4.源代码
#include
sbitD1=P1^4;//将D1位定义为P1.4引脚
unsignedcharCountor;//设置全局变量,储存定时器T0中断次数
/**************************************************************
函数功能:
主函数
**************************************************************/
voidmain(void)
{
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TMOD=0x01;//使用定时器T0的模式2
TH0=(65536-15536)/256;//定时器T0的高8位赋初值
TL0=(65536-15536)%256;//定时器T0的高8位赋初值
TR0=1;//启动定时器T0
Countor=0;//从0开始累计中断次数
while
(1)//无限循环等待中断
;
}
/**************************************************************
函数功能:
定时器T0的中断服务程序
**************************************************************/
voidTime0(void)interrupt1using0//"interrupt"声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
Countor++;//中断次数自加1
if(Countor==20)//若累计满20次,即计时满1s
{
D1=~D1;//按位取反操作,将P2.0引脚输出电平取反
Countor=0;//将Countor清0,重新从0开始计数
}
TH0=(65536-15536)/256;//定时器T0的高8位重新赋初值
TL0=(65536-15536)%256;//定时器T0的高8位重新赋初值
}
实验四:
串行口实验
1.实验目的
(1)掌握单片机的串行口的工作原理
(2)掌握单片机串行口收发数据的方法
2.实验容
本实验要求单片机U1通过其串行口TXD向单片机U2发送数据。
单片机U1的P1口接8个开关,U2的P1口接8个发光二极管。
U1设置为只能发送不能接收,U1读入P1口的8个开关状态后,通过串行口发送到U2,U2将接收到的数据送入P1口,由P1口上连接的8个发光二极管显示8个开关的状态。
3.实验运行结果图
4.源代码
/*********发送单片机的发送程序***********/
#include
/*********向PC发送一个字节数据**************/
voidSend(unsignedchardate)
{
SBUF=date;
while(TI==0);
TI=0;
}
/*********延时约150ms*********/
voiddelay(void)
{
unsignedcharm,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++)
;
}
/*******函数功能:
主函数*********/
voidmain(void)
{
unsignedchartemp;
TMOD=0x20;//定时器T1工作于方式2
SCON=0x40;//串口工作方式1
PCON=0x00;//波特率9600
TH1=0xfd;//根据规定给定时器T1赋初值
TL1=0xfd;//根据规定给定时器T1赋初值
TR1=1;//启动定时器T1
P1=0xff;//读取P1端口数据
while
(1)
{
temp=P1;
Send(temp);//发送数据i
delay();//50ms发送一次检测数据
}
}
/**********接收单片机的接收程序***********/
#include
/**接收一个字节数据******/
unsignedcharReceive(void)
{
unsignedchardate;
while(RI==0);//只要接收中断标志位RI没有被置“1”
//等待,直至接收完毕(RI=1)
RI=0;//为了接收下一帧数据,需将RI清0
date=SBUF;//将接收缓冲器中的数据存于dat
returndate;
}
/*****主函数*******/
voidmain(void)
{
TMOD=0x20;//定时器T1工作于方式2
SCON=0x50;//SCON=01010000B,串口工作方式1,REN=1
PCON=0x00;//PCON=00000000B,波特率9600
TH1=0xfd;//根据规定给定时器T1赋初值
TL1=0xfd;//根据规定给定时器T1赋初值
TR1=1;//启动定时器T1
REN=1;//允许接收
while
(1)
{
P1=Receive();//将接收到的数据送P1口显示
}
}
实验五:
输入接口实验
1.实验目的
(1)掌握共阴极、共阳极LED的使用方法
(2)掌握矩阵键盘输入扫描和识别程序编写
2.实验容
设计一个4X4的矩阵键盘,键盘的0~15,要求编写出一个键盘输入扫描程序,要求单片机能根据键盘排列顺序,能将按下去键盘号正确识别出来,并采用两个数码管分别键盘的个位和十位。
3.实验运行结果图
4.源代码
#include
sbitP14=P1^4;
sbitP15=P1^5;
sbitP16=P1^6;
sbitP17=P1^7;
unsignedcharcodeTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数字0~9的段码
unsignedcharkeyval;
/**************************************************************
函数功能:
数码管动态扫描延时
**************************************************************/
voidled_delay(void)
{
unsignedcharj;
for(j=0;j<200;j++)
;
}
/**************************************************************
函数功能:
按键值的数码管显示子程序
**************************************************************/
voiddisplay(unsignedchark)
{
P2=0xbf;
P0=Tab[k/10];
led_delay();
P2=0x7f;
P0=Tab[k%10];
led_delay();
}
/**************************************************************
函数功能:
软件延时子程序
**************************************************************/
voiddelay20ms(void)
{
unsignedchari,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
/**************************************************************
函数功能:
主函数
**************************************************************/
voidmain(void)
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
keyval=0x00;
while
(1)
{
display(keyval);
}
}
/**************************************************************
函数功能:
定时器0的中断服务子程序,进行键盘扫描,判断键位
**************************************************************/
voidtime0_interserve(void)interrupt1using1
{
TR0=0;
P1=0xf0;
if((P1&0xf0)!
=0xf0)
delay20ms();
if((P1&0xf0)!
=0xf0)
{
P1=0xfe;
if(P14==0)
keyval=1;
if(P15==0)
keyval=2;
if(P16==0)
keyval=3;
if(P17==0)
keyval=4;
P1=0xfd;
if(P14==0)
keyval=5;
if(P15==0)
keyval=6;
if(P16==0)
keyval=7;
if(P17==0)
keyval=8;
P1=0xfb;
if(P14==0)
keyval=9;
if(P15==0)
keyval=10;
if(P16==0)
keyval=11;
if(P17==0)
keyval=12;
P1=0xf7;
if(P14==0)
keyval=13;
if(P15==0)
keyval=14;
if(P16==0)
keyval=15;
if(P17==0)
keyval=16;
}
TR0=1;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
}
实验六:
LCD循环显示实验
1.实验目的
(1)掌握单片机驱动显示屏的方法
(2)掌握LCD1602的使用方法
2.实验容
采用1602型LCD循环显示字符串“WelcometoHeifeiNormalUniversity”。
其中LCD显示模式为:
16*2显示、5*7点阵、8位数据口;显示开、有光标开且光标闪烁;光标右移,字符不移。
3.实验运行结果图
4.源代码
#include
#include
sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚
unsignedcharcodestring[]={"WelcometoChina"};
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelay(unsignedcharn)
{
unsignedchari;
for(i=0;i delay1ms(); } /***************************************************** 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙 ***************************************************/ unsignedcharBusyTest(void) { bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0; returnresult; } /***************************************************** 函数功能: 将模式设置指令或显示地址写入液晶模块 入口参数: dictate ***************************************************/ voidWriteInstruction(unsignedchardictate) { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 指定字符显示的实际地址 入口参数: x ***************************************************/ voidWriteAddress(unsignedcharx) { WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机原理及应用 单片机 原理 应用 实验 报告