基于89c51的8led显示串口通信机设计文档格式.docx

上传人:b****3 文档编号:7389451 上传时间:2023-05-08 格式:DOCX 页数:32 大小:295.57KB
下载 相关 举报
基于89c51的8led显示串口通信机设计文档格式.docx_第1页
第1页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第2页
第2页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第3页
第3页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第4页
第4页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第5页
第5页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第6页
第6页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第7页
第7页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第8页
第8页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第9页
第9页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第10页
第10页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第11页
第11页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第12页
第12页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第13页
第13页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第14页
第14页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第15页
第15页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第16页
第16页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第17页
第17页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第18页
第18页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第19页
第19页 / 共32页
基于89c51的8led显示串口通信机设计文档格式.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于89c51的8led显示串口通信机设计文档格式.docx

《基于89c51的8led显示串口通信机设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于89c51的8led显示串口通信机设计文档格式.docx(32页珍藏版)》请在冰点文库上搜索。

基于89c51的8led显示串口通信机设计文档格式.docx

第三步:

将新创建的.c文件添加到Target1中,如图2-3。

图2-3

这样我们就可以在keil4的环境下对单片机的程序进行编译和运行了。

2.51单片机AT89C51

51单片机是对目前所有兼容Intel8031指令系统的单片机的统称。

该系列单片机的始祖是Intel的8031单片机,后来随着Flashrom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。

目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。

51单片机是基础入门的一个单片机,还是应用最广泛的一种。

需要注意的是52系列的单片机一般不具备自编程能力。

当前常用的51系列单片机主要产品有:

*Intel的:

80C31、80C51、87C51,80C32、80C52、87C52等;

*ATMEL的:

89C51、89C52、89C2051等;

89C51单片机的内部结构为:

  单一+5V电源供电;

  CPU:

由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;

  RAM:

用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;

  ROM:

用以存放程序、一些原始数据和表格;

  I/O口:

四个8位并行I/O口,既可用作输入,也可用作输出;

  T/C:

两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;

  五个中断源的中断控制系统;

  一对全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;

  片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。

最高振荡频率为12M。

3.RS-232电平转换芯片MAX232

第一部分是电荷泵电路。

由1、2、3、4、5、6脚和4只电容构成。

功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。

第二部分是数据转换通道。

由7、8、9、10、11、12、13、14脚构成两个数据通道。

其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。

8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。

TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;

DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。

第三部分是供电。

15脚GND、16脚VCC(+5v)。

完成连接之后的电路图如图2-4所示。

图2-4

11和12口分别连接51单片机的RxD(P3.0)、TxD(P3.1)。

4.三态输出的8D透明锁存器74HC373

74HC373的输出端Q0~Q7可直接与总线相连。

当三态允许控制端OE为低电平时,Q0~Q7为正常逻辑状态,可用来驱动负载或总线。

当OE为高电平时,Q0~Q7呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。

当锁存允许端LE为高电平时,Q随数据D而变。

当LE为低电平时,Q被锁存在已建立的数据电平。

5.二线制I2CCMOS串行EEPROM24C08

6.8255引脚以及功能。

采用8255A扩展并行I/O口

一、8255A的内部结构

》三口、两組概念

》与外设接口的引脚:

最多可以接3个外设

》与三总线接U的引脚:

1)与CB接口的脚:

RD.WR.RESETS

2)与AB接口的脚:

来0时选屮本片,然后A1A0选中的寄存器

00PA

11PB

00PC

11控制口

3)与DB接U的脚

7.LED液晶显示器件7seg-mpx8-ca

7SEG-MPX8-CA八个共阳二极管显示器12345678是阳公共端

图三LED液晶显示器件7seg-mpx8-ca

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。

(1)静态显示驱动:

静态驱动也称直流驱动。

静态驱动是指每个数码管的每一个段码都有个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。

静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5*8=40跟I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个,实际应用时需要增加译码驱动进行驱动,增加了硬件电路的复杂性。

(2)动态显示驱动:

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的八个显示比划“a,b,c,d,e,f,g,h”的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立I/O线控制,当单片机输出字形码时,所有数码管都接受到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通恐慌只打开,该位就显示出字形,没有选通的数码管就不会亮。

通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动,在轮流显示过程中,每位数码管的点亮时间为1—2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就使一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

第三部分实验原理图及程序代码

1.硬件部分电路设计

电路图如图:

2.软件部分设计

这部分的程序如下:

#include<

reg51.h>

stdio.h>

absacc.h>

string.h>

#defineucharunsignedchar

#defineuintunsignedint

#definepaXBYTE[0x0001]//定义8155口地址

#definepbXBYTE[0x0002]

#definecontrol8155XBYTE[0x0000]

sbitSCK=P1^0;

sbitSDA=P1^1;

sbitE=P3^7;

sbitSEND=P3^1;

sbitREV=P3^0;

sbitK1=P3^2;

sbitK2=P3^3;

sbitK3=P2^3;

uchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//0123456789存码表

