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

相关推荐

  • 南昌阿里云代理商:android拦截发送短信

    作为南昌阿里云代理商,您可以使用Android平台提供的一些权限和功能来拦截发送短信。以下是一种可能的实现方式: 首先,在AndroidManifest.xml文件中添加以下权限: <uses-permission android:name="android.permission.SEND_SMS"/> 创建一个Broadca…

    2024年2月25日
    32300
  • 阿里云企业邮箱:何时该启用邮件审批流程?

    阿里云企业邮箱:何时该启用邮件审批流程? 一、邮件审批流程的核心作用 邮件审批流程是企业内部邮件管理的重要机制,通过预设规则对特定邮件的发送或内容进行审核,确保信息的合规性和安全性。阿里云企业邮箱的审批功能能够有效避免以下风险: 敏感信息泄露:如财务数据、客户隐私等关键内容外发前需经上级确认; 误操作或草率决策:员工匆忙发送的邮件可能包含错误或未经核实的信息…

    2025年7月10日
    13900
  • 阿里云企业邮箱:怎么用阿里云企业邮箱防止邮件被归类为垃圾邮件?

    阿里云企业邮箱:怎么用阿里云企业邮箱防止邮件被归类为垃圾邮件? 一、垃圾邮件问题的根源与影响 邮件被归类为垃圾邮件通常由以下原因导致:内容触发关键词过滤、发送频率异常、发件人信誉度低,或缺少合法的反垃圾邮件认证(如SPF、DKIM、DMARC)。这不仅影响企业沟通效率,还可能损害品牌信誉。 二、阿里云企业邮箱的核心防垃圾机制 1. 智能反垃圾引擎 阿里云企业…

    2025年8月12日
    13500
  • 阿里云和云计算的区别

    平安云,阿里云,腾讯云在云计算行业中有什么区别 每个公司都有自己的特点,平安云擅长金融,医疗,保险行业,云计算产品比较便宜,特别是金融云服务。阿里云是什么行业都做,产品比较多,优势应该是机房比较多。速度比较快,但是因为客户多,所以后期服务跟不上。腾讯云擅长游戏,直播行业,技术开发团队外包比较多,项目多为外包完成。 云技术与云计算的区别 云技术是指实现云计算的…

    2023年8月26日
    29200
  • 阿里云仓库docker

    阿里云docker镜像库免费吗 目前容器镜像服务处于公测期间,免让利或东轮九转输项校满费提供镜像托管、压茶承兴镜像构建服务以及镜像加速器服务,请放心使用。 来自官方计费说明。如需观末补市手南话查询请在阿里云>容器镜像服务>计费说明 查询 阿里云docker hub多少钱 目前国内访问docker hub非常便秘,来自使用docker m360问答…

    2023年8月26日
    31700

发表回复

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

联系我们

4000-747-360

在线咨询: QQ交谈

邮件:ixuntao@qq.com

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

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