东营阿里云代理商:at89c2051 串口通信程序

以下是一个使用AT89C2051芯片进行串口通信的程序示例:


#include<reg52.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit sda = P3^4; //定义I2C数据线
sbit scl = P3^3; //定义I2C时钟线

sbit Txd = P3^1; //定义串口发送引脚
sbit Rxd = P3^0; //定义串口接收引脚

void delay(uint x) //延时函数
{
    while(x--);
}

void delay_us(uint x) //微秒级延时函数
{
  while(x--);
}

void delay_ms(uint x) //毫秒级延时函数
{
    uint i;
    for(i=0;i<x;i++)
    {
        delay(1000);
    }
}

/***************** I2C总线函数 ****************/

void I2C_start() //I2C起始信号
{
    sda = 1;
    scl = 1;
    delay_us(5);
    sda = 0;
    delay_us(5);
    scl = 0;
}

void I2C_stop() //I2C停止信号
{
    sda = 0;
    scl = 1;
    delay_us(5);
    sda = 1;
    delay_us(5);
}

void I2C_sendbyte(uchar dat) //I2C发送一个字节数据
{
    uchar i;
    for(i=0; i<8; i++)
    {
        if(dat & 0x80)
            sda = 1;
        else
            sda = 0;
        scl = 1;
        delay_us(5);
        scl = 0;
        dat <<= 1;
        delay_us(5);
    }
}

uchar I2C_receivebyte() //I2C接收一个字节数据
{
    uchar i, dat;
    sda = 1;
    for(i=0; i<8; i++)
    {
        scl = 0;
        delay_us(5);
        scl = 1;
        dat <<= 1;
        if(sda)
            dat |= 0x01;
        delay_us(5);
    }
    return dat;
}

uchar I2C_waitack() //I2C等待应答信号
{
    uchar ack;
    scl = 1;
    delay_us(5);
    ack = sda;
    scl = 0;
    delay_us(5);
    return ack;
}

void I2C_ack()  //I2C产生应答信号
{
    sda = 0;
    scl = 1;
    delay_us(5);
    scl = 0;
    delay_us(5);
}

void I2C_nack()  //I2C产生非应答信号
{
    sda = 1;
    scl = 1;
    delay_us(5);
    scl = 0;
    delay_us(5);
}

/***************** 串口函数 ****************/

void UART_sendbyte(uchar dat)  //串口发送一个字节数据
{
    uchar i;
    Txd = 0;
    for(i=0; i<8; i++)
    {
        _nop_();
        _nop_();
        Txd = dat>>i & 0x01;
        delay_us(5);
        Txd = 1;
    }
    _nop_();
    _nop_();
    _nop_();
    Txd = 1;
}

uchar UART_receivebyte() //串口接收一个字节数据
{
    uchar i, dat;
    while(Rxd==1);
    delay_us(600);
    for(i=0; i<8; i++)
    {
        dat >>= 1;
        if(Rxd==1)
            dat |= 0x80;
        delay_us(600);
    }
    return dat;
}

/***************** 主程序 ****************/

void main()
{
    uchar i, receiveData;
    I2C_start(); //启动I2C总线
    I2C_sendbyte(0xa0); //发送写地址
    I2C_sendbyte(0x00); //发送数据地址
    I2C_sendbyte(0x01); //发送数据
    I2C_stop(); //停止I2C总线
    while(1)
    {
        if(Txd==1) //检测是否发送
        {
            delay_ms(100); //延时100ms,以便接收完成
            receiveData = UART_receivebyte(); //接收数据
            I2C_start(); //启动I2C总线
            I2C_sendbyte(0xa0); //发送写地址
            I2C_sendbyte(0x00); //发送数据地址
            I2C_sendbyte(receiveData); //发送数据
            I2C_stop(); //停止I2C总线
        }
        
        I2C_start(); //启动I2C总线
        I2C_sendbyte(0xa0); //发送写地址
        I2C_sendbyte(0x01); //发送数据地址
        I2C_stop(); //停止I2C总线
        delay_ms(50); //延时50ms
        I2C_start(); //启动I2C总线
        I2C_sendbyte(0xa1); //发送读地址
        receiveData = I2C_receivebyte(); //读取数据
        I2C_nack(); //产生非应答信号
        I2C_stop(); //停止I2C总线
        
        if(receiveData != 0xff) //判断接收到的数据是否有效
        {
            UART_sendbyte(receiveData); //发送数据
        }
        
        delay_ms(200); //延时200ms
    }
}

下面是at89c2051的串口通信程序示例:

#include <regx52.h>  // 引入89c2051头文件

sbit RS=P1^0;     // 串口接收引脚
sbit RW=P1^1;     // 串口发送引脚
sbit EN=P1^2;     // 使能引脚

void delay(unsigned int i) // 自定义延时函数
{
    unsigned int j,k;
    for(j=i;j>0;j--)
        for(k=110;k>0;k--);
}