ucharpos[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//位选,选中数码管

dataunsignedcharstr1[16]={"

Starting...."

};

dataunsignedcharstr2[16]={"

Recieved:

"

dataunsignedcharsend[16]={"

testnumber"

uchartemp;

inti;

voiddelay(unsignedintt)

{

unsignedinti,j;

for(i=0;

i<

t;

i++)

for(j=0;

j<

10;

j++)

;

}

voiddelayXus(ucharx)//微秒延时

while(--x);

voiddelayXms(ucharx)//毫秒延时

uchari;

while(x--)

{

for(i=250;

i>

0;

i--)

}

}

voidstart()

SDA=1;

delay(3);

SCK=1;

SDA=0;

SCK=0;

voidstop()

voidU4_init()

voidresponds()

i=0;

while(SDA==1&

&

250)

i++;

voidwrite_dat(uchardat)//写一个字节

uchari,temp;

temp=dat;

8;

temp=temp<

<

1;

SDA=CY;

delay(50);

voidwrite(ucharadd,uchardat)//写一个字节dat到地址add

start();

write_dat(0xa0);

responds();

write_dat(add);

write_dat(dat);

stop();

ucharread_dat()//读一个字节

uchara,r,temp;

//接收前记得释放数据线,即拉高sda。

for(a=0;

a<

a++)//循环八次以此接收一字节数据

SCK=1;

//sck置高,使接收数据稳定。

delay(3);

r=r<

//接收数据处理,存入i2c_r变量中。

temp=SDA;

r=r|temp;

SCK=0;

//sck置低,准备接受下个数据位。

returnr;

ucharread(ucharadd)//从地址add中读取一个字节

uchardat;

write_dat(0xa1);

dat=read_dat();

delayXus

(2);

returndat;

voidwritedata()

{uchari;

ucharstr[8]={0xf9,0xa4,0xb0,0xc0,0xf9,0xa4,0xb0,0xc0};

for(i=0;

write(i,str[i]);

}

str[0]=0xa4;

str[1]=0xb0;

str[2]=0x99;

str[3]=0xf9;

str[4]=0xa4;

str[5]=0xb0;

str[6]=0x99;

str[7]=0xf9;

for(i=8;

16;

write(i,str[i-8]);

str[0]=0x4f;

str[1]=0x5b;

str[2]=0x4f;

str[3]=0x66;

str[4]=0x66;

str[5]=0x4f;

str[6]=0x5b;

str[7]=0x06;

for(i=16;

24;

write(i,str[i-16]);

str[0]=0x99;

str[1]=0x92;

str[2]=0x82;

str[3]=0xb0;

str[4]=0x99;

str[5]=0x92;

str[6]=0x82;

str[7]=0xb0;

for(i=24;

32;

write(i,str[i-24]);

str[0]=0x92;

str[1]=0x82;

str[2]=0xf8;

str[3]=0x99;

str[4]=0x92;

str[5]=0x82;

str[6]=0xf8;

str[7]=0x99;

for(i=32;

40;

write(i,str[i-32]);

str[0]=0x82;

str[1]=0xf8;

str[2]=0x80;

str[3]=0x92;

str[4]=0x82;

str[5]=0xf8;

str[6]=0x80;

str[7]=0x92;

for(i=40;

48;

write(i,str[i-40]);

str[0]=0xf8;

str[1]=0x80;

str[2]=0x90;

str[3]=0x82;

str[4]=0xf8;

str[5]=0x80;

str[6]=0x90;

str[7]=0x82;

for(i=48;

56;

write(i,str[i-48]);

str[0]=0x80;

str[1]=0x90;

str[2]=0xc0;

str[3]=0xf8;

str[4]=0x80;

str[5]=0x90;

str[6]=0xc0;

str[7]=0xf8;

for(i=56;

64;

write(i,str[i-56]);

str[0]=0x90;

str[1]=0xc0;

str[2]=0x88;

str[3]=0x80;

str[4]=0x90;

str[5]=0xc0;

str[6]=0x88;

str[7]=0x80;

for(i=64;

72;

write(i,str[i-64]);

str[0]=0xc0;

str[1]=0x88;

str[2]=0x83;

str[3]=0x90;

str[4]=0xc0;

str[5]=0x88;

str[6]=0x83;

str[7]=0x90;

for(i=72;

80;

write(i,str[i-72]);

voidsend_char(uchartemp1)

{SBUF=temp1;

while(!

TI);

TI=0;

voidMAX232_init()

TMOD=0x20;

TH1=252;

TL1=252;

TR1=1;

PCON=0x80;

SCON=0x50;

voidmain()

inti,j,set;

charb,t;

ucharword[16],recv[8];

U4_init();

writedata();

delay(50);

set=0;

while

(1)

control8155=0x03;

pa=pos[i];

pb=0x88;

//pb=send[i];

delay(5);

while(K2)

K1)

if(!

K2)

break;

while(K1)

delay(30);

set++;

if(set>

10)

MAX232_init();

K2);

switch(set)

case1:

send[i]=read(i);

send_char(send[i]);

delay(50);

if(RI==1)

{RI=0;

temp=SBUF;

recv[i]=temp;

}

delay(100);

while(K3)//show

pb=send[i];

delay(5);

delay(5);

K3);

pa=0x00;

pb=0xff;

break;

case2:

for(i=8;

send[i-8]=read(i);

case3:

for(i=16;

send[i-16]=read(i);

case4:

send[i-24]=read(i);

case5:

for(i=32;

send[i-32]=read(i);

case6:

send[i-40]=read(i);

case7:

for(i=48;

send[i-48]=read(i);

case8:

send[i-56]=read(i);

case9:

for(i=64

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2