专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC单片机
本人是新手,请问pic16f917与mcp3421之间的I2C通信问题
2020-02-06 09:57
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
9234
14
14
pic16f917与mcp3421之间的通信时采用I2C方式,但是两者之间的数据究竟是如何传输的,有些搞不清楚,资料也看了些。希望哪位大哥能指点一下,小弟也是刚学习pic单片机的,谢谢
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
zbm2007
1楼-- · 2020-02-06 10:11
这位仁兄 你现在会用了吗? 在下正好也想用用试试,也是看不大懂
加载中...
yklstudent
2楼-- · 2020-02-06 10:27
用CCSC编译器,程序很容易写。。。。。
加载中...
surf_131
3楼-- · 2020-02-06 10:56
我贴过MCP3425型号的驱动实例.......
另外,最近发的串行口通信实例一帖里面有对LM75A通信的部分,就是完整的IIC例子
加载中...
surf_131
4楼-- · 2020-02-06 16:07
我贴过MCP3425型号的驱动实例.......
另外,最近发的串行口通信实例一帖里面有对LM75A通信的部分,就是完整的IIC例子
加载中...
zbm2007
5楼-- · 2020-02-06 20:44
精彩回答 2 元偷偷看……
加载中...
yklstudent
6楼-- · 2020-02-07 02:16
#include<16F917.h>
#device ADC=10
#include<math.h>
#define MCP3421_SDA PIN_C7
#define MCP3421_SCL PIN_C6
#define CS PIN_C0
#define CLK PIN_C1
#define DIN PIN_C2
#define addo (2.048/32767.0)
#fuses INTRC_IO , NOWDT , PROTECT , NOPUT
#use delay(clock=1000000,restart_wdt)
#use i2c(master , sda=MCP3421_SDA , scl=MCP3421_SCL)
int8 LedNum[] = {1,2,3,4,5,6,7,8};
int32 MCP3421_READ()
{
int read_value_a,read_value_b,read_value_c,read_value_d,read_value_e,ERROR;
int32 value_adc=0x00;
output_float(MCP3421_SCL);
output_float(MCP3421_SDA);
i2c_start();
if (i2c_write(0B11010000)==0)
if (i2c_write(0B10001000)==0)
i2c_stop();
delay_ms(10);
read_value_a=0;
read_value_b=0;
read_value_c=0;
read_value_d=0;
read_value_e=0;
i2c_start();
if (i2c_write(0B11010001)==0)
{
read_value_a=i2c_read(1);
value_adc=value_adc+read_value_a;
value_adc=value_adc<<8;
read_value_b=i2c_read(1);
value_adc=value_adc+read_value_b;
read_value_c=i2c_read(1);
read_value_d=i2c_read(1);
read_value_e=i2c_read(0);
i2c_stop();
read_value_a=ERROR;
}
return(value_adc);
}
void Port_Initial(void)
{
set_tris_c(0xF0);
}
void WriteByte(int8 dat)
{
int8 i;
for(i=0;i<8;i++)
{
if(((dat<<i)&0x80))
{
output_high(DIN);
}
else
{
output_low(DIN);
}
output_low(CLK);
#asm
nop
#endasm
output_high(CLK);
#asm
nop
#endasm
}
}
void MAX7221_WRITE(int8 addr,int8 dat)
{
output_low(CS);
WriteByte(addr);
WriteByte(dat);
output_high(CS);
}
void MAX7221_Initial(void)
{
MAX7221_WRITE(0x0A,0x07);
MAX7221_WRITE(0x0B,0x07);
MAX7221_WRITE(0x0C,0x01);
MAX7221_WRITE(0x0D,0x00);
MAX7221_WRITE(0x09,0xFF);
}
void Display(int8 *str)
{
int8 i;
for(i=0;i<8;i++)
{
MAX7221_WRITE(i+1,str[i]);
}
}
void HEXTOBCD(void)
{
int32 temp;
temp = (int32)(MCP3421_READ()*addo*1000);
if(temp<=1864)
{
Temp = (int32)(sqrt(((1.8639-(MCP3421_READ()*addo))/3.88)+2.1962)*1000-1481.96);
LedNum[0] = temp/1000;
LedNum[1] = temp%1000/100;
LedNum[2] = temp%100/10;
LedNum[3] = (temp%10)|0x80;
LedNum[4] = 0;
LedNum[5] = 15;
LedNum[6] = 15;
LedNum[7] = 15;
}
else
{
temp = (int32)(-sqrt(2.1962-(((MCP3421_READ()*addo)-1.8639)/3.88))*1000+1481.96);
LedNum[0] = 10;
LedNum[1] = temp/1000;
LedNum[2] = temp%1000/100;
LedNum[3] = temp%100/10;
LedNum[4] = (temp%10)|0x80;
LedNum[5] = 0;
LedNum[6] = 15;
LedNum[7] = 15;
}
/*
LedNum[0] = (temp/1000)|0x80;
LedNum[1] = temp%1000/100;
LedNum[2] = temp%100/10;
LedNum[3] = temp%10;
LedNum[4] = 15;
LedNum[5] = 15;
LedNum[6] = 15;
LedNum[7] = 15;
*/
}
void main()
{
Port_Initial();
delay_us(10);
MAX7221_Initial();
delay_us(10);
while(1)
{
HEXTOBCD();
delay_ms(20);
Display(LedNum);
delay_ms(20);
}
}
加载中...
1
2
3
下一页
一周热门
更多
>
相关问题
PIC单片机不同的IO口驱动74HC573驱动共阴极的数码管,有的段不亮
1 个回答
一种简单精确的pic延时方法
21 个回答
谁熟悉PIC的产品发布时间的,帮看看PIC18F47K40啥版本IDE能开发
12 个回答
求AN1078对应的源代码下载地址
5 个回答
PIC单片机应用技巧
4 个回答
串口无法连续接收数据
2 个回答
求助:dsPIC33F串口通信,如何发送字符串
4 个回答
PIC45K40 IOC(interrupt-on-change)功能
2 个回答
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
PIC单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
另外,最近发的串行口通信实例一帖里面有对LM75A通信的部分,就是完整的IIC例子
另外,最近发的串行口通信实例一帖里面有对LM75A通信的部分,就是完整的IIC例子
#include<16F917.h>
#device ADC=10
#include<math.h>
#define MCP3421_SDA PIN_C7
#define MCP3421_SCL PIN_C6
#define CS PIN_C0
#define CLK PIN_C1
#define DIN PIN_C2
#define addo (2.048/32767.0)
#fuses INTRC_IO , NOWDT , PROTECT , NOPUT
#use delay(clock=1000000,restart_wdt)
#use i2c(master , sda=MCP3421_SDA , scl=MCP3421_SCL)
int8 LedNum[] = {1,2,3,4,5,6,7,8};
int32 MCP3421_READ()
{
int read_value_a,read_value_b,read_value_c,read_value_d,read_value_e,ERROR;
int32 value_adc=0x00;
output_float(MCP3421_SCL);
output_float(MCP3421_SDA);
i2c_start();
if (i2c_write(0B11010000)==0)
if (i2c_write(0B10001000)==0)
i2c_stop();
delay_ms(10);
read_value_a=0;
read_value_b=0;
read_value_c=0;
read_value_d=0;
read_value_e=0;
i2c_start();
if (i2c_write(0B11010001)==0)
{
read_value_a=i2c_read(1);
value_adc=value_adc+read_value_a;
value_adc=value_adc<<8;
read_value_b=i2c_read(1);
value_adc=value_adc+read_value_b;
read_value_c=i2c_read(1);
read_value_d=i2c_read(1);
read_value_e=i2c_read(0);
i2c_stop();
read_value_a=ERROR;
}
return(value_adc);
}
void Port_Initial(void)
{
set_tris_c(0xF0);
}
void WriteByte(int8 dat)
{
int8 i;
for(i=0;i<8;i++)
{
if(((dat<<i)&0x80))
{
output_high(DIN);
}
else
{
output_low(DIN);
}
output_low(CLK);
#asm
nop
#endasm
output_high(CLK);
#asm
nop
#endasm
}
}
void MAX7221_WRITE(int8 addr,int8 dat)
{
output_low(CS);
WriteByte(addr);
WriteByte(dat);
output_high(CS);
}
void MAX7221_Initial(void)
{
MAX7221_WRITE(0x0A,0x07);
MAX7221_WRITE(0x0B,0x07);
MAX7221_WRITE(0x0C,0x01);
MAX7221_WRITE(0x0D,0x00);
MAX7221_WRITE(0x09,0xFF);
}
void Display(int8 *str)
{
int8 i;
for(i=0;i<8;i++)
{
MAX7221_WRITE(i+1,str[i]);
}
}
void HEXTOBCD(void)
{
int32 temp;
temp = (int32)(MCP3421_READ()*addo*1000);
if(temp<=1864)
{
Temp = (int32)(sqrt(((1.8639-(MCP3421_READ()*addo))/3.88)+2.1962)*1000-1481.96);
LedNum[0] = temp/1000;
LedNum[1] = temp%1000/100;
LedNum[2] = temp%100/10;
LedNum[3] = (temp%10)|0x80;
LedNum[4] = 0;
LedNum[5] = 15;
LedNum[6] = 15;
LedNum[7] = 15;
}
else
{
temp = (int32)(-sqrt(2.1962-(((MCP3421_READ()*addo)-1.8639)/3.88))*1000+1481.96);
LedNum[0] = 10;
LedNum[1] = temp/1000;
LedNum[2] = temp%1000/100;
LedNum[3] = temp%100/10;
LedNum[4] = (temp%10)|0x80;
LedNum[5] = 0;
LedNum[6] = 15;
LedNum[7] = 15;
}
/*
LedNum[0] = (temp/1000)|0x80;
LedNum[1] = temp%1000/100;
LedNum[2] = temp%100/10;
LedNum[3] = temp%10;
LedNum[4] = 15;
LedNum[5] = 15;
LedNum[6] = 15;
LedNum[7] = 15;
*/
}
void main()
{
Port_Initial();
delay_us(10);
MAX7221_Initial();
delay_us(10);
while(1)
{
HEXTOBCD();
delay_ms(20);
Display(LedNum);
delay_ms(20);
}
}
一周热门 更多>