4219|0

1379

帖子

0

TA的资源

裸片初长成(中级)

楼主
 

模拟量输入与输出应用实例(2) [复制链接]

I2C总线工作方式相关子程序

1C语言编写的I2C总线工作方式的初始化子程序

//I2C初始化子程序

void       i2cint()

{

       SSPCON = 0X08                     //初始化SSPCON寄存器

       TRISC3 =1                      //设置SCL为输入口

       TRISC4 =1                      //设置SDA为输入口

       TRISA4 = 0

       SSPSTAT=0X80               //初始化SSPSTAT寄存器

       SSPADD=0X02                //设定I2C时钟频率

       SSPCON2=0X00                     //初始化SSPCON2寄存器

       di()                                  //关闭总中断

       SSPIF=0                          //SSP中断标志

       RA4=0                             //关掉74HC165的移位时钟使能,以免74HC165移位

//数据输出与I2C总线的数据线发生冲突(此操作与该

//实验板的特殊结构有关,不是通用的)

       SSPEN=1                        //SSP模块使能

}

 

2C语言编写的I2C总线工作方式传输数据子程序

需要发送的数据在寄存器j中。

//I2C总线输出数据子程序

i2cout()

{

       SEN=1                                   //产生I2C启动信号

       for(n=0x02--n)      continue//给予一定的延时,保证启动

do    {

              RSEN=1                   //产生I2C重启动信号

       }while(SSPIF==0)            //如果没能启动,则反复启动,直到启动为止

       SSPIF=0                          //SSPIF标志清0

       SSPBUF=0X58                 //I2C总线发送地址字节

do    {

             

       }while(SSPIF==0)            //等待地址发送完毕

       SSPIF=0                          //SSPIF标志清0

       SSPBUF=0X01                 //I2C总线发送命令字节

do    {

             

       }while(SSPIF==0)            //等待命令发送完毕

       SSPIF=0                          //SSPIF标志清0

       SSPBUF=j                        //I2C总线发送数据字节

do    {

             

       }while(SSPIF==0)            //等待数据发送完毕

       SSPIF=0                          //SSPIF标志清0

       PEN=1                                   //产生停止条件

do {

             

       }while(SSPIF==0)            //等待停止条件产生

       SSPIF=0                          //SSPIF标志清0  

}

\程序清单

      下面给一个例程。该程序利用MAX518进行D/A转换,且从D/A0引脚输出一个正弦波形。可作为读者编制程序的参考。特别注意,在调试该程序时,把模板上的钮子开关S8拔向高电平,以免发生资源冲突。

       #include  <pic.h>

//本程序将通过PIC16F877I2C方式驱动D/A转换器MAX518,使其D/A0通道输出

//一个连续的正弦波形(注:本程序并没对正弦波的频率进行控制)

const  char  table[ ] = {0X800X860X8D 0X930X990X9F0XA50XAB

0XB10XB70XBC0XC20XC70XCC0XD10XD60XDA0XDF0XE30XE70XEA0XEE0XF10XF40XF60XF80XFA0XFC0XFD0XFF0XFF0XFF0XFF0XFF0XFF0XFE0XFD0XFB0XF90XF70XF50XF20XEF0XEC0XE90XE50XE10XDD0XD80XD40XCF0XCA0XC50XBF0XBA0XB40XAE0XA80XA20X9C0X960X900X890X830X800X790X720X6C0X660X600X5A0X550X4E0X480X430X3D0X380X330X2E0X290X250X200X1C0X180X150X110X0E0X0B0X090X070X050X030X020X000X000X000X000X000X000X010X020X040X060X080X0A0X0D0X100X130X160X1A0X1E0X220X270X2B0X300X350X3A0X400X450X4C0X510X570X5D0X630X690X6F0X760X7C}

//以上的数组用于存放正弦表,在定义数组时,前面应该加上 const

//以使数组存放于ROM中,而不至于占用太多的RAM

unsigned       char  i

unsigned               char       j

unsigned               char       n

//I2C初始化子程序

void        i2cint()

{

       SSPCON = 0X08                     //初始化SSPCON寄存器

       TRISC3 =1                      //设置SCL为输入口

       TRISC4 =1                      //设置SDA为输入口

       TRISA4 = 0

       SSPSTAT=0X80               //初始化SSPSTAT寄存器

       SSPADD=0X02                //设定I2C时钟频率

       SSPCON2=0X00                     //初始化SSPCON2寄存器

       di()                                  //关闭总中断

       SSPIF=0                          //SSP中断标志

       RA4=0                             //关掉74HC165的移位时钟使能,以免74HC165

                                                 //移位数据输出与I2C总线的数据线发生冲突

       SSPEN=1                        //SSP模块使能

}

//I2C总线输出数据子程序

void        i2cout()

{

       SEN=1                                   //产生I2C启动信号

       for(n=0x02--n)      continue//给予一定的延时,保证启动

do    {

              RSEN=1                   //产生I2C启动信号

       }while(SSPIF==0)            //如果没能启动,则反复启动,直到启动为止

       SSPIF=0                          //SSPIF标志清0

       SSPBUF=0X58                 //I2C总线发送地址字节

do    {

             

       }while(SSPIF==0)            //等待地址发送完毕

       SSPIF=0                          //SSPIF标志清0

       SSPBUF=0X01                 //I2C总线发送命令字节

do    {

             

       }while(SSPIF==0)            //等待命令发送完毕

       SSPIF=0                          //SSPIF标志清0

       SSPBUF=j                        //I2C总线发送数据字节

do    {

             

       }while(SSPIF==0)            //等待数据发送完毕

       SSPIF=0                          //SSPIF标志清0

       PEN=1                                   //产生停止条件

do    {

             

       }while(SSPIF==0)            //等待停止条件产生

       SSPIF=0                          //SSPIF标志清0  

}

//主程序

main ()

{

       i2cint()                                   //I2C初始化

while(1){

              for(i=0x00i<=127++i)

              {    

                     j=table            //从数组中得到需要传输的数据量

                     i2cout()             //利用I2C总线方式送出数据

              }

       }

}

此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表