参加电子设计 单片机最小系统实验报告.docx

上传人:b****8 文档编号:10481389 上传时间:2023-02-13 格式:DOCX 页数:46 大小:115.89KB
下载 相关 举报
参加电子设计 单片机最小系统实验报告.docx_第1页
第1页 / 共46页
参加电子设计 单片机最小系统实验报告.docx_第2页
第2页 / 共46页
参加电子设计 单片机最小系统实验报告.docx_第3页
第3页 / 共46页
参加电子设计 单片机最小系统实验报告.docx_第4页
第4页 / 共46页
参加电子设计 单片机最小系统实验报告.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

参加电子设计 单片机最小系统实验报告.docx

《参加电子设计 单片机最小系统实验报告.docx》由会员分享,可在线阅读,更多相关《参加电子设计 单片机最小系统实验报告.docx(46页珍藏版)》请在冰豆网上搜索。

参加电子设计 单片机最小系统实验报告.docx

参加电子设计单片机最小系统实验报告

(此文档为word格式,下载后您可任意编辑修改!

单片机最小系统

一、摘要:

单片机最小系统设计主要在STC89C52单片机上扩展IO口,用ZLG7290芯片扩展键盘和8段数码管显示接口,用TLC5615和TLC1549芯片进行数模间转换,液晶连接单片机IO口。

软件编程控制数码管显示、液晶显示、数模间转换。

二、关键字:

STC89C52、TLC5615、TLC1549、ZLG7290、按键、LED、LCD、8段数码管。

 

1.设计…………………………………………………………………………3

1.1主要芯片简介…………………………………………………………3

1.1.1ZLG7290芯片………………………………………………

1.1.2TLC5615芯片……………………………………………

1.1.3TLC1549芯片……………………………………………

1.2目的要求……………………………………………………………3

1.2.1目的………………………………………………………4

1.2.2任务………………………………………………………4

2.系统原理…………………………………………………………………4

2.1电源………………………………………………………4

2.2复位及时钟电路…………………………………………4

2.3八段数码显示管…………………………………………5

2.4液晶显示电路……………………………………………5

2.5按键电路…………………………………………………6

2.6ADDA转换电路…………………………………………

3.具体步骤…………………………………………………………………

4.设计总结…………………………………………………………………

5.软件设计…………………………………………………………………

6.参考文献……………………………………………………………………

附录1材料清单

1.设计

1.1主要芯片简介

1.1.1ZLG7290

1.直接驱动8位共阴式数码管(1英寸以下)或64只独立的LED;

2.能够管理多达64只按键,自动消除抖动,其中有8只可以作为功能键使用;

3.段电流可达20mA,位电流可达100mA以上;

4.利用功率电路可以方便地驱动1英寸以上的大型数码管;

5.具有闪烁、段点亮、段熄灭、功能键、连击键计数等强大功能;

6.提供有10种数字和21种字母的译码显示功能,或者直接向显示缓存写入显示数据;

7.不接数码管而仅使用键盘管理功能时,工作电流可降至1mA;

8.与微控制器之间采用I2C串行总线接口,只需两根信号线,节省IO资源;

9.工作电压范围:

+3.3~5.5V;

10.工作温度范围:

-40~+85℃;

11.封装:

DIP-24(窄体),SOP-24。

1.1.2TLC5615

TLC5615是一个串行10位DAC芯片。

只需要3根串行总线就可以完成10位数据的串行输入,易于和工业标准的微控制器或微处理器接口,适用于电池供电的测试仪表、移动电话,也适用于数字的失调与增益调整以及工业控制场合。

其主要特点如下:

1、单5V电源工作

2、3线串行接口

3、高阻抗基准输入端

4、DAC输出的最大电压为2倍的基准输入电压

5、上电时内部自动复位

6、微功耗,最大功耗为1.75mW

7、转换速率快,更新速率为1.21MHZ

1.1.3TLC1549

TLC1549是一个具有串行控制、连续逐渐逼近型的模数转换器,它采用两个差分基准电压高阻输入和一个三态输出构成三态接口。

1、电源电压范围:

-0.5V…6V

2、125摄氏度输入电压范围:

-0.3…VCC+0.3V

3、输出电压范围:

-0.3…VCC+0.3V

4、正基准电压:

VCC+0.1V

5、负基准电压:

-0.1V

6、峰值输入电流:

+20mA或-20mA

7、峰值总输入电流:

+30mA或-30mA

1.2目的要求

1.2.1目的:

通过对单片机最小系统的研究,掌握单片机各引脚功能,理解单片机工作过程及原理,以及与各种外部扩展器件的连接,能够自己运用单片机来解决实际问题。

1.2.2任务:

根据单片机最小系统的连接说明图,完成单片机最小系统的焊接以及调试。

掌握keil等单片机相关软件的使用。

理解小系统的工作原理,掌握实际运用单片机小系统。

2.系统原理

电路是由电源、复位电路、八段数码管显示电路、按键及LED电路、LCD电路、ADDA转换电路等部分组成。

2.1电源

5V电源电路图

2.2复位及时钟电路

复位及时钟电路图

复位电路由按键复位和上电复位两部分组成。

STC89系列单片机为高电平复位,通常在复位引脚RST上连接一个电容到VCC,再连接一个电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平进行复位,随后回归到低电平进入正常工作状态,这个电阻和电容的典型值为8.2K和10uF。

STC89C52RC使用12MHz的晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF至50pF之间。

2.3八段数码显示管

数码管电路图

电路包含两个共阴8段数码管显示器,使用动态扫描方式驱动。

共阴极作为位选有PNP三极管驱动连接ZLG7290的SEG(A…G),八位段选在通过220Ω限流后连接在ZLG7290的Dig(0…7)上。

由于数码管是共阴的,所以当驱动信号为1时对应的数码管才点亮。

2.4液晶显示电路

液晶电路

电路采用12864液晶显示器,液晶的D(0…7)数据线连接在单片机的P0口上。

RS、WR、LCDEN、RD连接在P1.2、P1.3、P1.4、P1.5上

2.5按键电路

按键电路图

4个独立按键使用10K电阻上拉后连接到单片机的P3.2-P3.5口。

按键没有按下时口线上因为上拉而呈现高电平,当某个按键按下时对应口线会被连接到GND而变成低电平。

另外由于LED的反向截止特性以及按键上拉较弱,P2口及P3.2-P3.5口亦可以兼做通用IO口使用,用来连接外部器件。

MCS51Lite板上也提供了插针方便连接。

2.6ADDA转换器

ADDA转换器电路图

OUTPUT为模拟数据输出引脚,SCLK为读写时钟输入,INPUT是数据输入引脚,DOUT为输入输出引脚。

CS为芯片使能。

3.具体步骤

3.1先按照说明书的器件规格要求,找到每个位置对应的具体器件,特别是电阻和三极管的大小,单片机等各个芯片的缺口要与板子对应。

3.2按照对应的器件把器件牢固的焊接到板子对应的焊盘上,要注意不要让针脚脱落。

3.3使用单片机编程软件keil编写调试所用的程序,比如数码管、ADDA转换、液晶显示。

3.4检测完所有模块没有问题就说明单片机最小系统制作完成,然后撰写课程设计报告。

六、设计总结

单片机最小系统经过我们一段时间的焊接、调试,终于能够达到预定的功能,虽然只是简单的焊接和调试,但从中我们也接触了不少的关于单片机的知识。

此次课程设计让我对单片机有了初步的认识,能够了解单片机工作的模式和具体过程,明白了怎样利用单片机来设计满足自己设定功能的作品,怎样利用单片机来控制系统。

同时,这也让我了解到怎样进行单片机编程。

还有就是通过具体焊接过程掌握了焊接的技巧,锻炼了自己的焊接能力。

掌握了这些就可以在大学期间利用单片机最小系统来拓展功能,制作自己想做的东西,对科研立项等活动有很大的帮助作用。

七、软件设计

*I2C.)ZLG7290_cmd(0x70,(Fn))

