PIC单片机william hill官网
登录
直播中
he282942873
10年用户
101经验值
擅长:电源/新能源 测量仪表
私信
关注
[问答]
PIC16F887模拟I2C通讯实现自动控制
开启该帖子的消息推送
手上有个简单的项目想要实现自动控制:
1、控制板触摸的,控制板与主板之间是I2C通讯;
2、用
单片机
取代触摸板;
3、电脑串口同单片机通讯实现自动控制;
4、还想写一段单片机(从机)与触摸板通讯代码。
我之前自己写了一段代码但没模拟成功,现在手上刚好又有其它项目没时间弄(我自己是主要做
labview
上位机程序,平常用用单片机也是配合labview控制,对一些高级点用法也不太懂。),哪位大大能帮忙做下,如必要可以酬谢,可以提供下硬件用于调试。
回帖
(3)
he282942873
2017-3-20 14:56:54
最近有自己在摸索写下程序,但还有些小问题如下图所示,在数据发送完后后SDA会出现一个高电平,不知道怎么去消除(NG无应答(局面).jpg),程序如下,请高手帮忙抓抓虫子。
#include
//__CONFIG(0x20f2);
//__CONFIG(0x3fff);
#define _XTAL_FREQ 16000000
void DELAY(unsigned int);
void IIC_SEND(char);
void IIC_Init(void);
char READ_EEPROM(char);
//unsigned char read(char);
void main(void)
{
char i,j,R1;
char addr;
addr=0x0d;
IIC_Init();
DELAY(10);
while(1)
{
READ_EEPROM(addr);
DELAY(100);
}
}
void IIC_SEND(char R)
{
SSPBUF=R;
while(SSPIF==0);
while(ACKSTAT==1);
}
char READ_EEPROM(char addr)
{
char R;
SEN=1;
while(SEN==1);
IIC_SEND(addr);
/*RSEN=1;
while(RSEN==1);
IIC_SEND(0xc1);*/
SSPIF=0;
RCEN=1;
while(SSPIF==0);
R=SSPBUF;
PEN=1;
while(PEN==1);
return(R);
}
void IIC_Init(void)
{
TRISC=0xff;
SSPCON=0x28; //初始化SSPCON寄存器 00101000 //SSPM=1000,I2C主模式
SSPCON2=0X00; //初始化SSPCON2寄存器
//SSPADD = 0x09; // 当主频为16Mhz时波特率为400kbps,I2C波特率=Fosc/(4*(SSPADD+1)),SSPADD=[(Fosc/(BandRate*4)]-1
SSPADD = 0x39; // 当主频为16Mhz时波特率为100kbps,I2C波特率=Fosc/(4*(SSPADD+1)),SSPADD=[(Fosc/(BandRate*4)]-1
SSPSTAT=0X80; //初始化SSPSTAT寄存器
SSPIF=0;
WCOL=0; // 写冲突检测位清零,若发送数据不正确请检查此位
SMP=1;
CKP=1;
CKE=0; // 使用I2C协议规范电平 关闭斜率控制
SSPEN=1; //使能I2C模块*/
}
void DELAY(unsigned int n)
{
unsigned int j;
char k;
for(j=0;j
for(k=246;k>0;k--)
NOP();
}
最近有自己在摸索写下程序,但还有些小问题如下图所示,在数据发送完后后SDA会出现一个高电平,不知道怎么去消除(NG无应答(局面).jpg),程序如下,请高手帮忙抓抓虫子。
#include
//__CONFIG(0x20f2);
//__CONFIG(0x3fff);
#define _XTAL_FREQ 16000000
void DELAY(unsigned int);
void IIC_SEND(char);
void IIC_Init(void);
char READ_EEPROM(char);
//unsigned char read(char);
void main(void)
{
char i,j,R1;
char addr;
addr=0x0d;
IIC_Init();
DELAY(10);
while(1)
{
READ_EEPROM(addr);
DELAY(100);
}
}
void IIC_SEND(char R)
{
SSPBUF=R;
while(SSPIF==0);
while(ACKSTAT==1);
}
char READ_EEPROM(char addr)
{
char R;
SEN=1;
while(SEN==1);
IIC_SEND(addr);
/*RSEN=1;
while(RSEN==1);
IIC_SEND(0xc1);*/
SSPIF=0;
RCEN=1;
while(SSPIF==0);
R=SSPBUF;
PEN=1;
while(PEN==1);
return(R);
}
void IIC_Init(void)
{
TRISC=0xff;
SSPCON=0x28; //初始化SSPCON寄存器 00101000 //SSPM=1000,I2C主模式
SSPCON2=0X00; //初始化SSPCON2寄存器
//SSPADD = 0x09; // 当主频为16Mhz时波特率为400kbps,I2C波特率=Fosc/(4*(SSPADD+1)),SSPADD=[(Fosc/(BandRate*4)]-1
SSPADD = 0x39; // 当主频为16Mhz时波特率为100kbps,I2C波特率=Fosc/(4*(SSPADD+1)),SSPADD=[(Fosc/(BandRate*4)]-1
SSPSTAT=0X80; //初始化SSPSTAT寄存器
SSPIF=0;
WCOL=0; // 写冲突检测位清零,若发送数据不正确请检查此位
SMP=1;
CKP=1;
CKE=0; // 使用I2C协议规范电平 关闭斜率控制
SSPEN=1; //使能I2C模块*/
}
void DELAY(unsigned int n)
{
unsigned int j;
char k;
for(j=0;j
for(k=246;k>0;k--)
NOP();
}
举报
he282942873
2017-3-20 14:57:45
刚忘了上传图片,补充如下。
刚忘了上传图片,补充如下。
举报
颜生
2017-8-24 14:09:53
受到警告
提示:
作者被禁止或删除 内容自动屏蔽
举报
更多回帖
rotate(-90deg);
回复
相关问答
PIC
K150能否烧写
PIC16F887
?
2014-01-03
2781
PIC16F887
单片机的烧写程序
2015-09-08
7434
MPLABX V3.05上的ADC激励
PIC16F887
出错
2019-09-19
1487
如何用
pic16f
145x通用IO引脚
模拟
I2c
2019-07-26
2920
用
pic16f887
捕捉测速
2017-04-03
2676
PIC16F
15356的
I2C
问题
2020-03-20
1575
PIC16F
1454
I2C
和USB问题
2019-08-23
967
I2C
摆率
控制
是什么?
2019-10-23
1894
PIC16F
1834怎么使用
I2C
?
2019-08-21
2020
怎么通过SPI将
PIC18F
85K22转换为
PIC16F887
?
2020-03-20
614
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分