单片机实验2.docx
《单片机实验2.docx》由会员分享,可在线阅读,更多相关《单片机实验2.docx(27页珍藏版)》请在冰豆网上搜索。
单片机实验2
《微机原理与应用》实验报告
姓名:
侯伟
学号:
2015012214
年级:
2015级
专业:
电气工程及其自动化
2017年秋季学期
实验一LCM控制实验
1、功能要求
1、掌握利用单片机控制字符型LCM1602的方法;
2、完成与LCM1602的接口,并尝试各种显示功能。
2、硬件原理
3、软件程序流程
4、程序清单
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
uintq;
ucharstr1[]="wulixueyuan";
ucharstr2[]="houwei2015012214";
sbitE=P2^2;
sbitRW=P2^1;
sbitRS=P2^0;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
voidwrite_com(ucharcom)
{
RS=0;
RW=1;
H1:
P0=0xff;
E=1;
q=P0;
E=0;
if(q&0x80)
gotoH1;
RS=0;
RW=0;
P0=com;
E=1;
delay(5);
E=0;
}
voidwrite_data(ucharDATE)
{
RS=0;
RW=1;
H2:
P0=0xff;
E=1;
q=P0;
E=0;
if(q&0x80)
gotoH2;
RS=1;
RW=0;
P0=DATE;
delay(5);
E=1;
delay(5);
E=0;
}
voidinit()
{
E=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
voidmain()
{
uchari;
init();
for(i=0;i<14;i++)
{
write_data(str1[i]);
delay(100);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_data(str2[i]);
delay(100);
}
while
(1)
{
delay(200);
write_com(0x0f);
write_com(0x1e);
}
}
5、实验心得及建议
C语言编写函数不同于汇编语言,函数嵌套使得程序变得精炼,此外一定要读懂每个器件的硬件设计,做到软硬件结合
实验二基于I2C总线的EEPROM读写实验
1、功能要求
1熟悉24C02的芯片功能。
2掌握采用单片机和I2C芯片的硬件接口技术。
3掌握24C02的读写程序的设计和调试方法。
4向芯片中写入10个字节,然后再读出显示。
2、硬件原理
3、软件程序流程
总流程:
写n个字节流程:
读n个字节流程:
4、程序清单
#include"reg52.h"
#defineWriteDeviceAddress0xa0
#defineReadDeviceAddress0xa1
sbitSCL=P1^0;
sbitSDA=P1^1;
voidDelay(unsignedintn)
{
while(n!
=0)
n--;
}
voidStart()
{
SDA=1;
Delay(10);
SCL=1;
Delay(10);
SDA=0;
Delay(10);
SCL=0;
Delay(10);
}
voidStop()
{
SDA=0;
Delay(10);
SCL=1;
Delay(10);
SDA=1;
Delay(10);
}
voidAck()
{
inti;
SCL=1;
Delay(10);
while(SDA==1&&i<100)
i++;
SCL=0;
Delay(10);
}
voidNoAck()
{
SDA=1;
Delay(10);
SCL=1;
Delay(10);
SCL=0;
Delay(10);
}
voidWrite8bit(unsignedcharinput)
{
unsignedchartemp;
for(temp=8;temp!
=0;temp--)
{
SDA=(bit)(input&0x80);
Delay(10);
SCL=1;
Delay(10);
SCL=0;
input=input<<1;
}
}
voidWriteI2C(unsignedcharWdata,unsignedcharRomAddress)
{
Start();
Write8bit(WriteDeviceAddress);
Ack();
Write8bit(RomAddress);
Ack();
Write8bit(Wdata);
Ack();
Stop();
}
intRead8bit()
{
unsignedchartemp,rbyte=0;
for(temp=8;temp!
=0;temp--)
{
SCL=1;
Delay(10);
rbyte=rbyte<<1;
Delay(10);
rbyte=rbyte|SDA;
SCL=0;
Delay(10);
}
return(rbyte);
}
intReadI2C(unsignedcharRomAddress)
{
intData;
Start();
Write8bit(WriteDeviceAddress);
Ack();
Write8bit(RomAddress);
Ack();
Start();
Write8bit(ReadDeviceAddress);
Ack();
Data=Read8bit();
NoAck();
Stop();
returnData;
}
voidmain()
{
int
writeByte[]={1,2,3,4,5,6,7,8,9,10};
intreadByte[10];
inti;
P2=0x00;
for(i=0;i<=9;i++)
{
WriteI2C(writeByte[i],0x00+i);
Delay(1000000);
}
i=0;
while
(1)
{
Delay(900000000);
readByte[i]=ReadI2C(i+0x00);
P2=readByte[i];
Delay(90000000);
i++;
if(i==10)
i=0;
}
}
5、实验心得及建议
I2C总线的协议比较多,程序编写起来比较困难,这要求我们对24C02芯片十分清楚,如果对它的协议不够清楚,读写函数很难实现
实验三A/D转换实验
1、功能要求
1掌握A/D转换芯片ADC0809转换性能及编程方法。
2掌握A/D转换芯片ADC0809与单片机的接口方法。
3通过实验了解单片机如何进行数据采集。
4.利用实验箱产生0-5V的模拟电压。
编写程序,采集该模拟电压并将转换的结果用发光二极管显示。
5.采集光敏电阻的亮度变化,设置门限值,实现超过门限值使蜂鸣器报警的功能。
2、硬件原理
3、软件程序流程
4、程序清单
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitADC_START=P2^0;
sbitADC_ALE=P2^1;
sbitADC_OE=P2^2;
sbitADC_EOC=P2^3;
sbitclk=P2^7;
sbitE=P2^6;
sbitR_W=P2^5;
sbitD_I=P2^4;
sbitD0=P0^0;
sbitD1=P0^1;
sbitD2=P0^2;
sbitD3=P0^3;
sbitD4=P0^4;
sbitD5=P0^5;
sbitD6=P0^6;
sbitD7=P0^7;
//unsigneddatai;
unsignedcharq;
voidWCOM(unsignedchard);
/*写指令函数*/
voidDat(unsignedchard);
/*写数据函数*/
voidImim();
/*初始化*/
voidClearcld();
/*清屏*/
voidDelay()
{
intd;
for(d=0;d<30000;d++)
{
_nop_();
}
}
voidTimer0Init()
{
TMOD|=0X01;
TH0=0XFC;
TL0=0XFF;
ET0=1;
EA=1;
TR0=1;
}
voidinit0809()
{
ADC_START=0;
ADC_OE=0;
ADC_ALE=0;
_nop_();
_nop_();
ADC_ALE=1;//ALE=1时地址进入锁存器
_nop_();
P3=0x07;
_nop_();
ADC_ALE=0;//ALE=0时地址被锁存住
}
voidADC_0809()
{
ADC_START=0;
_nop_();
_nop_();
_nop_();
ADC_START=1;//上升沿复位
_nop_();
_nop_();
_nop_();
ADC_START=0;//下降沿开始
_nop_();
_nop_();
_nop_();
while(!
ADC_EOC);//等待转换结束
ADC_OE=1;
_nop_();
_nop_();
_nop_();
Dat(0x30+(uchar)D0);
Dat(0x30+(uchar)D1);
Dat(0x30+(uchar)D2);
Dat(0x30+(uchar)D3);
Dat(0x30+(uchar)D4);
Dat(0x30+(uchar)D5);
Dat(0x30+(uchar)D6);
Dat(0x30+(uchar)D7);
Delay();
ADC_OE=0;
}
voidWCOM(unsignedchard)
{
R_W=1;
D_I=0;
LOOP:
P1=0xFF;
E=1;
q=P1;
E=0;
if(q&0x80)
{
gotoLOOP;
}
R_W=0;
D_I=0;
P1=d;
E=1;
E=0;
}
voidDat(unsignedchard)
{
R_W=1;
D_I=0;
LOOP:
P1=0xFF;
E=1;
q=P1;
E=0;
if(q&0x80)
{
gotoLOOP;
}
D_I=1;
R_W=0;
P1=d;
E=1;
E=0;
}
voidImim()
{
P1=0xFF;
E=0;
WCOM(0x38);
WCOM(0x08);
WCOM(0x06);
Clearcld();
WCOM(0x0c);
}
voidClearcld()
{
D_I=0;
R_W=0;
//P0=0x01;
WCOM(0x01);
}
voidmain()
{
inti;
init0809();
Imim();
Clearcld();
WCOM(0x02);
Timer0Init();
Delay();
while
(1)
{
WCOM(0x80);
ADC_0809();
WCOM(0X88);
for(i=0;i<8;i++)
Dat('');
WCOM(0X80+0x40);
for(i=0;i<16;i++)
Dat('');
}
}
voidTimer0()interrupt1
{
staticuinti;
TH0=0XFC;
TL0=0xFF;
i++;
if(i==1)
{
i=0;
clk=~clk;
}
}
5、实验心得及建议
该实验硬件电路出错次数较多,需要锻炼排错的能力,结合软件程序,一步一步检查,这样每一部分都十分清楚
实验四D/A转换实验
1、功能要求
1.了解D/A(DAC0832)的基本原理和功能。
2.掌握D/A(DAC0832)和单片机的硬件接口以及软件设计方法。
3.软件编程使DAC0832转换模块循环输出锯齿波。
4.软件编程使DAC0832转换模块循环输出正弦波。
2、硬件原理
3、软件程序流程
4、程序清单
#include
#defineucharunsignedchar
sbitkey=P2^2;
uchari;
ucharcodesin_tab[]=
{
0x80,0x83,0x85,0x88,0x8a,0x8d,0x8f,0x92,0x94,0x97,
0x99,0x9b,0x9e,0xa0,0xa3,0xa5,0xa7,0xaa,0xac,0xae,
0xb1,0xb3,0xb5,0xb7,0xb9,0xbb,0xbd,0xbf,0xc1,0xc3,
0xc5,0xc7,0xc9,0xcb,0xcc,0xce,0xd0,0xd1,0xd3,0xd4,
0xd6,0xd7,0xd8,0xda,0xdb,0xdc,0xdd,0xde,0xdf,0xe0,
0xe1,0xe2,0xe3,0xe3,0xe4,0xe4,0xe5,0xe5,0xe6,0xe6,
0xe7,0xe7,0xe7,0xe7,//输出电压从0到最大值,正弦波1/4部分
0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe5,0xe5,0xe4,0xe4,
0xe3,0xe3,0xe2,0xe1,0xe0,0xdf,0xde,0xdd,0xdc,0xdb,
0xda,0xd8,0xd7,0xd6,0xd4,0xd3,0xd1,0xd0,0xce,0xcc,
0xcb,0xc9,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd,0xbb,0xb9,
0xb7,0xb5,0xb3,0xb1,0xae,0xac,0xaa,0xa7,0xa5,0xa3,
0xa0,0x9e,0x9b,0x99,0x97,0x94,0x92,0x8f,0x8d,0x8a,
0x88,0x85,0x83,0x80,//输出电压从最大值到0,正弦波1/2部分
0x7d,0x7b,0x78,0x76,0x73,0x71,0x6e,0x6c,0x69,0x67,
0x65,0x62,0x60,0x5d,0x5b,0x59,0x56,0x54,0x52,0x4f,
0x4d,0x4b,0x49,0x47,0x45,0x43,0x41,0x3f,0x3d,0x3b,
0x39,0x37,0x35,0x34,0x32,0x30,0x2f,0x2d,0x2c,0x2a,
0x29,0x28,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,
0x1e,0x1d,0x1d,0x1c,0x1c,0x1b,0x1b,0x1a,0x1a,0x1a,
0x19,0x19,0x19,0x19,//输出电压从0到最小值,正弦波3/4部分
0x19,0x19,0x19,0x19,0x1a,0x1a,0x1a,0x1b,0x1b,0x1c,
0x1c,0x1d,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x28,0x29,0x2a,0x2c,0x2d,0x2f,0x30,0x32,
0x34,0x35,0x37,0x39,0x3b,0x3d,0x3f,0x41,0x43,0x45,
0x47,0x49,0x4b,0x4d,0x4f,0x52,0x54,0x56,0x59,0x5b,
0x5d,0x60,0x62,0x65,0x67,0x69,0x6c,0x6e,0x71,0x73,
0x76,0x78,0x7b,0x7d
};
voiddelay()
{
ucharj;
for(j=20;j>0;j--);
}
voidjuchibo()
{
for(i=0;i<=254;i++)
P1=(uchar)i;
}
voidmain()
{
while
(1)
{
if(key)
{
for(i=0;i<255;i++)
{
{
P1=sin_tab[i];
delay();
}
if(i==255)
i=0;
}
}
else
{
juchibo();
}
}
}
5、实验心得及建议
锯齿波循环部分没彻底明白,导致锯齿波和三角波不能切换。
另外硬件电路搭建时也要认真
实验五基于MAX232的单片机与微机串行通信实验
1、功能要求
学习使用MAX232实现单片机与微机的串行通讯。
使用串口调试助手软件正确接收发送数据。
2、硬件原理
3、软件程序流程
4、程序清单
#include"reg51.h"
voidmain()
{
unsignedchara;
SCON=0X50;//串行口方式1
PCON=0X80;
TMOD=0X20;
TH1=0XFD;//设定波特率为19.2k
TL1=0XFD;
TR1=1;
ES=0;
while
(1)
{
while(!
RI);
RI=0;
a=SBUF;
SBUF=a;
while(!
TI);
TI=0;
}
}
5、实验心得及建议
该实验软件部分和硬件部分都比较简单,关键是弄懂单片机的PC机谁发送谁接收