参加电子设计 单片机最小系统实验报告.docx
《参加电子设计 单片机最小系统实验报告.docx》由会员分享,可在线阅读,更多相关《参加电子设计 单片机最小系统实验报告.docx(46页珍藏版)》请在冰豆网上搜索。
参加电子设计单片机最小系统实验报告
(此文档为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_
#includesbitdout=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;
}
#includevolatilebitFlagINT=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