以下是一个使用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上显示一些字符。你可以根据自己的需求修改和扩展该程序。请确保正确连接好硬件设备,并根据需要调整引脚定义和延时时间。
发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/135541.html