单片机实习报告word格式模板.docx
《单片机实习报告word格式模板.docx》由会员分享,可在线阅读,更多相关《单片机实习报告word格式模板.docx(27页珍藏版)》请在冰豆网上搜索。
单片机实习报告word格式模板
单片机实习报告
课题名称:
数字直流电压表的设计
学院:
电气信息工程学院__
专业:
通信工程_______
学号:
XXXXXXXX_______
姓名:
________
指导教师:
________
日期:
2017.3.27-2017.3.31
摘要
作为嵌入式系统控制核心的单片机(又称为微控制器),以体积小、功能全、性价比高等诸多优点而独具特色。
51单片机是国内目前应用最广泛的单片机之一,随着嵌入式系统、片上系统等概念的提出和普遍接受及应用,51单片机的发展又进入了一个新的阶段。
许多专用功能芯片的内核集成了51单片机,与51单片机兼容的微控制器以IP核的方式不断地出现在FPGA的片上系统中。
随着基于51单片机的嵌入式实时操作系统的出现与推广,在很长一段时间内,51单片机仍将占据嵌入式系统产品的中、低端市场。
51单片机是对所有兼容Intel8031指令系统的单片机的统称。
该系列单片机的始祖是Intel的8031单片机,后来随着Flashrom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。
很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。
51单片机是基础入门的一个单片机,还是应用最广泛的一种。
由于单片机在工业控制领域的广泛应用,单片机由仅有CPU的专用处理器芯片发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成复杂的而对体积要求严格的控制设备当中。
尽管2000年以后ARM已经发展出了32位的、主频超过300M的高端单片机,但直到现在基于8051的单片机还在广泛的使用。
在很多方面单片机比专用处理器更适合应用于嵌入式系统,因此它得到了广泛的应用。
事实上单片机是世界上数量最多的处理器,随着单片机家族的发展壮大,单片机和专用处理器的发展便分道扬镳。
如今,单片机已经深入到人们生活的各个方面,几乎每件有电子器件的产品中都会集成有单片机。
例如手机、平板电脑、计算器、智能家居、电子玩具以及鼠标等电子产品中都含有单片机。
除此之外,汽车上一般配备40多片单片机,复杂的工业控制系统上甚至可能有数百片单片机在同时工作。
单片机的数量远超过PC机和其他计算机的总和。
本次实习就以52单片机为基础进行设计数字模拟电压表。
关键词:
52单片机TLC254374LS16474LS138
1.实习目的与任务
1.熟悉并掌握单片机外围芯片的应用方法;
2.掌握单片机应用系统一般的设计过程;
3.掌握52单片机扩展SPI接口芯片的方法。
2.实习内容与要求
根据实验箱上12864液晶及TLC2543的应用电路,设计一个数字直流电压表,要求能够对输入的0~5V的直流电压进行测量,并通过液晶显示,通过矩阵按键设置上下限。
单片机与液晶、TLC2543之间采用SPI数据传输方式。
当测量超出限定接线,单片机发送一个警告信号,由LED灯显示。
3.实验硬件
3.174LS138资料
3.1.174LS138简介
74LS138为3线-8线译码器,共有54/74S138和54/74LS138两种线路结构型式,其工作原理如下:
当一个选通端(G1)为高电平,另两个选通端(/(G2A)和/(G2B))为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。
利用G1、/(G2A)和/(G2B)可级联扩展成24线译码器;若外接一个反相器还可级联扩展成32线译码器。
若将选通5端中的一个作为数据输入端时,74LS138还可作数据分配器。
图3.1.1为74LS138的引脚简图。
图3.1.174LS138引脚图
3.1.274LS138功能表
74LS138功能表如表3.1.2所示。
表3.1.274LS138功能表
3.2TLC2543AD转换芯片
3.2.1TLC2543简介
TLC2543是TI公司的12位串行模数转换器,使用开关电容逐次逼近技术完成A/D转换过程。
由于是串行输入结构,能够节省51系列单片机I/O资源;且价格适中,分辨率较高,因此在仪器仪表中有较为广泛的应用。
TLC2543的特点:
(1)12位分辩率A/D转换器;
(2)在工作温度范围内10μs转换时间;
(3)11个模拟输入通道;
(4)3路内置自测试方式;
(5)采样率为66kbps;
(6)线性误差±1LSBmax;
(7)有转换结束输出EOC;
(8)具有单、双极性输出;
(9)可编程的MSB或LSB前导。
3.2.2TLC2543引脚功能
TCL2543引脚功能如表3.2.2所示。
引脚号
名称
I/O
说明
1~9、11、1、2
AIN0~AIN10
I
拟量输入端。
15
CS
I
片选段。
CS的下降沿使能DATAIN、DATAOUT和I/OCLOCK。
17
DATAINPUT
I
串行数据输入端。
数据在I/OCLOCK的上升沿串入。
前4位数据为模拟电压的通道号或片内自测电压通道号,高位在先。
16
DATAOUT
O
串行数据输出端。
数据在I/OCLOCK的下降沿写入。
在CS无效或进行A/D转换时,该脚保持高阻状态。
在数据输出时,由软件编程决定是高位在先还是低位在先。
19
EOC
O
转换结束标志。
在输入串行数据的最后一个时钟周期的下降沿,即开始A/D转换时,EOC脚变低,直到转换结束后变高。
此时数据准备完毕,可以输出。
10
GND
地,REF-接该脚。
18
I/OCLOCK
I
I/O时钟
14
REF+
I
正参考电压端,一般情况接VCC。
13
REF-
I
负参考电压端,一般情况接地。
20
VCC
正电源电压输入端。
电压为5V
0.5V。
表3.2.2TLC2543引脚功能表
3.2.3TLC时序图
TLC时序图如图3.2.3所示。
图3.2.3用CS进行12个时钟传送的工作时序图
(注:
在编程时一定要严格遵守时序。
)
3.2.4TLC指令功能
TLC指令功能如图3.2.4所示
图3.2.4TLC指令功能
(说明:
发送指令和接受数据可同时进行也可先发指令再接收数据,但是接收到的数据是上一次选通的通道转换的数据。
)
3.374LS164
3.3.174LS164简介
8位串行输入,并出移位寄存器
74ls164、74lsT164是高速硅门 COMS器件,与低功耗肖特基型TTL(LSTTL)器件的引脚兼容。
74HC164、74HCT164是8位边沿触发式移位寄存器,串行输入数据,然后并行输出。
数据通过两个输入端(DSA或DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。
两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
时钟(CP)每次由低变高时,数据右移一位,输入到Q0,Q0是两个数据输入端(DSA和DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
主复位(MR)输入端上的一个低电平将使其它所有输入端都无效,非同步地清除寄存器,强制所有的输出为低电平。
74LS164引脚图
74LS164逻辑图
3.3.274LS164使用时序
H=HIGH(高)电平
h=先于低-至-高时钟跃变一个建立时间(set-uptime)的HIGH(高)电平
L=LOW(低)电平
l=先于低-至-高时钟跃变一个建立时间(set-uptime)的LOW(低)电平
q=小写字母代表先于低-至-高时钟跃变一个建立时间的参考输入(referencedinput)的状态↑=低-至-高时钟跃变
4软件设计
4.1程序流程图
数字电压表的程序流程图如图5.1所示。
图5.1数字直流电压表程序流程图
4.2程序代码
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitdoult=P0^5;
sbitAA=P0^0;
sbitBB=P0^1;
sbitCC=P0^2;
sbitSDA=P0^3;//数据总线
sbitSCK=P0^4;//时钟
sbitkey0=P1^0;
sbitkey1=P1^1;
sbitkey2=P1^2;
sbitkey3=P1^3;
sbitLED=P2^6;
uintdis[10];
uintdis3[10];
uintdis4[10];
ucharyy=2,fz,di,yun,dt,n,shift;
uintsum1=0;
ucharkey=0,flag=0;
voidK_deal(ucharkey);
ucharcodestrint2[]={"当前电压:
"};
ucharcodestrint4[]={"电压上限:
"};
ucharcodestrint5[]={"电压下限:
"};
ucharcodestrint3[]={"ABCD963E852F7410"};
/**********AD转化函数********/
uintTLC2543(ucharport)
{
uintad=0;
uchari;
SCK=0;
AA=0;
BB=0;
port<<=4;
for(i=0;i<12;i++)
{
if(doult==1)ad|=0x01;
SDA=port&0x80;
SCK=1;
_nop_();
_nop_();
_nop_();
SCK=0;
_nop_();
_nop_();
_nop_();
port=port<<1;
ad=ad<<1;
}
AA=1;
BB=1;
ad=ad>>1;
returnad;
}
/**************延时**************/
voiddelayms(ucharx)
{
uchari,j;
for(i=x;i>0;i--)
for(j=200;j>0;j--);
}
voidSend_Byte(uchardat)
{
uchari;
SCK=0;
for(i=0;i<8;i++)
{SDA=dat&0x80;
SCK=1;
dat<<=1;
SCK=0;
}
}
//读一个字节
ucharRead_Byte(void)
{
uchari;
uintbyte=0;
SCK=0;
for(i=0;i<16;i++)
{byte<<=1;
SCK=1;
if(SDA)
byte|=0x0001;
SCK=0;
}
byte=((byte>>4)|(byte>>8))&0x00ff;
return((uchar)(byte));
}
//读忙标志
voidRead_Busy(void)
{
uchartemp;
//CS=1;
do
{
Send_Byte(0xfc);//
temp=Read_Byte();//
}
while(temp&0x80);
//CS=0;
}
//写字节命令
voidWrite_Cmd(ucharcmd)
{
uchartemph=0;
uchartempl=0;//
temph=cmd&0xf0;
templ=(cmd&0x0f)<<4;
Read_Busy();
//CS=1;
Send_Byte(0XF8);//
Send_Byte(temph);
Send_Byte(templ);
//CS=0;
}
//写数据
voidWrite_Dat(uchardat)
{
uchartemph=0;
uchartempl=0;//
temph=dat&0xf0;
templ=(dat&0x0f)<<4;
Read_Busy();
//CS=1;
Send_Byte(0XFA);//
Send_Byte(temph);//
Send_Byte(templ);
//CS=0;
}
voidpos(ucharx,uchary)
{
ucharaddr;
switch(y)
{
case0:
addr=0x80+x;break;
case1:
addr=0x90+x;break;
case2:
addr=0x88+x;break;
case3:
addr=0x98+x;break;
default:
break;
}
Write_Cmd(addr);
}
/****************液晶初始化*********/
voidLCD_Init(void)
{
AA=1;
BB=1;
CC=0;
Write_Cmd(0X30);
Write_Cmd(0X01);
Write_Cmd(0X02);
Write_Cmd(0X0C);
}
voidLcd_display(ucharkey)
{uchari;
AA=1;
BB=1;
CC=0;
pos(0,0);
i=0;
while(strint2[i]!
='\0')
{
Write_Dat(strint2[i]);
i++;
}
pos(0,1);
i=0;
while(strint4[i]!
='\0')
{
Write_Dat(strint4[i]);
i++;
}
pos(0,2);
i=0;
while(strint5[i]!
='\0')
{
Write_Dat(strint5[i]);
i++;
}
pos(5,3);
Write_Dat(strint3[key]);
}
voidAD_change()
{uinthigh1=0,high2=0,high3=0,high4=0;
uintad=0;
ad=TLC2543(0x01);
ad=(float)ad/4096*5000;
high1=ad/1000;
//if(high1sum3)
//{
high2=ad%1000/100;
high3=ad%100/10;
high4=ad%10;
pos(5,0);
Write_Dat(high1+0X30);
Write_Dat('.');
Write_Dat(high2+0X30);
Write_Dat(high3+0X30);
Write_Dat(high4+0X30);}
/**********矩阵按键*******************/
voidkeyscan()
{
uchartemp;
if(flag==0)
Send_Byte(0x0e);//11111110
flag=1;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delayms(5);
temp=temp&0x0f;
if(temp!
=0x0f)
{
switch(temp)
{
case0x0e:
key=0;
break;
case0x0d:
key=1;
break;
case0x0b:
key=2;
break;
case0x07:
key=3;
break;
}
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
K_deal(key);
}
}
if(flag==1)
Send_Byte(0x0d);//11111101
flag=2;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delayms(5);
temp=temp&0x0f;
if(temp!
=0x0f)
{
switch(temp)
{
case0x0e:
key=4;
break;
case0x0d:
key=5;
break;
case0x0b:
key=6;
break;
case0x07:
key=7;
break;
}
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
K_deal(key);
}
}
if(flag==2)
Send_Byte(0x0b);//11111011
flag=3;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delayms(5);
temp=temp&0x0f;
if(temp!
=0x0f)
{
switch(temp)
{
case0x0e:
key=8;
break;
case0x0d:
key=9;
break;
case0x0b:
key=10;
break;
case0x07:
key=11;
break;
}
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
K_deal(key);
}
}
if(flag==3)
Send_Byte(0x07);//11110111
flag=4;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delayms(5);
temp=temp&0x0f;
if(temp!
=0x0f)
{
switch(temp)
{
case0x0e:
key=12;
break;
case0x0d:
key=13;
break;
case0x0b:
key=14;
break;
case0x07:
key=15;
break;
}
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
K_deal(key);
}
}
flag=0;
}
/*************按键处理*********/
voidK_deal(ucharkey)
{
ucharj,p=0,m,x;
uintl,i,k;
if(key==15)
{fz++;
l=0x30;
k=0;
dis[fz]=0;
}
if(key==14)
{fz++;
l=0x30;
k=1;
dis[fz]=1;
}
if(key==13)
{fz++;
l=0x30;
k=4;
dis[fz]=4;
}
if(key==12)
{fz++;
l=0x30;
k=7;
dis[fz]=k;
}
if(key==10)
{fz++;
l=0x30;
k=2;
dis[fz]=k;
}
if(key==9)
{fz++;
k=5;
l=0x30;
dis[fz]=k;
}
if(key==8)
{fz++;
k=8;
l=0x30;
dis[fz]=k;
}
if(key==6)
{fz++;
k=3;
l=0x30;
dis[fz]=k;
}
if(key==5)
{fz++;
k=6;
l=0x30;
dis[fz]=k;
}
if(key==4)
{fz++;
k=9;
l=0x30;
dis[fz]=k;
}
if(key==3)
{
uchari;
di=1;
if(di==1)
{yun=1;
m=1;
l=1;
j=fz;
for(;fz>0;fz--)
{
for(i=fz;i>1;i--)
m=m*10;
m=m*dis[l];
l++;
sum1=sum1+m;
m=1;
}
fz=0;
di=9;
}
//i=sum1;
}
if(key==1)
{
pos(7,1);
i=sum1;
//sum2=sum1;
for(x=0;x{
sum1=sum1/10;
p++;
}
for(j=p;j>0;j--)
{dis3[j]=i%10;
i=i/10;
}
for(j=1;j<=p;j++)
{
Write_Dat(0x30+dis3[j]);
}
i=0;
}
if(key==2)