51单片机硬件实验.docx
《51单片机硬件实验.docx》由会员分享,可在线阅读,更多相关《51单片机硬件实验.docx(16页珍藏版)》请在冰豆网上搜索。
51单片机硬件实验
第一个:
串行口实验
1.实验目的
了解串口的工作原理和编程方式。
2,实验内容
串行口的自发自收。
3.,实验器材:
计算机一台
4,实验步骤:
程序如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
voidmain()
{
uchari=0x55;
uintj=0;
TMOD=0x20;
TL1=TH1=0xF4;
PCON=0X00;
SCON=0X50;
TR1=1;
while
(1)
{
SBUF=i;
Do{}
while(!
RI)
RI=0;
TI=0;
i=SBUF;
P1=i;
i=~i;
for(j=0;j<12500;j++);
}
}
第二个:
二极管的闪烁延时
1.实验目的:
熟练掌握软件和硬件的延时操作。
2.实验要求:
利用实验仪提供的显示电路,动态显示一行数据.
3.实验器材:
(1)超想-3000TB综合实验仪1台
(2)超想3000仿真器1台
(3)计算机1台
4.实验说明:
(1)本实验仪提供了8段码LED显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,用动态方式显示
74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。
写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位置到74LS164中,并且实现移位。
向显示位选通地址输出高电平就可以点亮相应的显示位。
本实验仪中数据位输出地址为0e102H,时钟位输出地址为0e102H,位选通输出地址为0e101H。
本实验涉及到了8155I0/RAM扩展芯片的工作原理以及74LS164器件的工作原理。
软件延时程序:
#include
#include
voiddelay(unsignedintd){
while(--d>0);
}
main()
{
unsignedi,sel;
{
sel=0xfe;
for(i=0;i<8;i++)
{
P1=sel;
delay(500);
P1=0xfd;
}
}
}
硬件延时:
#include
sbitP1_1=P1^1;
unsignedchari;
voidmain()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while
(1);
}
voidtime0_int(void)interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
P1_1=!
P1_1;
}
第三个:
八段数码管显示
1.实验目的:
(1)了解数码管动态显示的原理。
(2)了解74LS164扩展端口的方法。
2.实验要求:
利用实验仪提供的显示电路,动态显示一行数据.
3.实验器材:
(1)超想-3000TB综合实验仪1台
(2)超想3000仿真器1台
(3)计算机1台
4.实验说明:
(1)本实验仪提供了8段码LED显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。
显
示共有6位,用动态方式显示
74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控
制输出。
写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据
位置到74LS164中,并且实现移位。
向显示位选通地址输出高电平就可以点亮相应的显示位。
本实验仪中数据位输出地址为0e102H,时钟位输出地址为0e102H,位选通输出地址为0e101H。
本实验涉及到了8155I0/RAM扩展芯片的工作原理以及74LS164器件的工作原理。
2)七段数码管的字型代码表如下表:
显示字形 g f e d c b a 段码
0 0 1 1 1 1 1 1 3fh
1 0 0 0 0 1 1 0 06h
2 1 0 1 1 0 1 1 5bh
3 1 0 0 1 1 1 1 4fh
4 1 1 0 0 1 1 0 66h
5 1 1 0 1 1 0 1 6dh
6 1 1 1 1 1 0 1 7dh
7 0 0 0 0 1 1 1 07h
8 1 1 1 1 1 1 1 7fh
9 1 1 0 1 1 1 1 6fh
A 1 1 1 0 1 1 1 77h
b 1 1 1 1 1 0 0 7ch
C 0 1 1 1 0 0 1 39h
d 1 0 1 1 1 1 0 5eh
E 1 1 1 1 0 0 1 79h
F 1 1 1 0 0 0 1 71h
#include
#defineLEDLen6
#definemode0x03;
#defineCAddrXBYTE[0xe100]/*控制字地址*/
#defineOUTBITXBYTE[0xe101]/*位控制口*/
#defineCLK164XBYTE[0xe102]/*段控制口(接164时钟位)*/
#defineDAT164XBYTE[0xe102]/*段控制口(接164数据位)*/
#defineINXBYTE[0xe103]/*键盘读入口*/
unsignedcharLEDBuf[LEDLen];/*显示缓冲*/
codeunsignedcharLEDMAP[]={/*八段管显示码*/
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
}
voidDisplayLED()
{
unsignedchari,j;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;/*从左边开始显示*/
for(i=0;iOUTBIT=0;/*关所有八段管*/
LED=LEDBuf[i];
for(j=0;j<8;j++){/*送164*/
if(LED&0x80)DAT164=1;elseDAT164=0;
CLK164=CLK164|0x02;
CLK164=CLK164&0xfd;
LED<<=1;
}
OUTBIT=Pos;/*显示一位八段管*/
Delay
(1);
Pos>>=1;/*显示下一位*/
}
OUTBIT=0;/*关所有八段管*/
}
voidmain()
{
unsignedchari=0;
unsignedcharj;
CAddr=mode;
while
(1){
LEDBuf[0]=LEDMAP[(i+2)&0x0f];
LEDBuf[1]=LEDMAP[i&0x0f];
LEDBuf[2]=LEDMAP[(i+2)&0x0f];
LEDBuf[3]=LEDMAP[(i+1)&0x0f];
LEDBuf[4]=LEDMAP[(i+2)&0x0f];
LEDBuf[5]=LEDMAP[(i+8)&0x0f];
for(j=0;j<30;j++)
DisplayLED();/*延时*/
}
}
第四个键盘扫描显示实验
1.实验目的:
(1)掌握键盘和显示器的接口方法和编程方法。
(2)掌握键盘扫描和LED八段码显示器的工作原理。
2.实验内容:
在上一个实验的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。
3.实验器材:
(1)超想-3000TB综合实验仪1台
(2)超想3000仿真器1台
(3)计算机1台
4.实验说明:
本实验仪提供了一个6×4的小键盘,向列扫描码地址(0e101H)逐列输出低电平,然后从行码地址
(0e103H)读回.如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高.这样就可以通过输出的列码和读取的行码来判断按下的是什么键.在判断有键按下后,要有一定的延时,防止键盘抖动.
列扫描码还可以分时用作LED的位选通信号.
#include
#defineLEDLen6
#definemode0x03;
#defineCAddrXBYTE[0xe100]/*控制字地址*/
#defineOUTBITXBYTE[0xe101]/*位控制口*/
#defineCLK164XBYTE[0xe102]/*段控制口(接164时钟位)*/
#defineDAT164XBYTE[0xe102]/*段控制口(接164数据位)*/
#defineINXBYTE[0xe103]/*键盘读入口*/
unsignedcharLEDBuf[LEDLen];/*显示缓冲*/
codeunsignedcharLEDMAP[]={/*八段管显示码*/
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
}
voidDisplayLED()
{
unsignedchari,j;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;/*从左边开始显示*/
for(i=0;iOUTBIT=0;/*关所有八段管*/
LED=LEDBuf[i];
for(j=0;j<8;j++){/*送164*/
if(LED&0x80)DAT164=1;elseDAT164=0;
CLK164=CLK164|0x02;
CLK164=CLK164&0xfd;
LED<<=1;
}
OUTBIT=Pos;/*显示一位八段管*/
Delay
(1);
Pos>>=1;/*显示下一位*/
}
}
codeunsignedcharKeyTable[]={/*键码定义*/
0x00,0x01,0x04,0x07,
0x0f,0x02,0x05,0x08,
0x0e,0x03,0x06,0x09,
0x0d,0x0c,0x0b,0x0a,
0x10,0x11,0x12,0x13,0x14,
0x15,0x16,
};
unsignedcharTestKey()
{
OUTBIT=0;/*输出线置为0*/
return(~IN&0x0f);/*读入键状态(高四位不用)*/
}
unsignedcharGetKey()
{
unsignedcharPos;
unsignedchari;
unsignedchark;
i=6;
Pos=0x20;/*找出键所在列*/
do{
OUTBIT=~Pos;
Pos>>=1;
k=~IN&0x0f;
}while((--i!
=0)&&(k==0));
/*键值=列X4+行*/
if(k!
=0){
i*=4;
if(k&2)
i+=1;
elseif(k&4)
i+=2;
elseif(k&8)
i+=3;
OUTBIT=0;
doDelay(10);while(TestKey());/*等键释放*/
return(KeyTable[i]);/*取出键码*/
}elsereturn(0xff);
}
voidmain()
{
CAddr=mode;
LEDBuf[0]=0xff;
LEDBuf[1]=0xff;
LEDBuf[2]=0xff;
LEDBuf[3]=0xff;
LEDBuf[4]=0x00;
LEDBuf[5]=0x00;
while
(1){
DisplayLED();
if(TestKey())LEDBuf[5]=LEDMAP[GetKey()&0x0f];
}
第五个:
A/D转换实验
1.实验目的
掌握A/D转换与单片机接口的方法;了解A/D芯片0809转换性能及编程方法;
2.实验内容:
利用综合实验仪上的0809做A/D转换器,综合实验仪上的电位器提供模拟量输入,编制程序,将模拟量转换成数字量,通过8155键显区数码管显示出来。
3.实验器材:
(1)超想-3000TB综合实验仪1台
(2)超想3000仿真器1台
(3)连线若干根
(4)计算机1台
4.实验原理:
A/D转换器的功能主要是将输入的模拟信号转换成数字信号,如电压、电流、温度测量等都属于这种转换。
本实验中采用的转换器为ADC0809,它是一个8位逐次逼近型A/D转换器,可以对8个模拟量进行转换,转换时间为100μS。
其工作过程如下:
首先由地址锁存信号ALE的上升沿将引脚ADDA、ADDB和ADDC上的信号锁存到地址寄存器内,用以选择模拟量输入通道;START信号的下降沿启动A/D转换器开始工作;当转换结束时,AD0809使EOC引脚由低电平变成高电平,程序可以通过查询的方式读取转换结果,也可以通过中断方式读取结果。
CLOCK为转换时钟输入端,频率为100KHz-1.2MHz,推荐值为640KHz。
5.实验步骤:
(1)设定仿真模式为程序空间在仿真器上,数据空间在用户板上
(2)硬件诊断:
调整综合实验仪上模拟信号发生器的电位器,使输入到此AD0809的IN0上电压为一定值。
(3)编写程序,并编译通过。
本程序使用查询的方式读取转换结果。
在读取转换结果的指令后设置断点,运行程序,在断点处检查并读出A/D转换结果,数据是否与Vin0相对应。
修改程序中错误,使显示值随Vin0变化而变化。
6.实验思考:
1)试编写循环采集8路模拟量输入A/D转换程序;
(2)以十进制方式显示。
#include
#include
#defineLEDLen6
#defineMODE0x03
#defineCS0809XBYTE[0xa000]
#defineCAddrXBYTE[0xe100]/*控制字地址*/
#defineOUTBITXBYTE[0xe101]/*位控制口*/
#defineCLK164XBYTE[0xe102]/*段控制口(接164时钟位)*/
#defineDAT164XBYTE[0xe102]/*段控制口(接164数据位)*/
#defineINXBYTE[0xe103]/*键盘读入口*/
unsignedcharLEDBuf[LEDLen];/*显示缓冲*/
codeunsignedcharLEDMAP[]={/*八段管显示码*/
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
}
voidDisplayLED()
{
unsignedchari,j;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;/*从左边开始显示*/
for(i=0;iOUTBIT=0;/*关所有八段管*/
LED=LEDBuf[i];
for(j=0;j<8;j++){/*送164*/
if(LED&0x80)DAT164=1;elseDAT164=0;
CLK164=CLK164|0X02;
CLK164=CLK164&0Xfd;
LED<<=1;
}
OUTBIT=Pos;/*显示一位八段管*/
Delay
(1);
Pos>>=1;/*显示下一位*/
}
OUTBIT=0;/*关所有八段管*/
}
unsignedcharRead0809()
{
unsignedchari;
CS0809=0;/*起动A/D*/
for(i=0;i<0x20;i++);/*延时>100us*/
return(CS0809);/*读入结果*/
}
voidmain()
{
unsignedcharj;
unsignedcharb;
CAddr=MODE;
while
(1){
LEDBuf[0]=0X3F;
LEDBuf[1]=0X7F;
LEDBuf[2]=0X3F;
LEDBuf[3]=0X6F;
LEDBuf[4]=0X00;
LEDBuf[5]=0X00;
//b=Read0809();
LEDBuf[5]=LEDMAP[Read0809()&0x0f];
LEDBuf[4]=LEDMAP[Read0809()>>4&0x0f];
for(j=0;j<5;j++)
DisplayLED();/*延时*/
}
}
第六个:
D/A0832转换实验
1.实验目的:
了解D/A转换与单片机的接口方法;了解D/A转换芯片DA0832的性能及编程方法。
2.实验内容:
利用0832输出一个从0V开始逐渐升至5V再降至0V的三角波电压,数码管显示数字量值。
3.实验器材:
(1)超想-3000TB综合实验仪1台
(2)超想3000仿真器1台
(3)连线若干根
(4)计算机1台
4.实验原理:
D/A转换器的功能主要是将输入的数字量转换成模拟量输出,在语音合成等方面得到了广泛的应用。
本实验中采用的转换器为DAC0832,该芯片为电流输出型8位D/A转换器,输入设有两级缓冲锁存器,因此可同时输出多路模拟量。
本实验中采用单级缓冲连接方式,用0832来产生三角波,具体线路如上图所示。
Vref引脚的电压极性和大小决定了输出电压的极性与幅度,超想-3000TB综合实验仪上的DA0832的第8引脚(Vref)的电压已接为-5V,所以输出电压值的幅度为0-5V。
5.实验步骤:
(1)设定仿真模式为程序空间在仿真器上,数据空间在用户板上
(2)硬件诊断:
(3)编写程序、编译程序,用单步、断点、连续方式调试程序,排除软件错误。
6.实验思考:
修改程序,使能产生锯齿波。
#include
#defineLEDLen6
#defineMODE0x03
#defineCS0832XBYTE[0xa000]
#defineCAddrXBYTE[0xe100]/*控制字地址*/
#defineOUTBITXBYTE[0xe101]/*位控制口*/
#defineCLK164XBYTE[0xe102]/*段控制口(接164时钟位)*/
#defineDAT164XBYTE[0xe102]/*段控制口(接164数据位)*/
#defineINXBYTE[0xe103]/*键盘读入口*/
unsignedcharLEDBuf[LEDLen];/*显示缓冲*/
codeunsignedcharLEDMAP[]={/*八段管显示码*/
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
}
voidDisplayLED()
{
unsignedchari,j;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;/*从左边开始显示*/
for(i=0;iOUTBIT=0;