#endif_ZLG7290_H_

#ifndef_TLC5615_H_

#define_TLC5615_H_

#include

sbitdout=P3^5;数据出口

externvoidDA_Conver(unsignedintDAValue);

externvoiddelayda();

#endif

#ifndef_TLC1549_H_

#define_TLC1549_H_

sbitAD_CS=P1^7;

sbitAD_DAT=P1^6;

sbitAD_CLK=P1^5;

externvoidTLC1549();

#endif

*ZLG7290.c

数码管显示与键盘管理芯片ZLG7290的标准80C51驱动程序C文件

Copyright(c)2005,广州周立功单片机发展有限公司

Allrightsreserved.

本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的*

#include"I2C.b;

}

*函数:

ZLG7290_ReadReg()

功能:

从ZLG7290的某个内部寄存器读出数据

参数:

RegAddr:

ZLG7290的内部寄存器地址

*dat:

保存读出的数据

返回:

0:

正常

1:

访问ZLG7290时出现异常

*bitZLG7290_ReadReg(unsignedcharRegAddr,char*dat)

{

bitb;

b=I2C_Gets(ZLG7290_I2C_ADDR,RegAddr,1,dat,1);

returnb;

}

*函数:

ZLG7290_cmd()

功能:

向ZLG7290发送控制命令

参数:

cmd0:

