最近在玩《51单片机工程应用实例》小组的FM实验板,昨天收到快递,少了3个74LS164,不过不要紧,星期六去华强北买几片回来,先焊好板子再说。今天刚焊好板子,顺便写了个LED测试程序试试板子的功能,由于只有一片74LS164,只有一个LED会亮,说明程序基本正常了。
可能是2051的I/O口比较少和基于成本的考虑,唐工的这块板子使用了串口+4片74LS164扩展I/O口静态显示4个LED。这种用法串口工作在方式0,即同步移位寄存器输出方式。
在工作方式0下,8位串行数据是从RXD 输入或输出,TXD 是用来输出同步脉冲的. 当串行端口作为输出时,向SBUF写入一字节数据便启动了串行发送.串行端口从RXD引脚上将SBUF中的8位数据(低位在前)以fosc/12的波特率逐位输出,TXD则以fosc/12为频率输出同步移位脉冲.发送过程中,要保持TI为低电平,数据发送完后,TI自动置1.如果再发送数据,必须用软件将TI清零。
当串行端口作为输入时,REN=1,RI为低电平,RXD为数据输入端,TXD同串口作为输出时一样,仍以fosc/12为频率输出同步移位脉冲,使外部数据逐位移入RXD(低位在前),当接收到8位数据后,RI自动置1.如果要再接收,必须用软件将RI清零,同串口作为输出时的TI类似。
以下给出我的测试程序,可能有错,仅供参考。
/******************************************
* Copyright (c) 2008
* All rights reserved.
*
* 文件名称:FM_dis_test.c
* 摘 要:EDNChina FM实验板套件LED显示测试程序
*
*
* 当前版本:V1.11
* 作 者:acbear
* 时 间:2008-10-14
********************************************/
#include <reg51.h>
#include <string.h>
unsigned char code led_7[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //0..9,数码管段码表
unsigned char dis_buff[4]={2,0,0,8}; //四位LED显示缓冲区,这里没有用到
/*延时函数*/
//大约1ms
delay(unsigned int ms)
{
unsigned int i,j;
for(i=0;i<110;i++)
for(j=0;j<ms;j++) ;
}
/*串口发送字节函数*/
//调用函数前串口必须初始化为工作方式0,即SCON = 0x00
void uart_send_byte(unsigned char dat)
{
SBUF = dat;
while(TI == 0); //循环等待
TI = 0;
}
void display_4led(void)
{
unsigned char i;
for(i=0;i<4;i++)
{
uart_send_byte(led_7[dis_buff]);
delay(10);
}
}
void main(void)
{
unsigned char i="0";
SCON = 0x00; //串口初始化,工作方式0, 同步移位寄存器输出方式
while(1)
{
display_4led();
delay(2000);
}
}
===========================
10月14日更新
下面是在实验板上运行的照片(手机拍的不是很清晰)
用户239234 2009-12-2 16:32
用户197005 2008-12-27 08:50
用户1121609 2008-10-17 16:48
用户152563 2008-10-14 22:43
用户532871 2008-9-26 09:00
用户1630661 2008-9-23 22:14
用户1630661 2008-9-23 22:13