找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5244|回复: 8
收起左侧

网上看到的mcp3421 iic单片机驱动程序

  [复制链接]
ID:454155 发表于 2019-4-19 16:37 | 显示全部楼层 |阅读模式
网上看到的mcp3421 iic驱动    望对你有帮助

单片机源程序如下:


  1. #include  "mcp3421.h"
  2. #include  "delay.h"

  3. void I2CStart(u8 ch)  
  4. {
  5.     EA=0;
  6.     switch(ch)  
  7.     {
  8.             case 1:
  9.             {
  10.                   SDA_1=1;  
  11.                   Delay_ms(10) ;
  12.                   SCL_1=1;  
  13.                   Delay_ms(10) ;
  14.                   SDA_1=0;  
  15.                   Delay_ms(10) ;
  16.                   SCL_1=0;
  17.             }break;
  18.             case 2:
  19.             {
  20.                   SDA_2=1;  
  21.                   Delay_ms(10);  
  22.                   SCL_2=1;  
  23.                   Delay_ms(10);  
  24.                   SDA_2=0;  
  25.                   Delay_ms(10);  
  26.                   SCL_2=0;
  27.             }break;
  28.      default:break;
  29.       }  
  30. }
  31.   
  32.    void I2CStop(u8 ch)  
  33.   {  
  34.     switch(ch)  
  35.     {
  36.             case 1:
  37.             {  
  38.               SCL_1=0;  
  39.               Delay_ms(10);  
  40.               SDA_1=0;  
  41.               Delay_ms(10);  
  42.               SCL_1=1;  
  43.               Delay_ms(10);  
  44.               SDA_1=1;  
  45.               EA=1;
  46.             }break;
  47.             case 2:
  48.             {
  49.               SCL_2=0;  
  50.               Delay_ms(10);  
  51.               SDA_2=0;  
  52.               Delay_ms(10);  
  53.               SCL_2=1;  
  54.               Delay_ms(10);  
  55.               SDA_2=1;  
  56.               EA=1;
  57.                 }break;
  58.             default:break;
  59.       }
  60.    
  61.   }

  62.   
  63. void  WaitAck(u8 ch)  
  64.   {  
  65.   u8 i=20;
  66. switch(ch)  
  67.     {
  68.             case 1:
  69.             {
  70.       
  71.                    SDA_1=1;  
  72.                   Delay_ms(10);  
  73.                   SCL_1=1;  
  74.                   while(i--){  
  75.                             if(SDA_1==1)  
  76.                                     {  
  77.                                     SCL_1=0;  
  78.                                     Delay_ms(10);  
  79.                                     SCL_1=1;  
  80.                                     }  
  81.                             else  
  82.                                 SCL_1=0;  
  83.                               
  84.                             }  
  85.                   return;  
  86.                 }break;
  87.             
  88.                 case 2:
  89.                {
  90.       
  91.                    SDA_2=1;  
  92.                   Delay_ms(10);  
  93.                   SCL_2=1;  
  94.                   while(i--){  
  95.                             if(SDA_2==1)  
  96.                                     {  
  97.                                     SCL_2=0;  
  98.                                     Delay_ms(10)  ;
  99.                                     SCL_2=1;  
  100.                                     }  
  101.                             else  
  102.                                 SCL_2=0;  
  103.                               
  104.                             }  
  105.                                 
  106.                   return;  
  107.                 }break;
  108.      
  109.                 default:break;   
  110.             
  111.         }  
  112.     }
  113.   
  114. void SendAck(u8 ch)  
  115. {
  116. switch(ch)  
  117.     {
  118.             case 1:
  119.             {
  120.             SDA_1=0;  
  121.             Delay_ms(10);  
  122.             SCL_1=1;  
  123.             Delay_ms(10);  
  124.             SCL_1=0;  
  125.             }break;
  126.             case 2:
  127.             {
  128.             SDA_2=0;  
  129.             Delay_ms(10) ;
  130.             SCL_2=1;  
  131.             Delay_ms(10);  
  132.             SCL_2=0;  
  133.             }break;
  134.         default:break;   
  135.     }   
  136. }  
  137.   
  138. void SendNotAck(u8 ch)  
  139. {
  140. switch(ch)  
  141.     {
  142.             case 1:
  143.             {
  144.    
  145.                SDA_1=1;  
  146.                Delay_ms(10);  
  147.                SCL_1=1;  
  148.                Delay_ms(10);  
  149.                SCL_1=0;  
  150.             }break;
  151.             case 2:
  152.             {
  153.    
  154.                SDA_2=1;  
  155.                Delay_ms(10) ;
  156.                SCL_2=1;  
  157.                Delay_ms(10) ;
  158.                SCL_2=0;  
  159.             }break;
  160.             
  161.         default:break;
  162.     }
  163.    
  164. }  
  165.   
  166. void I2CSendbyte(u8 ch,u8 t)  
  167. {  
  168. u8 i=8;
  169. switch(t)  
  170.     {
  171.             case 1:
  172.             {   
  173.              while(i--)  
  174.                 {
  175.                
  176.                  SCL_1=0;  
  177.                  Delay_ms(10);  
  178.                  SDA_1=(bit)(ch&0x80);  
  179.                  ch<<=1;  
  180.                  Delay_ms(10);  
  181.                  SCL_1=1;  
  182.                  Delay_ms(10);  
  183.                 }  
  184.                SCL_1=0;  
  185.             }break;   
  186.             case 2:
  187.             {   
  188.              while(i--)  
  189.                 {
  190.                
  191.                  SCL_2=0;  
  192.                  Delay_ms(10);  
  193.                  SDA_2=(bit)(ch&0x80);  
  194.                  ch<<=1;  
  195.                  Delay_ms(10);  
  196.                  SCL_2=1;  
  197.                  Delay_ms(10);  
  198.                 }  
  199.                SCL_2=0;  
  200.             }break;   
  201.             default:break;
  202.         }        
  203. }  
  204.   
  205. u8 I2CRecebyte(u8 ch)  
  206. {  
  207. u8 i=8;  u8 ddata=0;
  208. switch(ch)  
  209.     {
  210.             case 1:
  211.             {   
  212.              SDA_1=1;  
  213.              while(i--){  
  214.               ddata<<=1;  
  215.               SCL_1=0;  
  216.               Delay_ms(10);  
  217.               SCL_1=1;  
  218.               Delay_ms(10);  
  219.               ddata|=SDA_1;  
  220.              }  
  221.              SCL_1=0;  
  222.             
  223.              }break;   
  224.             
  225.             case 2:
  226.             {   
  227.              SDA_2=1;  
  228.              while(i--){  
  229.               ddata<<=1;  
  230.               SCL_2=0;  
  231.               Delay_ms(10);  
  232.               SCL_2=1;  
  233.               Delay_ms(10);  
  234.               ddata|=SDA_2;  
  235.              }  
  236.              SCL_2=0;  
  237.              return ddata;
  238.              }break;
  239.                 default:break;
  240.         }
  241.     return ddata;         
  242. }  
  243.   
  244. void WRITE_MCP3421(u8 wr_data,u8 ch)  
  245. {  
  246. switch(ch)  
  247.     {
  248.         case 1:
  249.       {
  250.         I2CStart(1);  
  251.          I2CSendbyte(0xd0,1);  
  252.          WaitAck(1);  
  253.          I2CSendbyte(wr_data,1);  
  254.          WaitAck(1);  
  255.          I2CStop(1);  
  256.         }break;
  257.       
  258.       case 2:
  259.       {
  260.         I2CStart(2);  
  261.          I2CSendbyte(0xd0,2);  
  262.          WaitAck(2);  
  263.          I2CSendbyte(wr_data,2);  
  264.          WaitAck(2);  
  265.          I2CStop(2);  
  266.         }break;
  267.         default:break;
  268.         }
  269. }  
  270.   
  271. void READ_MCP3421(u8 ch)  
  272. {
  273.      switch(ch)  
  274.     {
  275.         case 1:
  276.       {
  277.         I2CStart(1);  
  278.          I2CSendbyte(0xd1,1);  
  279.           WaitAck(1);  
  280.           elech=I2CRecebyte(1);  
  281.           SendAck(1);  
  282.           elecl=I2CRecebyte(1);  
  283.           SendAck(1);  
  284.           mcp_busy=I2CRecebyte(1);  
  285.          SendNotAck(1);  
  286.           I2CStop(1);
  287.         }break;
  288.         case 2:
  289.       {
  290.         I2CStart(2);  
  291.          I2CSendbyte(0xd1,2);  
  292.           WaitAck(2);  
  293.           elech=I2CRecebyte(2);  
  294.           SendAck(2);  
  295.           elecl=I2CRecebyte(2);  
  296.           SendAck(2);  
  297.           mcp_busy=I2CRecebyte(2);  
  298.          SendNotAck(2);  
  299.           I2CStop(2);
  300.         }break;
  301.         default:break;
  302.     }
  303.          
  304. }
  305. //
  306. // u32 Get_Adc(u8 ch)
  307. // {
  308. //     u32 vol=0;
  309. //     switch(ch)  
  310. //    {
  311. //        case 1:
  312. //      {
  313. //     WRITE_MCP3421(0x8d,1);
  314. //     vol = READ_MCP3421(1);
  315. //     }break;
  316. //      case 2:
  317. //      {
  318. //     WRITE_MCP3421(0x8d,2);
  319. //     vol =READ_MCP3421(2) + 1;
  320. //    }break;
  321. //     default:break;
  322. //    }
  323. //    return vol;
  324. //   
  325. // }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:65956 发表于 2019-6-10 10:48 | 显示全部楼层
太好了,我虽对这个芯片已用很久了,但都是自己用经验测试写出来的,看到这个,我才觉行我写出来的差距,谢谢分享,我又可以用这种方法来试验了
回复

使用道具 举报

ID:33548 发表于 2019-10-16 11:09 | 显示全部楼层
下载学习一下
回复

使用道具 举报

ID:478085 发表于 2020-5-27 22:46 | 显示全部楼层
谢谢分享,下来学习下。
回复

使用道具 举报

ID:718766 发表于 2020-7-14 14:14 | 显示全部楼层
谢谢,刚用这片AD,学习下
回复

使用道具 举报

ID:586915 发表于 2021-12-13 00:40 | 显示全部楼层
对于我们新手来说 一条备注都没有搞个蛋
回复

使用道具 举报

ID:1084704 发表于 2023-6-17 23:12 | 显示全部楼层
头文件呢
回复

使用道具 举报

ID:149642 发表于 2024-1-13 20:57 | 显示全部楼层
有没有人知道,只读了第一个字节,后面就是读的0了,应答ACK应该是没问题的
回复

使用道具 举报

ID:619259 发表于 2024-2-24 13:08 | 显示全部楼层
抄也不会抄,mcp3421.h在哪里?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表