单片机实验指导书专科黄大君.docx

上传人:b****3 文档编号:5493255 上传时间:2022-12-17 格式:DOCX 页数:31 大小:460.59KB
下载 相关 举报
单片机实验指导书专科黄大君.docx_第1页
第1页 / 共31页
单片机实验指导书专科黄大君.docx_第2页
第2页 / 共31页
单片机实验指导书专科黄大君.docx_第3页
第3页 / 共31页
单片机实验指导书专科黄大君.docx_第4页
第4页 / 共31页
单片机实验指导书专科黄大君.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

单片机实验指导书专科黄大君.docx

《单片机实验指导书专科黄大君.docx》由会员分享,可在线阅读,更多相关《单片机实验指导书专科黄大君.docx(31页珍藏版)》请在冰豆网上搜索。

单片机实验指导书专科黄大君.docx

单片机实验指导书专科黄大君

《单片机原理(专科)》

实验指导书

 

系别

班级

姓名

学号

 

计算机科学与技术系

2012年8月

 

实验一:

流水灯实验

一、实验目的:

通过对P3口地址的操作控制8位LED流水点亮,从而认识单片机的存储器。

实验原理图

实验参考电路图如下:

二、参考实验程序

//流水灯实验

#include//包含单片机寄存器的头文件

sfrx=0xb0;//P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机

//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作

/****************************************

函数功能:

延时一段时间

*****************************************/

voiddelay(void)

{

unsignedchari,j;

for(i=0;i<250;i++)

for(j=0;j<250;j++)

;//利用循环等待若干机器周期,从而延时一段时间

}

/*****************************************

函数功能:

主函数

******************************************/

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();//调用延时函数

}

}

三、实验思考题:

修改程序使LED灯为18灯亮——27灯亮——36灯亮——45灯亮,再将LED灯亮的顺序倒过来既:

45灯亮——36灯亮——27灯亮——18灯亮,连续运行。

 

实验二:

数码显示实验(LED)

 

一、实验目的:

掌握共阳极、共阴极7段LED数码管的显示方法。

二、实验原理图

实验参考电路图如下:

步骤

三、参考实验程序

//数码秒表设计

#include

unsignedcharcodetab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

voiddelay(void)

{

unsignedchari,j;

for(i=0;i<250;i++)

for(j=0;j<250;j++)

;

}

voidmain(void)

{

unsignedchari=0;

P2=0x00;

while

(1)

{

P2=tab[i];

i=(i+1)%10;

delay();

}

}

 

实验三:

播放声音实验

 

一、实验目的:

学习如何让单片机播放简单的音乐。

二、实验原理图

实验参考电路图如下:

三、参考实验程序

/*****************************************/

/*我这有一个程序,你参考一下*/

/*function:

唱生日快乐*/

/*/

/*****************************************/

#include

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

#defineledRD

#definekey_recT1

sbitBUZZER=P3^7;//发声音口

ucharcodeT0_H[16]={0xFF,0xFB,0xFB,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE};

ucharcodeT0_L[16]={0xF1,0x4,0x90,0xC,0x44,0xAC,0x9,0x34,0x82,0xC8,0x06,0x22,0x56,0x85,0x9A,0xC1};

ucharcodemusic[32]={8,0,8,9,8,0xB,0xA,0,8,0,8,9,8,0xC,0xB,0,8,0,8,0xF,0xD,0xB,0xA,9,0xE,0,0xE,0xD,0xB,0xC,0xB,0x0};

ucharcodemusic_L[32]={2,1,1,4,4,4,4,4,2,1,1,4,4,4,4,4,2,1,1,4,4,4,4,4,2,1,1,4,4,4,4,4};

uchara,b;

uintsecond,minute;

longt0count;

voiddelay_music(uintv)

{

while(v!

=0)v--;

}

voiddelay_music1(uintj)

{

while(j!

=0){j--;delay_music(200);}

}

voiddelay_music2(uintj)

{

while(j!

=0){j--;delay_music1(80);}

}

main()

{

//uinti;

uchark,n,m;

delay_music(100);

TMOD=0x11;

TH0=0xfc;

TL0=0x66;

t0count=0;

EA=1;

ET0=0;

TR0=0;

ET1=0;

TR1=0;

while

(1)

{

ET1=1;

TR1=1;

for(k=0;k<32;k++)

{

n=music[k];

m=music_L[k];

a=T0_H[n];

b=T0_L[n];

delay_music2(m);

}

}

}

time0()interrupt1using1

{

TH0=0xFC;

TL0=0x66;

t0count=t0count+1;

if(t0count==1000)

{

second++;

if(second==60)

{

minute++;

if(minute==60)minute=0;

second=0;}

t0count=0;

}

}

time1()interrupt3using3

{

TH1=a;

TL1=b;

BUZZER=!

BUZZER;

}

 

实验四:

键盘扫描

 

一、实验目的、要求

设计一个4X4的矩阵键盘,键盘的号码0~15,要求编写出一个键盘输入扫描程序,要求单片机能根据键盘排列顺序,能将按下去键盘号正确识别出来,并采用两个数码管分别键盘号码的个位和十位。

二、实验原理

三、源程序清单或实验步骤

1.设计电路,并按照电路接线

2.编写调试程序:

#include//包含51单片机寄存器定义的头文件

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;

}