写入CmdBuf0寄存器的命令字(第1字节)

cmd1:

写入CmdBuf1寄存器的命令字(第2字节)

返回:

0:

正常

1:

访问ZLG7290时出现异常

*bitZLG7290_cmd(charcmd0,charcmd1)

{

bitb;

charbuf[2];

buf[0]=cmd0;

buf[1]=cmd1;

b=I2C_Puts(ZLG7290_I2C_ADDR,ZLG7290_CmdBuf,1,buf,2);

returnb;

}

*函数:

ZLG7290_SegOnOff()

功能:

段寻址,单独点亮或熄灭数码管(或LED)中的某一段

参数:

seg:

取值0~63,表示数码管(或LED)的段号

b:

0表示熄灭,1表示点亮

返回:

0:

正常

1:

访问ZLG7290时出现异常

说明:

在每一位数码管中,段号顺序按照“a,b,c,d,e,f,g,dp”进行

*bitZLG7290_SegOnOff(charseg,bitb)

{

charcmd;

cmd=seg&0x3F;

if(b)cmd|=0x80;

returnZLG7290_cmd(0x01,cmd);

}

*函数:

ZLG7290_Download()

功能:

下载数据并译码

参数:

addr:

取值0~7,显示缓存DpRam0~DpRam7的编号

dp:

是否点亮该位的小数点,0-熄灭,1-点亮

flash:

控制该位是否闪烁,0-不闪烁,1-闪烁

dat:

取值0~31,表示要显示的数据

返回:

0:

正常

1:

访问ZLG7290时出现异常

说明:

显示数据具体的译码方式请参见ZLG7290的数据手册

*bitZLG7290_Download(charaddr,bitdp,bitflash,chardat)

{

charcmd0;

charcmd1;

cmd0=addr&0x0F;

cmd0|=0x60;

cmd1=dat&0x1F;

if(dp)cmd1|=0x80;

if(flash)cmd1|=0x40;

returnZLG7290_cmd(cmd0,cmd1);

}

*

I2C.c

标准80C51单片机模拟I2C总线的主机程序

Copyright(c)2005,广州周立功单片机发展有限公司

Allrightsreserved.

本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的

*

#include"I2C.()函数的开始处,通常应当要执行一次本函数

*

voidI2C_Init()

{

I2C_SCL=1;

I2C_Delay();

I2C_SDA=1;

I2C_Delay();

}

*

函数:

I2C_Start()

功能:

产生I2C总线的起始状态

说明:

SCL处于高电平期间,当SDA出现下降沿时启动I2C总线

不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态

本函数也可以用来产生重复起始状态

本函数执行后,I2C总线处于忙状态

*

voidI2C_Start()

{

I2C_SDA=1;

I2C_Delay();

I2C_SCL=1;

I2C_Delay();

I2C_SDA=0;

I2C_Delay();

I2C_SCL=0;

I2C_Delay();

}

*

函数:

I2C_Write()

功能:

向I2C总线写1个字节的数据

参数:

dat:

要写到总线上的数据

*

voidI2C_Write(chardat)

{

unsignedchart=8;

do

{

I2C_SDA=(bit)(dat&0x80);

dat<<=1;

I2C_SCL=1;

I2C_Delay();

I2C_SCL=0;

I2C_Delay();

}while(--t!

=0);

}

*

函数:

I2C_Read()

功能:

从从机读取1个字节的数据

返回:

读取的一个字节数据

*

charI2C_Read()

{

chardat;

unsignedchart=8;

I2C_SDA=1;在读取数据之前,要把SDA拉高

do

{

I2C_SCL=1;

I2C_Delay();

dat<<=1;

if(I2C_SDA)dat|=0x01;

I2C_SCL=0;

I2C_Delay();

}while(--t!

=0);

returndat;

}

*

函数:

I2C_GetAck()

功能:

读取从机应答位

返回:

0:

从机应答

1:

从机非应答

说明:

从机在收到每个字节的数据后,要产生应答位

从机在收到最后1个字节的数据后,一般要产生非应答位

*

bitI2C_GetAck()

{

bitack;

I2C_SDA=1;

I2C_Delay();

I2C_SCL=1;

I2C_Delay();

ack=I2C_SDA;

I2C_SCL=0;

I2C_Delay();

returnack;

}

*

函数:

I2C_PutAck()

功能:

主机产生应答位或非应答位

参数:

ack=0:

主机产生应答位

ack=1:

主机产生非应答位

说明:

主机在接收完每一个字节的数据后,都应当产生应答位

主机在接收完最后一个字节的数据后,应当产生非应答位

*voidI2C_PutAck(bitack)

{

I2C_SDA=ack;

I2C_Delay();

I2C_SCL=1;

I2C_Delay();

I2C_SCL=0;

I2C_Delay();

}

