单片机实习报告word格式模板Word下载.docx

上传人:b****6 文档编号:18940264 上传时间:2023-01-02 格式:DOCX 页数:27 大小:230.09KB
下载 相关 举报
单片机实习报告word格式模板Word下载.docx_第1页
第1页 / 共27页
单片机实习报告word格式模板Word下载.docx_第2页
第2页 / 共27页
单片机实习报告word格式模板Word下载.docx_第3页
第3页 / 共27页
单片机实习报告word格式模板Word下载.docx_第4页
第4页 / 共27页
单片机实习报告word格式模板Word下载.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

单片机实习报告word格式模板Word下载.docx

《单片机实习报告word格式模板Word下载.docx》由会员分享,可在线阅读,更多相关《单片机实习报告word格式模板Word下载.docx(27页珍藏版)》请在冰豆网上搜索。

单片机实习报告word格式模板Word下载.docx

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)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1