东营阿里云代理商: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

Like (0)
luotuoemo的头像luotuoemo
Previous 2024年2月1日 23:13
Next 2024年2月1日 23:22

相关推荐

  • 南宁阿里云代理商:阿里通信短信验证平台

    阿里通信短信验证平台是由阿里云提供的一种短信验证服务,可以用于用户注册、登录等场景的手机验证。南宁阿里云代理商是指在南宁地区代理阿里云产品和服务的公司或个人。 作为阿里云代理商,南宁地区的代理商可以提供阿里通信短信验证平台的相关服务,包括账号注册、短信模板创建、短信发送和统计等功能。代理商可以根据客户的需求,帮助客户使用阿里通信短信验证平台,提供技术支持和咨…

    2023年12月18日
    7200
  • 阿里云客服报名渠道

    您可以通过如下渠道报名阿里云客服岗位: 阿里巴巴官方招聘网站:您可以在阿里巴巴官方招聘网站上搜索并申请相关职位,填写在线申请表格。链接:https://job.alibaba.com/zhaopin/positionList.htm 招聘网站:您可以在其他招聘网站上搜索并申请相关职位,常见的招聘网站如智联招聘、前程无忧、拉勾网等。 校园招聘:阿里巴巴会定期参…

    2023年10月23日
    10900
  • 阿里云轻量应用服务器怎么开端口连接

    阿里云服务器怎么设置8080端口 是服务器上开的某个服务换到8080端口还是阿里云安全组开放8080端口?前者的话建议你搜索对应软件名字+改到8080端口看看别人是怎么改的。后者的话可以进入阿里云官网-控制台-云服务器-安全组-找到对应服务器包含的安全组-配置-公网出方向+公网入方向 那里按照提示设置。 阿里云ubuntu怎么开启服务器端口 配置SSL证书确…

    2023年8月26日
    8900
  • 宜昌阿里云代理商:阿里云 gif调整大小

    对不起,你的问题似乎并不清晰。你想要的是找寻宜昌的阿里云代理商,还是需要调整gif的大小?如果是后者,你不需要一个代理商来做这件事,你可以使用一些常见的图像编辑工具或者在线服务来自主操作。 如果你是在寻找宜昌的阿里云代理商,可能需要亲自搜索或联系阿里云的客户服务来获取更准确的信息。 如果你需要调整GIF的大小,以下是简单的步骤: 打开你的图像编辑软件(如Ph…

    2024年3月17日
    6500
  • 茂名阿里云代理商:安卓蓝牙短信软件

    茂名阿里云代理商:安卓蓝牙短信软件 优势1:可靠稳定的云服务 阿里云作为全球领先的云计算服务提供商,以其可靠稳定的云服务享誉业界。作为茂名阿里云代理商,我们推荐安卓蓝牙短信软件结合阿里云的优势,为用户提供更加可靠的使用体验。 优势2:高效的数据传输 安卓蓝牙短信软件利用蓝牙技术,实现了手机与电脑之间的无线数据传输。而结合阿里云的高效网络传输能力,用户可以在不…

    2024年1月8日
    7500

发表回复

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

联系我们

4000-747-360

在线咨询: QQ交谈

邮件:ixuntao@qq.com

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

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