void lcd_cmd(unsigned char cmd) // 发送指令
{
    RS=0;    // 将RS置为0,表示发送指令
    RW=0;
    P0=cmd;  // 将指令装入P0口
    EN=1;    // 使能信号置为高
    delay(1);  // 延时一段时间
    EN=0;    // 使能信号置为低
}

void lcd_data(unsigned char dat) // 发送数据
{
    RS=1;   // 将RS置为1,表示发送数据
    RW=0;
    P0=dat;  // 将数据装入P0口
    EN=1;   // 使能信号置为高
    delay(1); // 延时一段时间
    EN=0;   // 使能信号置为低
}

void lcd_init() // LCD初始化
{
    lcd_cmd(0x38);    // 设置16*2显示,5*7点阵,8位数据接口模式
    lcd_cmd(0x06);    // 指针自动右移,字符不动
    lcd_cmd(0x0c);    // 开显示,光标不显示
    lcd_cmd(0x01);    // 清屏
    lcd_cmd(0x80);    // 设置显示位置为第一行
}

void main()
{
    lcd_init();   // 初始化LCD

    while(1)
    {
        lcd_cmd(0x80);   // 设置显示位置为第一行
        lcd_data('A');   // 显示字符A
        lcd_data('L');   // 显示字符L
        lcd_data('I');   // 显示字符I
        lcd_data('Y');   // 显示字符Y

        lcd_cmd(0xC0);   // 设置显示位置为第二行
        lcd_data('C');   // 显示字符C
        lcd_data('L');   // 显示字符L
        lcd_data('O');   // 显示字符O
        lcd_data('U');   // 显示字符U
        lcd_data('D');   // 显示字符D
    }
}

这个程序使用at89c2051进行串口通信,并在LCD上显示一些字符。你可以根据自己的需求修改和扩展该程序。请确保正确连接好硬件设备,并根据需要调整引脚定义和延时时间。

东营阿里云代理商:at89c2051 串口通信程序

发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/135541.html

(0)
luotuoemo的头像luotuoemo
上一篇 2024年2月1日 23:13
下一篇 2024年2月1日 23:22

相关推荐

  • 阿里云服务器部署iis网站

    下面是在阿里云服务器上部署IIS网站的步骤: 登录到阿里云的控制台,并选择您的服务器实例。 在实例管理页面,找到并点击“远程连接”按钮,以获取远程连接的方式。这通常是通过SSH或远程桌面。 通过远程连接方式登录到您的服务器。 在服务器上打开“服务器管理器”并选择“添加角色和功能”。 在角色和功能安装向导中,选择“基于角色或基于功能的安装”并点击“下一步”。 …

    2023年9月12日
    15100
  • 阿里云轻量应用服务器ping不通

    请先确保以下可能原因不是导致无法ping通的原因: 检查防火墙设置:阿里云轻量应用服务器默认启用了安全组,如果您的服务器配置了安全组,可能需要开放ICMP协议(即ping命令使用的协议)。 检查服务器网络配置:确认服务器的网络配置正确,包括IP地址、子网掩码和网关设置等。 检查网络连接状态:确保服务器已连接到正常的网络,检查网线或Wi-Fi连接是否正常。 检…

    2023年8月17日
    17000
  • 阿里云国际站注册教程:asp 读取数据库图片路径

    要在 ASP 中读取数据库中存储的图片路径,你可以按照以下步骤进行操作: 步骤 1: 连接数据库 首先,确保已经建立了与数据库的连接。这通常涉及到使用 ADO(ActiveX 数据对象)或者 ADO.NET 来连接到你的数据库。以下是一个简单的连接示例(假设你在使用 Classic ASP): <% ' 设置数据库连接字符串 Dim conn…

    2024年7月12日
    19400
  • 上杭阿里云企业邮箱代理商:阿里邮箱密码忘了怎么查看

    阿里云企业邮箱代理商:阿里邮箱密码忘了怎么查看 阿里云企业邮箱是一款专为企业用户提供的高效、安全的电子邮件服务。但有时候我们可能会忘记阿里邮箱的密码,接下来我们将介绍如何通过阿里云企业邮箱代理商来找回密码。 阿里云企业邮箱代理商的优势 1. 提供全方位的技术支持:阿里云企业邮箱代理商拥有丰富的经验和专业知识,可以为用户提供及时、准确的技术支持。无论是密码找回…

    2024年1月26日
    18800
  • 阿里云企业邮箱的邮件批量处理能自定义操作顺序吗?

    阿里云企业邮箱邮件批量处理与自定义操作顺序 阿里云企业邮箱作为国内领先的企业邮箱服务,不仅提供稳定、安全的邮件收发功能,还具有强大的批量邮件处理能力。对于企业用户而言,邮件批量处理功能尤为重要,它不仅能够提高工作效率,还可以根据具体业务需求对邮件进行灵活的自定义操作顺序配置。本文将探讨阿里云企业邮箱如何实现邮件的批量处理、自定义操作顺序的实现方法,以及阿里云…

    2024年10月26日
    10900

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

4000-747-360

在线咨询: QQ交谈

邮件:ixuntao@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
购买阿里云服务器请访问:https://www.4526.cn/