单片机实习报告.docx
《单片机实习报告.docx》由会员分享,可在线阅读,更多相关《单片机实习报告.docx(23页珍藏版)》请在冰豆网上搜索。
单片机实习报告
单片机实习报告
专业:
班级:
姓名:
学号:
实习日期:
2014年10月10~22日
指导教师:
目录
一、实习目的与任务3
二、实习内容与要求3
2.1数字电压表要求3
2.2温度传感器要求3
三、实验硬件原理图4
3.1数字电压表硬件原理图4
3.2温度传感器硬件原理图4
四、芯片资料5
4.1STC89C52:
5
4.2TLC25436
4.374HC5957
4.474HC1388
4.5DS18B209
五、数字直流电压表的软件设计9
5.1数字电压表总设计流程10
5.11针对tlc2543模数转换模块进行分析11
5.12针对总线分析11
5.13针对74hc595芯片分析12
5.14程序具体流程图13
5.2温度传感器设计流程图14
5.3程序清单14
5.31数字电压表程序清单14
5.32温度传感器程序清单16
六、调试过程及报告18
七、实习心得19
八、参考文献19
一、实习目的与任务
1.1数字电压表任务
熟悉并掌握单片机外围芯片的应用方法,掌握单片机应用系统一般的设计过程,掌握51单片机扩展SPI接口芯片的方法。
1.2温度传感器任务
熟悉使用DS18B20芯片,以及连接单片机与DS18B20的连线,对片选位选的概念更深刻的的认识,掌握串行口相关知识,能够向DS18B20写数据,读数据,编写温度转换程序。
二、实习内容与要求
2.1数字电压表要求
根据实验箱上8位数码管的显示电路及TLC2543的应用电路,设计一个数字直流电压表,要求能够对输入的0~5V的直流电压进行测量,并通过7段数码管显示,单片机与数码管、TLC2543之间采用SPI数据传输方式。
2.2温度传感器要求
用分立元件DS18B20,STC89C52,构成温度传感器用四位数码管显示温度。
并用串口将采集到的温度数据实时发送至上位机,显示当前温度值。
三、实验硬件原理图
3.1数字电压表硬件原理图
图3-1
3.2温度传感器硬件原理图
四、芯片资料
本次数字电压表实习利用的单片机是STC89C52芯片,数模转换芯片是TLC2543,数码管驱动芯片74HC595,产生片选的芯片74HC138。
下面对个芯片功能加以介绍。
4.1STC89C52:
STC89C52RC单片机是新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。
其主要特性:
1工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
2工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz
3用户应用程序空间为8K字节
4片上集成512字节RAM
5 ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片
6 通用I/O口(32个),复位后为:
P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻
7 共3个16位定时器/计数器。
即定时器T0、T1、T2
8外部中断4路,下降沿中断或低电平触发电路,Power Down模式可由外部中断低电平触发中断方式唤醒
其引脚图:
如图4-3所示
其主要引脚功能描述:
1P0端口(P0.0~P0.7,39~32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。
2 P1端口(P1.0~P1.7,1~8引脚):
P1口是一个带内部上拉电阻的8位双向I/O口。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。
3P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入。
图4-1
4P2端口(P2.0~P2.7,21~28引脚):
P2口是一个带内部上拉电阻的8位双向I/O端口。
对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。
5P3端口(P3.0~P3.7,10~17引脚):
P3是一个带内部上拉电阻的8位双向I/O端口。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。
P3口除作为一般I/O口外,还有其他一些复用功能,如下图4—2所示
图4—2图4—3
6RST(9引脚):
复位输入。
当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。
4.2TLC2543
TLC2543是TI公司的12位串行模数转换器,使用开关电容逐次逼近技术完成A/D转换过程。
TLC2543主要性能
(1)12位分辩率A/D转换器;
(2)在工作温度范围内10μs转换时间;
(3)11个模拟输入通道;
(4)具有单、双极性输出;
(5)可编程的MSB或LSB前导;
(6)可编程输出数据长度。
可以用四种传输方法使TLC2543得到全12位分辩率,每次转换和数据传递可以使用12或16个时钟周期。
一个片选脉冲要插到每次转换的开始处,或是在转换时序的开始处变化一次后保持为低,直到时序结束。
每次转换和数据传递使用16个时钟周期和在每次传递周期之间插入的时序。
每次转换和数据传递使用16个时钟周期,仅在每次转换序列开始处插入一次时序。
图4-4时序图图4-5tlc2543引脚
TLC2543引脚
CS:
CS由高变为低时候允许DATAINPUT(初始化时候),由低到高禁止DATAINPUT。
DATAINPUT:
4位串行地址输入,用来选择模拟输入通道功能或者测试引脚高位在前在每一个AD_IO_CLK的上升沿输入ADC的寄存器。
它由八位组成,前四位D7:
D4用作选择模拟输入通道,D3:
D2用作选择数据长度,D1是选择输出高低位顺序的,D0选择是选择输出极性,单双极性。
DATAOUT:
当CS为高时DATAOUT输出为高阻抗,当CS有效时驱动转换结果,并在AD_IO_CLK的下降沿按位顺序输出。
AD_IO_CLK:
输入和输出时钟主要完成以下功能。
在IO_CLK的前八个时钟的上升沿将DATAINPUT的八位数据输入数据寄存器中。
在IO_CLK的第四个时钟下降沿到来时候已经完成了输入通道选择并开始给输入采样电容进行充电,直到第八个下降沿到来。
将前11位转换结果进行移位输出。
DATAOUT在最后一个时钟下降沿来临时候将转换控制权力交给内部状态控制器。
4.374HC595
74HC595芯片是一种串入并出的芯片,在电子显示屏制作当中有广泛的应用。
74HC59是8位串行输入/输出或者并行输出移位寄存器具有高阻、关、断状态。
特点:
8位串行输入,8位串行或并行输出,存储状态寄存器有三种状态,输出寄存器可以直接清除100MHz的移位频率,输出能力并行输出,总线驱动串行输出。
74595的主要优点是具有数据存储寄存器在移位的过程中,输出端的数据可以保持不变。
这在串行速度慢的场合很有用处,数码管没有闪烁感。
主要引脚
QH三态输出管脚
8GND电源地
9SQH串行数据输出管脚
10SCLR移位寄存器清零端
13OE输出使能
14SI数据线
15VCC电源
11SCK数据输入时钟线时钟SCK上升沿有效一次,直到八位数据输入完毕,输出时上升沿有效一次,此时输入的数据就被送到了输出端。
12RCK输出存储器锁存时钟线上升沿时移位寄存器的数据进入数据存储寄存器下降沿时存储寄存器数据不变。
(通常将RCK置为低电平)当移位结束后,在RCK端产生一个正脉冲。
4.474HC138
74HC138芯片是常用的3-8线译码器,常用在单片机和数字电路的译码电路中。
图4-674hc138引脚图图4-674hc138功能表
工作原理:
当一个选通端(G1)为高电平,另两个选通端((G2A)和(G2B))为 低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。
4.5DS18B20
DS18B20的主要特征:
(1) 全数字温度转换及输出。
(2) 先进的单总线数据通信。
(3) 最高12位分辨率,精度可达土0.5摄氏度。
(4) 12位分辨率时的最大工作周期为750毫秒。
(5) 可选择寄生工作方式。
(6)检测温度范围为–55°C ~+125°C (–67°F ~+257°F) (7) 内置EEPROM,限温报警功能。
(8)64位光刻ROM,内置产品序列号,方便多机挂接。
(9) 多样封装形式,适应不同硬件系统。
DS18B20的外形和内部结构
DS18B20引脚定义:
(1) DQ为数字信号输入/输出端;
(2) GND为电源地;
(3) VDD为外接供电电源输入端(在寄生电源接线方式时接地)
五、数字直流电压表的软件设计
根据实验箱上8位数码管的显示电路及TLC2543的应用电路,设计一个数字直流电压表,要求能够对输入的0~5V的直流电压进行测量,并通过7段数码管显示,单片机与数码管、TLC2543之间采用SPI数据传输方式。
5.1数字电压表总设计流程
TLC2543
模数转换
(数字电压值)
STC89C52
单片机分析处理数据送给595芯片
数据采集端(模拟电压量)
数字电压表分为数据采集模块,模数转换模块,单片机部分,数码驱动模块,以及数码管显示部分。
根据流程图设计连接硬件
图5—1
下面就软件编程来进行分析
5.11针对tlc2543模数转换模块进行分析
对2543芯片初始化即CS由高变为低。
由于本次实习用到voltage作为转换结果,设计的数字电压表的精确度是12位,占两个字节还空四位,转换过程是从高位到低位依次进行,每完成一次AD转化需要左移四位。
在第12次循环后voltage仍然左移了一位,因此要右移一位。
图3此图是试验箱上的具有SPI接口的A/D转换芯片TLC2543的电路,它的CLK接SPI的时钟端,Din引脚接SPI的输入端,Dout接SPI的输出端。
图5—2tlc2543在实验箱上引脚连接图
5.12针对总线分析
SPI总线是三线同步接口,同步串行3线方式进行通信:
一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于CPU与各种外围器件进行全双工、同步串行通讯。
其数据的传输格式是高位(MSB)在前,低位(LSB)在后。
对于在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应将其串行时钟输出口P1.1的初始状态设置为1,而在允许接口后再置P1.1为0。
这样,MCU在输出1位SCK时钟的同时,将使接口芯片串行左移,从而输出1位数据至MCS51单片机的P1.3口(模拟MCU的MISO线),此后再置P1.1为1,使MCS51系列单片机从P1.0(模拟MCU的MOSI线)输出1位数据(先为高位)至串行接口芯片。
5.13针对74hc595芯片分析
Y6与12脚RCLK相连输出存储器锁存时钟线上升沿时移位寄存器的数据进入数据存储寄存器下降沿时存储寄存器数据不变。
(通常将RCLK置为低电平)当移位结束后,在RCLK端产生一个正脉冲。
图5—374HC595在实验箱上引脚连接图
74HC595当RCLK=0,开始工作,驱动数码管显示对应的数字电压。
5.14程序具体流程图
Y
N
5.2温度传感器设计流程图
DS18B20的操作流程
5.3程序清单
5.31数字电压表程序清单
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineulongunsignedlong
#defineaccuracy1.221001221
0012210012210012210012/*500
0/4096处理TLC2543(5000为5v
放大的数据精度为12位的A/D
所以2的12次方=4096)采来的
数据*/
sbitCLK=P1^1;
sbitDIN=P1^2;
sbitDOUT=P1^3;
unsignedcharcodeduan[]
={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xFF};
/*共阳极数码显示字符16进制代码*/
unsignedcharcodedian[]={0x40,
0x79,0x24,0x30,0x19,0x12,0x02,
0x78,0x00,0x10,};/*共阳极数码显
示小数点*/
_______________0________________________________________1____________________
intvoltage=0,a;
unsignedcharAD[4];
voiddelay(unsignedintt)/*延时tms*/
{
unsignedintx,y;
for(x=0;x<110;x++)
for(y=0;y}
uinttlc2543(unsignedcharport)/*选择
方式控制字*/
{
CLK=0;
P2=0x00;/*cs端选通,2543芯
片开始工作*/
voltage<<=4;
for(a=0;a<12;a++)
{
if(DOUT)
_______________2_________________________________________3_____________________
voltage++;/*对A/D值的处理
,若本次DOUT的电平为1,电压自加*/
DIN=(bit)(port&0x80);/*取出
port的二进制数的第8位*/
CLK=1;//上升沿数据输入
delay
(1);
CLK=0;//下降沿数据输出
delay
(1);
voltage<<=1;/*转换结果左移一位
(转换过程是从高位到低位依次进行)*/
port<<=1;/*控制字左移一位
(下一循环送控制字下一位)*/
}
voltage>>=1;/*在第12次循环
后port仍然左移了一位,因此要右移*/
return(voltage);
}
_______________4__________________________________________5____________________
voidSPI_write(ucharData)
{
inti;
for(i=0;i<8;i++)
{
CLK=0;
DIN=(bit)(Data&0x80);
Data<<=1;
CLK=1;
}
}
voidmain()
{
intw;
CLK=0;
while
(1)
{
for(w=0;w<4;w++)
tlc2543(0x00);/*选择AIN0端口,
8位选择,高位在前,无极性输出。
*/
voltage=voltage*accuracy;
voltage=voltage/1;
AD[3]=voltage/1000;
AD[2]=voltage/100%10;
AD[1]=voltage/10%10;
AD[0]=voltage%10;
_________6_____________________________________________7___________________
SPI_write(duan[AD[0]]);/*千分位*/
SPI_write(duan[AD[1]]);/*百分位*/
SPI_write(duan[AD[2]]);/*十分位*/
SPI_write(dian[AD[3]]);/*个位*/
SPI_write(duan[10]);
SPI_write(duan[10]);
SPI_write(duan[10]);
SPI_write(duan[10]);
P2=0xff;
P2=0X06;
}
}
5.32温度传感器程序清单
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^7;//温度传感器信号线
uinttemp;
floatf_temp;
unsignedcharcodezhen[]={0xc0,0xf9,
0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0xFF};/*共阳极数码显示字符16
进制代码*/
unsignedcharcodedian[]={0x40,0x79,0x24,
0x30,0x19,0x12,0x02,0x78,0x00,0x10,};/*
共阳
极数码显示字符16
进制代码*/
_______________0___________________________________________1___________________
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=11;y>0;y--);
}
voiddsreset(void)//18B20复位,初始化函数
{
uinti;
DQ=1;
DQ=0;//温度传感器信号线关
//delay(480);
i=103;
while(i>0)i--;
DQ=1;//温度传感器信号线开
i=4;
while(i>0)i--;
}
______________2_____________________________________________3__________________
bittempreadbit(void)//读1位函数
{
uinti;
bitdat;
DQ=0;i++;//i++起延时作用
DQ=1;i++;i++;
dat=DQ;
i=8;while(i>0)i--;
return(dat);
}
uchartempread(void)//读1个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);/*读出的数据
最低位在最前面,这样刚好一个字节在
DAT里*/
}
return(dat);
}
__________________4________________________________________5___________________
voidtempwritebyte(uchardat)/*向18B20
写一个字节数据*/
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
DQ=0;
i++;i++;
DQ=1;
i=8;while(i>0)i--;
}
else
{
DQ=0;//写0
i=8;while(i>0)i--;
DQ=1;
i++;i++;
}
}
}
________________6____________________________________________7_________________
voidtempchange(void)/*DS18B20开始获
取温度并转换*/
{
dsreset();
delay
(1);
tempwritebyte(0xcc);/*写跳过读ROM指令*/
tempwritebyte(0x44);/*写温度转换指令*/
}
uintget_temp()/*读取寄存器中存储
的温度数据*/
{
uchartempL,tempH;
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);//读暂存器
tempL=tempread();/*读低8位*/
tempH=tempread();//读高8位
temp=tempH;
temp<<=8;/*两个字节组
合为1个字*/
temp=temp|tempL;
f_temp=temp*0.0625;/*温度在寄存
器中为12
位分辨率位0.0625°*/
temp=(uint)(f_temp*10+0.5);/*乘以10
表示小
数点后面只取1位,加0.5是四舍五入*/
f_temp=f_temp+0.05;
returntemp;//temp是整型
}
_______________8____________________________________________9__________________
//显示程序
voiddisplay(uinttemp)
{
ucharaa,bb,cc;
temp=temp/1;
aa=temp/100;
bb=temp%100/10;
cc=temp%10;
P2=0xf7;
P0=zhen[aa];
delay(20);
P2=0xfb;
P0=dian[bb];
delay(20);
P2=0xfd;
______________10___________________________________________11__________________
P0=zhen[cc];
delay(20);
P2=0xfe;
P0=0xc6;
delay(20);
}
voidinit_com(void)
{
TMOD=0x20;
PCON=0x00;
SCON=0x