*函数:

I2C_Stop()

功能:

产生I2C总线的停止状态

说明:

SCL处于高电平期间,当SDA出现上升沿时停止I2C总线

不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态

本函数执行后,I2C总线处于空闲状态

*voidI2C_Stop()

{

unsignedintt=I2C_STOP_WAIT_VALUE;

I2C_SDA=0;

I2C_Delay();

I2C_SCL=1;

I2C_Delay();

I2C_SDA=1;

I2C_Delay();

while(--t!

=0);在下一次产生Start之前,要加一定的延时

}

*函数:

I2C_Puts()

功能:

I2C总线综合发送函数,向从机发送多个字节的数据

参数:

SlaveAddr:

从机地址(7位纯地址,不含读写位)

SubAddr:

从机的子地址

SubMod:

子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址

*dat:

要发送的数据

Size:

数据的字节数

返回:

0:

发送成功

1:

在发送过程中出现异常

说明:

本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址

当从机没有子地址时,参数SubAddr任意,而SubMod应当为0

*bitI2C_Puts

unsignedcharSlaveAddr,

unsignedintSubAddr,

unsignedcharSubMod,

char*dat,

unsignedintSize

{

定义临时变量

unsignedchari;

chara[3];

检查长度

if(Size==0)return0;

准备从机地址

a[0]=(SlaveAddr<<1);

检查子地址模式

if(SubMod>2)SubMod=2;

确定子地址

switch(SubMod)

{

case0:

break;

case1:

a[1]=(char)(SubAddr);

break;

case2:

a[1]=(char)(SubAddr>>8);

a[2]=(char)(SubAddr);

break;

default:

break;

}

发送从机地址,接着发送子地址(如果有子地址的话)

SubMod++;

I2C_Start();

for(i=0;i

{

I2C_Write(a[i]);

if(I2C_GetAck())

{

I2C_Stop();

return1;

}

}

发送数据

do

{

I2C_Write(*dat++);

if(I2C_GetAck())break;

}while(--Size!

=0);

发送完毕,停止I2C总线,并返回结果

I2C_Stop();

if(Size==0)

{

return0;

}

else

{

return1;

}

}

*函数:

I2C_Gets()

功能:

I2C总线综合接收函数,从从机接收多个字节的数据

参数:

SlaveAddr:

从机地址(7位纯地址,不含读写位)

SubAddr:

从机的子地址

SubMod:

子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址

*dat:

保存接收到的数据

Size:

数据的字节数

返回:

0:

接收成功

1:

在接收过程中出现异常

说明:

本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址

当从机没有子地址时,参数SubAddr任意,而SubMod应当为0

*bitI2C_Gets

unsignedcharSlaveAddr,

unsignedintSubAddr,

unsignedcharSubMod,

char*dat,

unsignedintSize

{

定义临时变量

unsignedchari;

chara[3];

检查长度

if(Size==0)return0;

准备从机地址

a[0]=(SlaveAddr<<1);

检查子地址模式

if(SubMod>2)SubMod=2;

如果是有子地址的从机,则要先发送从机地址和子地址

if(SubMod!

=0)

{

确定子地址

if(SubMod==1)

{

a[1]=(char)(SubAddr);

}

else

{

a[1]=(char)(SubAddr>>8);

a[2]=(char)(SubAddr);

}

发送从机地址,接着发送子地址

SubMod++;

I2C_Start();

for(i=0;i

{

I2C_Write(a[i]);

if(I2C_GetAck())

{

I2C_Stop();

return1;

}

}

}

这里的I2C_Start()对于有子地址的从机是重复起始状态

对于无子地址的从机则是正常的起始状态

I2C_Start();

发送从机地址

I2C_Write(a[0]+1);

if(I2C_GetAck())

{

I2C_Stop();

return1;

}

接收数据

for(;;)

{

*dat++=I2C_Read();

if(--Size==0)

{

I2C_PutAck

(1);

break;

}

I2C_PutAck(0);

}

接收完毕,停止I2C总线,并返回结果

I2C_Stop();

return0;

}

#include

volatilebitFlagINT=0;

sbitLCD_RS=P2^4;寄存器选择输入

sbitLCD_RW=P2^5;液晶读写控制

sbitLCD_EN=P2^6;

ucharIRDIS[2];

ucharIRCOM[4];

voiddelay0(ucharx);x*0.14MS

voiddataconv();

voidlcd_pos(ucharX,ucharY);

uchari=100;

unsignedcharKeyValue;

unsignedcharRepeatCnt;

unsignedcharFnKeyValue;

ucharflat;

uintA1

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

当前位置:首页 > 法律文书 > 调解书

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

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