// 在微机上模拟I2C总线的设计中,用并行口的D0(PIN2)模拟SCL信号,用D1(PIN3)模拟SDA信号。根据IIC总线的电平规范,程序如下:
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <bios.h>
#define DELAY_TIME 10
#define FALSE 0
#define TRUE 1
const unsigned char SCL_PIN=0x01;
const unsigned char SDA_OIN=0x02;
static void SET_SCL(void)
{
asm{
mov dx,0x378
in ax,dx
or ax,SCL_PIN //将SCL置1
out dx,ax
}
}
static void CLR_SCL(void)
{
asm{
mov dx,0x378
in ax,dx
or ax,0xff-SCL_PIN //将SCL置0
out dx,ax
}
}
static void SET_SDA(void)
{
asm{
mov dx,0x378
in ax,dx
or ax,SDA_PIN //将SDA置1
out dx,ax
}
}
static void CLR_SDA(void)
{
asm{
mov dx,0x378
in ax,dx
or ax,0xff-SDA_PIN //将SDA置0
out dx,ax
}
}
void DELAY(int t=DELAY_TIME) //延时子程序
{
for(int i=0;i<t;i++);
}
void IIC_Start(void) //启动I2C总线
{
//在SCL为高电平时,使SDA出现一个负跳变
SET_SDA();
SET_SCL();
DELAY();
CLR_SDA();
DELAY();
CLR_SCL();
DELAY();
}
void IIC_Stop(void) //终止I2C总线
{
//在SCL为高电平时,使SDA出现一个正跳变
CLR_SDA();
SET_SCL();
DELAY();
SET_SDA();
DELAY();
CLR_SCL();
DELAY();
}
void SEND_0(void) //发送BIT0
{
//在SCL为高电平时,使SDA保持低电平
CLR_SDA();
SET_SCL();
DELAY();
CLR_SCL();
DELAY();
}
void SEND_1(void) //发送BIT1
{
//在SCL为高电平时,使SDA保持高电平
SET_SDA();
SET_SCL();
DELAY();
CLR_SCL();
DELAY();
}
int Check_Acknowledge(void)
{
//发送完每个字节检查SLAVE的应答信号
SET_SDA(); //主器件释放SDA线
SET_SCL();
DELAY(DELAY_TIME/2);
unsigned char b=inportb(0x378); //采样信号线
DELAY(DELAY_TIME/2);
CLR_SCL();
DELAY();
if(b&0xSDA_PIN) //SALVE返回1
return FLASE;
return TRUE;
}
使用上述代码,你可以在PC上用并行口模拟I2C,进行实验、监控和调试。
PC_TO_IIC.rar_IIC_IIC模拟_PC I_PC i2c_模拟IIC
版权申诉
18 浏览量
2022-09-22
17:31:33
上传
评论
收藏 1KB RAR 举报
我虽横行却不霸道
- 粉丝: 75
- 资源: 1万+
最新资源
- 海尔618算价表_七海5.20_16.00xlsx(1)(2).xlsx
- WebCrawler.scr
- 【计算机专业毕业设计】大学生就业信息管理系统设计源码.zip
- YOLO 数据集:8种路面缺陷病害检测【包含划分好的数据集、类别class文件、数据可视化脚本】
- JAVA实现Modbus RTU或Modbus TCPIP案例.zip
- 基于YOLOv8的FPS TPS AI自动锁定源码+使用步骤说明.zip
- JAVA实现Modbus RTU或Modbus TCPIP案例.zip
- 基于yolov8+streamlit的火灾检测部署源码+模型.zip
- 测试aaaaaaabbbbb
- VID20240521070643.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