四、实验结果

经过调试:

矩阵键盘上的输入按键的键号能够正常显示在LED数码管上。

 

实验五:

定时器中断实验

一、实验目的、要求

目的:

通过对P3.2、P3.3引脚的电平控制,实现外部中断处理,从而控制输出口P1的输出效果变化。

要求:

自行设计一个外部中断实验,要求:

两个外部中断全部用上;实验能体现不同中断优先级的中断源的相应情况;不同中断处理程序能输出不同的响应效果

二、实验原理

 

三、源程序清单或实验步骤

1.设计电路,并按照电路接线

2.编写调试程序:

#include//包含51单片机寄存器定义的头文件

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取反一次。

}

/****************************************

函数功能:

延时一段时间

*****************************************/

voiddelay(void)

{

unsignedchari,j;

for(i=0;i<250;i++)

for(j=0;j<250;j++)

;//利用循环等待若干机器周期,从而延时一段时间

}

四、实验结果、实验过程原始记录(数据、图表、计算等)

经过调试:

在外部中断输入信号的控制下,P1口的灯能够按照要求闪烁

修改程序和电路后,能够反映出两个外部中断之间的优先级和中断屏蔽等功能,并能按照中断处理程序的要求完成显示。

1.通过改变外部中断源输入信号能够控制P0~P3口。

2.89C51的两个外部中断源能够按照控制字的要求实现屏蔽和优先级显示。

 

实验六:

串行口实验

一、实验目的、要求

通过实验掌握89C51的工作原理,学会串行通信程序的编写

要求:

完成单片机U1通过其串行口TXD向计算机发送一个字节数据“,将单片机的输出信号转化成计算机能够识别的信号。

二、实验原理

(1)单片机发送和接受数据实验参考电路图

三、源程序清单或实验步骤

1.设计电路,并按照电路接线

2.编写调试程序:

数据发送程序:

#include//包含单片机寄存器的头文件

unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

//流水灯控制码,该数组被定义为全局变量

/*****************************************************

函数功能:

向PC发送一个字节数据

***************************************************/

voidSend(unsignedchardat)

{

SBUF=dat;

while(TI==0);

TI=0;

}

voidinit()

{TMOD=0x20;//TMOD=00100000B,定时器T1工作于方式2

SCON=0x40;//SCON=01000000B,串口工作方式1

PCON=0x00;//PCON=00000000B,波特率9600

TH1=0xfd;//根据规定给定时器T1赋初值

TL1=0xfd;//根据规定给定时器T1赋初值

TR1=1;

}

/**************************************************************

函数功能:

延时约150ms

**************************************************************/

voiddelay(unsignedcharz)

{

unsignedcharm,n;

for(m=0;m

for(n=0;n<250;n++)

;

}

/*****************************************************

函数功能:

主函数

***************************************************/

voidmain(void)

{

unsignedchari;

init();

while

(1)

{

for(i=0;i<8;i++)//模拟检测数据

{

Send(Tab[i]);//发送数据i

delay(200);//50ms发送一次检测数据

}

}

}

数据接收程序:

#include//包含单片机寄存器的头文件

/*****************************************************

函数功能:

接收一个字节数据

***************************************************/

unsignedcharReceive(void)

{

unsignedchardat;

while(RI==0)//只要接收中断标志位RI没有被置“1”

;//等待,直至接收完毕(RI=1)

RI=0;//为了接收下一帧数据,需将RI清0

dat=SBUF;//将接收缓冲器中的数据存于dat

returndat;

}

/*****************************************************

函数功能:

主函数

***************************************************/

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口显示

}

}

四、实验结果、实验过程原始记录(数据、图表、计算等)

经过调试:

通过发送的单片机送出的字符能按要求正常在接收的机器上显示。

 

实验七:

数码秒表实验

一、实验目的、要求

通过实验掌握89C51的工作原理,学会LED动态扫描程序的编写

要求:

用单片机控制一个秒表的显示

二、实验原理

三、源程序清单或实验步骤

1.设计电路,并按照电路接线

2.编写调试程序:

#include//包含51单片机寄存器定义的头文件

//将D1位定义为P2.0引脚

unsignedcharsecond,Countor;

sbitgewei=P2^0;

sbitshiwei=P2^1;//设置全局变量,储存定时器T0中断次数

/**************************************************************

函数功能:

主函数

**************************************************************/

unsignedcharTab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴极段码

voiddelay(void)

{

unsignedchari;

for(i=0;i<200;i++)

;

}

voidmain(void)

{

second=0;

EA=1;//开总中断

ET0=1;//定时器T0中断允许

TMOD=0x01;//使用定时器T0的模式1

TH0=(65536-46083)/256;//定时器T0的高8位赋初值

TL0=(65536-46083)%256;//定时器T0的高8位赋初值

TR0=1;//启动定时器T0

Countor=0;//从0开始累计中断次数

while

(1)//无限循环等待中断

{shiwei=1;

gewei=0;

P0=Tab[second/10];

delay();

gewei=1;

shiwei=0;

P0=Tab[second%10];

delay();

}

}

/**************************************************************

函数功能:

定时器T0的中断服务程序

**************************************************************/

voidTime0(void)interrupt1using0//"interrupt"声明函数为中断服务函数

//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 企业管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1