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

相关推荐

  • 阿里云服务器主动退货

    如果您购买的阿里云服务器存在质量问题或者您需要取消订单,可以通过以下步骤进行退货: 登录阿里云官网,进入控制台。 在控制台页面上方导航栏找到“订单管理”选项,点击进入。 在订单管理页面,找到需要退货的订单,点击“退货”按钮。 在弹出的退货申请表格中填写退货原因和退货数量等相关信息。 提交退货申请后,阿里云客服会与您联系,确认退货事宜,并提供具体的退货流程和地…

    2023年9月13日
    62200
  • 昆明阿里云代理商:asp.net 网站图标

    ASP.NET网站图标是指在浏览器标签页、书签栏或网站快捷方式上显示的图标,也称为favicon(网站图标)或shortcut icon(快捷方式图标)。 要为ASP.NET网站添加图标,可以按照以下步骤进行操作: 准备一个带有透明背景的图标文件,通常使用.ico格式的图标文件(推荐尺寸为16×16像素或32×32像素)。 将图标文件保存…

    2024年2月3日
    62800
  • 兰州阿里云代理商:android fragment activity 通信

    在Android中,Fragment和Activity之间的通信有多种方式: 使用接口(Interface): 在Fragment中定义一个接口,包含需要与Activity通信的方法。 在Activity中实现这个接口,并在实现方法中处理Fragment发出的通信请求。 在Fragment中获取Activity实例,并调用接口方法实现通信。 使用广播(Bro…

    2024年2月13日
    63800
  • 台州阿里云代理商:android开发证书

    生成流程 下载Java开发工具包JDK,安装并配置环境变量; 下载Android SDK,安装并配置环境变量; 在终端中输入如下命令,生成一个新的keystore文件: keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 204…

    2024年3月8日
    71200
  • 阿里云给的服务器怎么连网

    阿里云给的服务器连接互联网的方式主要有以下几种: 使用公网IP:阿里云服务器会分配一个公网IP地址,可以直接通过该IP地址连接互联网。在服务器中设置网络配置文件,确保网络适配器启用并配置正确的IP地址、子网掩码、网关等参数。 配置安全组规则:在阿里云管理控制台的安全组配置中,设置某些端口或协议允许通过,以便允许特定的网络流量进入服务器。 使用阿里云提供的NA…

    2023年9月14日
    64600

发表回复

登录后才能评论

联系我们

4000-747-360

在线咨询: QQ交谈

邮件:ixuntao@qq.com

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

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