微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > PIC16F887模拟I2C通讯实现自动控制

PIC16F887模拟I2C通讯实现自动控制

时间:10-02 整理:3721RD 点击:
手上有个简单的项目想要实现自动控制:
1、控制板触摸的,控制板与主板之间是I2C通讯;
2、用单片机取代触摸板;
3、电脑串口同单片机通讯实现自动控制;
4、还想写一段单片机(从机)与触摸板通讯代码。
我之前自己写了一段代码但没模拟成功,现在手上刚好又有其它项目没时间弄(我自己是主要做labview上位机程序,平常用用单片机也是配合labview控制,对一些高级点用法也不太懂。),哪位大大能帮忙做下,如必要可以酬谢,可以提供下硬件用于调试。


最近有自己在摸索写下程序,但还有些小问题如下图所示,在数据发送完后后SDA会出现一个高电平,不知道怎么去消除(NG无应答(局面).jpg),程序如下,请高手帮忙抓抓虫子。
#include <pic.h>
//__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<n;j++)
        for(k=246;k>0;k--)
        NOP();
}

刚忘了上传图片,补充如下。





谢谢,小编提供的场地。
MICROCHIP 原装正品,另有可替换单片机(无需修改PCB资料,程序可共用PIC的) 有用到的兄弟多多支持!  电话13430885511(微信同号),QQ2355910801

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top