单片机总结——双机通信(1)

2015年11月03日

  • 总结分为两个部分。
    第一部分: 说明实现功能,入口地址和初始化的设定。
    第二部分:主函数和子函数说明,以及调试过程中的问题。
    此为第一部分。
  • 实现功能: 主机:开机显示8.8.8.8.并打印->显示电压->传送给从机。
    从机:显示电压,按下S3打印。
  • 最终只实现以下功能:主机显示电压,传送给从机,主机按下S3(不只S3)打印,从机显示电压(不稳定)
    点击下载完整程序

用到的芯片和入口地址的设定

8279(键盘/显示)芯片:

#define COMD_8279 XBYTE[0x3fff]
#define DAT_8279 XBYTE[0x3ffe]

0x3fff为8279的命令口地址,由8279的A0口和CS共同决定的(CS=0,A0=1为命令口地址;CS=0,A0=0为数据口地址),与设置无关位全部置1。由电路图可知,单片机 的P07~P00应赋11111111,单片机的P27~P20应赋00111111。0x3ffe为8279的数据地址,由电路图可知,单片机的P07~P00应赋11111110,单片机的P27~P20应赋00111111。

Alt text
图1.8279的CS与单片机的连线

Alt text
图2.8279的A0与单片机的连线

用途:可通过命令口地址给8279传送控制命令,通过数据口地址给8279传送数据

8255(I/O扩展)芯片:

#define PRINT_COMD XBYTE[0x1fff]
#define PRINT_PA XBYTE[0x1ffc]

在电路图中,I/O口扩展芯片是用来接打印机的,PRINTCOM是用于选通8255芯片, 8255的选通是由CS决定,由电路图知,单片机的P27~P20应赋00011111,P07~P00应赋11111111。PRINTPA用于选通打印机(8255芯片的A地址),此时8255也应当选中。由电路图知,8255的A0与A1是用来选择地址的,因此单片机的P27~P20应赋00011111,P07~P00应赋11111100。

Alt text

ADC0809(A/D转换)芯片

#define ADC_0809_1 XBYTE[0x9ff8]

这个最为费解,不确定想法是否正确。由电路图知,ADC0809是否工作由OAE决定,当OAE为高电平时,输出转换得出的数据。OAE在图中由74HC04(六反相器)的OAE1决定,而OAE1由图中74HC32(或门)的CS5决定,因此单片机的P27~P20应赋10011111。此外,ADC0809是在IN-0(通道0)接可调电位器来获得模拟值(连续可调的电压),IN-0是由ADC0809的ADD-C,ADD-B,ADD-A决定的, 对应于单片机的A0,A1,A2,因此单片机的P07~P00应赋11111000。

Alt text
图3.ADC0809与74HC32

Alt text
图4.74HC04

芯片的初始化

8279的初始化

    COMD_8279=0xd1;//总清除命令
        delay1(4);//延时,保证清除完毕
    COMD_8279=0x00;
    /*8字符显示,左端入口方式,编码(指经过译码器后输出)扫描键盘,双键锁定(保证只有一个键按下)*/
    COMD_8279=0x34;//时钟编程命令,用来设置分频系数,20分频

说明:8279的命令字和格式。8279的命令和数据由八位决定,如下图

Alt text

总清除命令:D7D6D5=110,其余无关位置1

Alt text
图5.8279命令特征表

键盘/显示初始化: 由8279的命令特征表得D7D6D5=000,由显示方式表得D4D3为00,由键盘扫描方式表得D2D1D0=000(注:译码扫描是指直接输出,而编码扫描则是接译码器后输出)。

Alt text
图6.8279命令特征表

Alt text
图7.8279键盘扫描方式表

设置分频系数: 由图1(8279与单片机的连线)知,ALE直接接在8951的ALE上,8951这里用的晶振为11.0592M,ALE约为其六分频,而8279需要的时钟频率为100K,因此还需进行20分频。 由图6(8279的命令特征表)得D7D6D5=001,D4~D0用来设置分频系数,20分频时D4D3D2D1D0=10100

主机串口初始化

    TMOD=0x20;//设置定时器T1为工作方式2
    TL1=0xe6;//初值的计算:X=2^8-2^SMOD*f/(384*波特率),这里算出波特率为2400
    TH1=0xe6;
    PCON=0x00;//设置SMOD的值为0
    SCON=0x50;//设置串口为工作方式1,REN=1,允许接收

定时器设置: 定时器与串口的关系暂时未明。
TMOD的设置如下图

Alt text

PCON的设置如下图。这里只用到了SMOD,且SMOD设置为0(即串口工作方式的波特率不加倍)

Alt text

SCON的设置如下图

Alt text
这里串口工作于方式1,REN(串口接收允许位)设为1,TI与RI设置为0。(只有当TI与RI分别为0时,串口才会发送或者接收数据,且串口发送或者接收数据后,TI与RI置1,必须软件清零,否则将无法发送或者接收数据)。

中断和定时器的开启

    TCON=0x41;//INT0为负边缘触发,启动定时器1
    IE=0x95;//允许INT0,INT1中断

TCON的设置如下图

Alt text
TF1=1,开启定时器T1。IT0则为设置INT0的触发方式

IE的设置如下图所示
Alt text

EA=1开启总中断,ES=1开启串口中断,ES=1开启外部中断1,EX0=1开启外部中断0

8255芯片的设置

    PRINT_COMD = 0x80;

如下图所示,使8255工作于方式0,这时A,B,C口全部可以当成数据通道输入或输出,适合同步或无条件的数据传输。

Alt text