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

相关推荐

  • 樟树阿里云企业邮箱代理商:阿里云盘如何设置密码

    阿里云企业邮箱代理商:阿里云盘如何设置密码 阿里云是一家致力于为企业提供云计算服务的公司,旗下拥有阿里云企业邮箱和阿里云企业邮箱代理商,其中阿里云盘作为一款优秀的在线存储工具备受用户青睐。在使用阿里云盘的过程中,如何设置密码来保护自己的文件安全呢?下面就为大家介绍。 阿里云盘如何设置密码 阿里云盘提供了多种方式来保护数据安全,其中就包括设置密码。具体设置步骤…

    2024年2月28日
    45400
  • 阿里云边缘计算案例

    边缘计算和云计算有什么关系和区别? 如果把云计算比作整个计算机智能系统的大脑。那么边缘计算就是这个系统的眼睛耳朵和手脚。核心服务器让智能系统具有很强的人工智能,但是如果这个人工智能是聋子瞎子,它也发挥不了太大的作用。大数据应用中常常面对的一个痛点,就是没有采集到合适的数据。边缘计算可以为核心服务器的大数据算法提供最准确,最及时的数据来源。边缘计算和云计算的结…

    2023年8月27日
    54200
  • 租用阿里云服务器多少钱

    阿里云的服务器价格根据不同的配置和使用情况有所不同。以下是一些常见的阿里云服务器实例的价格范例: 弹性计算ECS实例: 入门级ECS实例价格从每月10元开始,具体价格取决于配置和地域。 一般而言,性能、配置越高,价格也会相应增加。 云服务器ECS: 入门级ECS实例价格通常在每月100元左右,具体价格也有所不同。 GPU云服务器: GPU云服务器的价格相对较…

    2023年10月7日
    52900
  • 珠海阿里云代理商:ASP数据岛操作类

    ASP数据岛操作类是一种用于在ASP(Active Server Pages)网页中操作数据岛(Data Island)的类。数据岛是指在网页中嵌入的一段XML或JSON格式的数据,可以用于存储和传递数据。 通过ASP数据岛操作类,可以方便地对数据岛进行增删改查操作,以及数据的转换和处理。常见的操作包括: 创建数据岛:可以通过ASP数据岛操作类创建一个新的数…

    2024年1月19日
    51800
  • 威海阿里云代理商:android pos串口通信

    Android POS机通过串口通信可以与其他设备进行数据传输和交互。以下是实现步骤: Android设备需要有串口驱动程序和串口通信库。可以通过安装对应的驱动程序和库来实现。 在Android应用程序中可以使用Java的串口通信类库(如RXTX)或Android的串口通信API来实现串口通信。 首先打开串口,设置串口参数(波特率、数据位、停止位等),然后发…

    2024年3月8日
    49300

发表回复

登录后才能评论

联系我们

4000-747-360

在线咨询: QQ交谈

邮件:ixuntao@qq.com

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

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