单片机实验指导书专科黄大君.docx
《单片机实验指导书专科黄大君.docx》由会员分享,可在线阅读,更多相关《单片机实验指导书专科黄大君.docx(31页珍藏版)》请在冰豆网上搜索。
![单片机实验指导书专科黄大君.docx](https://file1.bdocx.com/fileroot1/2022-12/17/e82e8f59-9f3f-42f9-a56a-809250c61f81/e82e8f59-9f3f-42f9-a56a-809250c61f811.gif)
单片机实验指导书专科黄大君
《单片机原理(专科)》
实验指导书
系别
班级
姓名
学号
计算机科学与技术系
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;mfor(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组工作寄存器
{