单片机实习报告word格式模板Word下载.docx
《单片机实习报告word格式模板Word下载.docx》由会员分享,可在线阅读,更多相关《单片机实习报告word格式模板Word下载.docx(27页珍藏版)》请在冰豆网上搜索。
![单片机实习报告word格式模板Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/2/5590a0a5-b9a0-44ff-8efc-37ca6d388405/5590a0a5-b9a0-44ff-8efc-37ca6d3884051.gif)
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
片选段。
CS的下降沿使能DATAIN、DATAOUT和I/OCLOCK。
17
DATAINPUT
串行数据输入端。
数据在I/OCLOCK的上升沿串入。
前4位数据为模拟电压的通道号或片内自测电压通道号,高位在先。
16
DATAOUT
O
串行数据输出端。
数据在I/OCLOCK的下降沿写入。
在CS无效或进行A/D转换时,该脚保持高阻状态。
在数据输出时,由软件编程决定是高位在先还是低位在先。
19
EOC
转换结束标志。
在输入串行数据的最后一个时钟周期的下降沿,即开始A/D转换时,EOC脚变低,直到转换结束后变高。
此时数据准备完毕,可以输出。
10
GND
地,REF-接该脚。
18
I/OCLOCK
I/O时钟
14
REF+
正参考电压端,一般情况接VCC。
13
REF-
负参考电压端,一般情况接地。
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<
reg51.h>
intrins.h>
#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_();
port=port<
1;
ad=ad<
}
AA=1;
BB=1;
ad=ad>
>
returnad;
}
/**************延时**************/
voiddelayms(ucharx)
{
uchari,j;
for(i=x;
i>
0;
i--)
for(j=200;
j>
j--);
voidSend_Byte(uchardat)
8;
{SDA=dat&
0x80;
SCK=1;
dat<
=1;
SCK=0;
}
//读一个字节
ucharRead_Byte(void)
{
uchari;
uintbyte=0;
SCK=0;
for(i=0;
16;
{byte<
if(SDA)
byte|=0x0001;
}
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();
Send_Byte(0XF8);
Send_Byte(temph);
Send_Byte(templ);
//写数据
voidWrite_Dat(uchardat)
//
temph=dat&
templ=(dat&
Send_Byte(0XFA);
voidpos(ucharx,uchary)
ucharaddr;
switch(y)
case0:
addr=0x80+x;
break;
case1:
addr=0x90+x;
case2:
addr=0x88+x;
case3:
addr=0x98+x;
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;
pos(0,0);
i=0;
while(strint2[i]!
='
\0'
)
{
Write_Dat(strint2[i]);
i++;
pos(0,1);
while(strint4[i]!
Write_Dat(strint4[i]);
pos(0,2);
while(strint5[i]!
Write_Dat(strint5[i]);
pos(5,3);
Write_Dat(strint3[key]);
voidAD_change()
{uinthigh1=0,high2=0,high3=0,high4=0;
ad=TLC2543(0x01);
ad=(float)ad/4096*5000;
high1=ad/1000;
//if(high1<
sum2&
&
high1>
sum3)
//{
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()
if(flag==0)
Send_Byte(0x0e);
//11111110
flag=1;
temp=P1;
temp=temp&
0x0f;
if(temp!
=0x0f)
{
delayms(5);
switch(temp)
case0x0e:
key=0;
break;
case0x0d:
key=1;
case0x0b:
key=2;
case0x07:
key=3;
while(temp!
K_deal(key);
if(flag==1)
Send_Byte(0x0d);
//11111101
flag=2;
key=4;
key=5;
key=6;
key=7;
if(flag==2)
Send_Byte(0x0b);
//11111011
flag=3;
key=8;
key=9;
key=10;
key=11;
if(flag==3)
Send_Byte(0x07);
//11110111
flag=4;
key=12;
key=13;
key=14;
key=15;
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++;
k=1;
dis[fz]=1;
if(key==13)
k=4;
dis[fz]=4;
if(key==12)
k=7;
dis[fz]=k;
if(key==10)
k=2;
if(key==9)
k=5;
if(key==8)
k=8;
if(key==6)
k=3;
if(key==5)
k=6;
if(key==4)
k=9;
if(key==3)
uchari;
di=1;
if(di==1)
{yun=1;
m=1;
l=1;
j=fz;
for(;
fz>
fz--)
{
for(i=fz;
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=sum1/10;
p++;
for(j=p;
j--)
{dis3[j]=i%10;
i=i/10;
for(j=1;
j<
=p;
j++)
{
Write_Dat(0x30+dis3[j]);
if(key==2)