找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6027|回复: 3
收起左侧

AD7799的单片机驱动程序(带详细注释,完全测试通过)

[复制链接]
ID:319861 发表于 2018-11-25 14:49 | 显示全部楼层 |阅读模式
        本程序由《郑州轻工业大学》星空总创空间327房间鲁路编写,仅限于学习使用,如有问题,请联系:
        QQ:1224595453
        TEL:13071067331
        
        程序使用说明:
                1、Display包中是用与LCD1602显示的相关函数,使用只需重新定义LCD1602.h中的变量或者端口;
                2、Delay包中是相关延时函数;
                3、Main包中包括了实验板上的端口声明,以及菜单显示函数;
                4、AD7799包中是所有对AD7799的配置函数,每次使用时修改下面两个函数即可基本上配置所有AD7799的相关参数;
                        /*---------- AD7799修改单双极性增益倍数和通道 ----------*/
                        void AD7799_Set_Gain_and_Channel(uchar Polarity,uchar Gain,uchar Ch);        //Polarity为0代表双极性,为1代表单极性
        
                        /*---------- AD7799修改转换模式和转换速率 ----------*/
                        void AD7799_Set_Conversion_mode_and_Time(uchar Conversion_mode,uchar Time);        //Conversion_mode为0代表连续转换,为1代表单次转换,Conversion_mode代表转换速率
                5、本程序并未包含滤波算法,如需使用,请自己另加;
                6、更多相关知识,请参考AD7799Datasheet,建议学习英文原版手册,中文翻译的手册存在错误。

        附注:
                1、实验发现,AD7799内部增益调节最好不要超过2倍,超过2倍后,读数偏差巨大,这里不知道是否是电路或者程序的问题还是AD7799的问题;
                2、转换速率不要过高,使用推荐的16.7Hz较好;
                3、至于转换模式是连续还是单次,可以根据实际应用来设置,这里总结一下发现:连续转换适合于制作电压表或者测量仪器使用,因为转换速度快;单次转换在每次转换完成后会进入Power Down模式,因此适合于低功耗场合,
                   例如温度、湿度等变化速度不快的参量。
0.png

单片机源程序如下:
  1. #include <AD7799.h>
  2. #include <intrins.h>
  3. #include <main.h>
  4. #define        uchar unsigned char
  5. #define uint unsigned int
  6. #define ulint unsigned long int
  7. #define N 16
  8. #define A 10   //限幅滤波的幅值波动

  9. /*---------- AD初始化 ----------*/
  10. void AD7799_init_1(void)        //AD7799初始化,通道3,增益1,速率120ms
  11. {
  12.         CS=0;
  13.         delay10ms();
  14.         
  15.         AD7799_Set_Gain_and_Channel(1,1,3);                //单极性,Gain=1,CH=3
  16.         Internal_Zero_Scale_Calibration();                //片内零刻度校准
  17.         Internal_Full_Scale_Calibration();                //片内满刻度校准
  18.         
  19.         AD7799_Set_Conversion_mode_and_Time(1,120);        //单次转换,转换速率120ms
  20.         
  21.         //写通信寄存器,下一次为写配置寄存器
  22. //        SPI_Write_Byte(0x10);
  23. //        delay10ms();
  24. //        //写配置寄存器选择增益,通道,缓冲    //1022
  25. //        SPI_Write_Byte(0x00);          //单极选择位=1(000000H--FFFFFFH)    增益为1
  26. //        SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  27. //                                                 //(22H)3通道为1级放大       (21H) 2通道 2级放大
  28. //        delay10ms();
  29.         

  30. //        //写通信寄存器,下一次为写模式寄存器
  31. //        SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  32. //        delay10ms();
  33. //        //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  34. //        SPI_Write_Byte(0x20);        //单次转换
  35. //        SPI_Write_Byte(0x0A);        //默认速率(120ms)
  36. //        delay10ms();

  37. }

  38. /*---------- AD7799修改单双极性增益倍数和通道 ----------*/
  39. void AD7799_Set_Gain_and_Channel(uchar Polarity,uchar Gain,uchar Ch)        //Polarity为0代表双极性,为1代表单极性
  40. {
  41.     if(Polarity==1)                        //为1代表单极性
  42.     {
  43.         if(Ch==1)
  44.         {
  45.             if(Gain==1)
  46.             {
  47.                 //写通信寄存器,下一次为写配置寄存器
  48.                 SPI_Write_Byte(0x10);
  49.                 delay10ms();
  50.                 //写配置寄存器选择增益,通道,缓冲    //
  51.                 SPI_Write_Byte(0x10);          //单极选择位=1(000000H--FFFFFFH)    增益为1
  52.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  53.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  54.                 delay10ms();
  55.                 return;
  56.             }
  57.             else if(Gain==2)
  58.             {
  59.                 //写通信寄存器,下一次为写配置寄存器
  60.                 SPI_Write_Byte(0x10);
  61.                 delay10ms();
  62.                 //写配置寄存器选择增益,通道,缓冲    //
  63.                 SPI_Write_Byte(0x11);          //单极选择位=1(000000H--FFFFFFH)    增益为2
  64.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  65.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  66.                 delay10ms();
  67.                 return;
  68.             }
  69.             else if(Gain==4)
  70.             {
  71.                 //写通信寄存器,下一次为写配置寄存器
  72.                 SPI_Write_Byte(0x10);
  73.                 delay10ms();
  74.                 //写配置寄存器选择增益,通道,缓冲    //
  75.                 SPI_Write_Byte(0x12);          //单极选择位=1(000000H--FFFFFFH)    增益为4
  76.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  77.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  78.                 delay10ms();
  79.                 return;
  80.             }
  81.             else if(Gain==8)
  82.             {
  83.                 //写通信寄存器,下一次为写配置寄存器
  84.                 SPI_Write_Byte(0x10);
  85.                 delay10ms();
  86.                 //写配置寄存器选择增益,通道,缓冲    //
  87.                 SPI_Write_Byte(0x13);          //单极选择位=1(000000H--FFFFFFH)    增益为8
  88.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  89.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  90.                 delay10ms();
  91.                 return;
  92.             }
  93.             else if(Gain==16)
  94.             {
  95.                 //写通信寄存器,下一次为写配置寄存器
  96.                 SPI_Write_Byte(0x10);
  97.                 delay10ms();
  98.                 //写配置寄存器选择增益,通道,缓冲    //
  99.                 SPI_Write_Byte(0x14);          //单极选择位=1(000000H--FFFFFFH)    增益为16
  100.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  101.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  102.                 delay10ms();
  103.                 return;
  104.             }
  105.             else if(Gain==32)
  106.             {
  107.                 //写通信寄存器,下一次为写配置寄存器
  108.                 SPI_Write_Byte(0x10);
  109.                 delay10ms();
  110.                 //写配置寄存器选择增益,通道,缓冲    //
  111.                 SPI_Write_Byte(0x15);          //单极选择位=1(000000H--FFFFFFH)    增益为32
  112.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  113.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  114.                 delay10ms();
  115.                 return;
  116.             }
  117.             else if(Gain==64)
  118.             {
  119.                 //写通信寄存器,下一次为写配置寄存器
  120.                 SPI_Write_Byte(0x10);
  121.                 delay10ms();
  122.                 //写配置寄存器选择增益,通道,缓冲    //
  123.                 SPI_Write_Byte(0x16);          //单极选择位=1(000000H--FFFFFFH)    增益为64
  124.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  125.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  126.                 delay10ms();
  127.                 return;
  128.             }
  129.             else if(Gain==128)
  130.             {
  131.                 //写通信寄存器,下一次为写配置寄存器
  132.                 SPI_Write_Byte(0x10);
  133.                 delay10ms();
  134.                 //写配置寄存器选择增益,通道,缓冲    //
  135.                 SPI_Write_Byte(0x17);          //单极选择位=1(000000H--FFFFFFH)    增益为128
  136.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  137.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  138.                 delay10ms();
  139.                 return;
  140.             }
  141.         }
  142.         else if(Ch==2)
  143.         {
  144.             if(Gain==1)
  145.             {
  146.                 //写通信寄存器,下一次为写配置寄存器
  147.                 SPI_Write_Byte(0x10);
  148.                 delay10ms();
  149.                 //写配置寄存器选择增益,通道,缓冲    //
  150.                 SPI_Write_Byte(0x10);          //单极选择位=1(000000H--FFFFFFH)    增益为1
  151.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  152.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  153.                 delay10ms();
  154.                 return;
  155.             }
  156.             else if(Gain==2)
  157.             {
  158.                 //写通信寄存器,下一次为写配置寄存器
  159.                 SPI_Write_Byte(0x10);
  160.                 delay10ms();
  161.                 //写配置寄存器选择增益,通道,缓冲    //
  162.                 SPI_Write_Byte(0x11);          //单极选择位=1(000000H--FFFFFFH)    增益为2
  163.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  164.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  165.                 delay10ms();
  166.                 return;
  167.             }
  168.             else if(Gain==4)
  169.             {
  170.                 //写通信寄存器,下一次为写配置寄存器
  171.                 SPI_Write_Byte(0x10);
  172.                 delay10ms();
  173.                 //写配置寄存器选择增益,通道,缓冲    //
  174.                 SPI_Write_Byte(0x12);          //单极选择位=1(000000H--FFFFFFH)    增益为4
  175.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  176.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  177.                 delay10ms();
  178.                 return;
  179.             }
  180.             else if(Gain==8)
  181.             {
  182.                 //写通信寄存器,下一次为写配置寄存器
  183.                 SPI_Write_Byte(0x10);
  184.                 delay10ms();
  185.                 //写配置寄存器选择增益,通道,缓冲    //
  186.                 SPI_Write_Byte(0x13);          //单极选择位=1(000000H--FFFFFFH)    增益为8
  187.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  188.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  189.                 delay10ms();
  190.                 return;
  191.             }
  192.             else if(Gain==16)
  193.             {
  194.                 //写通信寄存器,下一次为写配置寄存器
  195.                 SPI_Write_Byte(0x10);
  196.                 delay10ms();
  197.                 //写配置寄存器选择增益,通道,缓冲    //
  198.                 SPI_Write_Byte(0x14);          //单极选择位=1(000000H--FFFFFFH)    增益为16
  199.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  200.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  201.                 delay10ms();
  202.                 return;
  203.             }
  204.             else if(Gain==32)
  205.             {
  206.                 //写通信寄存器,下一次为写配置寄存器
  207.                 SPI_Write_Byte(0x10);
  208.                 delay10ms();
  209.                 //写配置寄存器选择增益,通道,缓冲    //
  210.                 SPI_Write_Byte(0x15);          //单极选择位=1(000000H--FFFFFFH)    增益为32
  211.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  212.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  213.                 delay10ms();
  214.                 return;
  215.             }
  216.             else if(Gain==64)
  217.             {
  218.                 //写通信寄存器,下一次为写配置寄存器
  219.                 SPI_Write_Byte(0x10);
  220.                 delay10ms();
  221.                 //写配置寄存器选择增益,通道,缓冲    //
  222.                 SPI_Write_Byte(0x16);          //单极选择位=1(000000H--FFFFFFH)    增益为64
  223.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  224.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  225.                 delay10ms();
  226.                 return;
  227.             }
  228.             else if(Gain==128)
  229.             {
  230.                 //写通信寄存器,下一次为写配置寄存器
  231.                 SPI_Write_Byte(0x10);
  232.                 delay10ms();
  233.                 //写配置寄存器选择增益,通道,缓冲    //
  234.                 SPI_Write_Byte(0x17);          //单极选择位=1(000000H--FFFFFFH)    增益为128
  235.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  236.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  237.                 delay10ms();
  238.                 return;
  239.             }
  240.         }
  241.         else if(Ch==3)
  242.         {
  243.             if(Gain==1)
  244.             {
  245.                 //写通信寄存器,下一次为写配置寄存器
  246.                 SPI_Write_Byte(0x10);
  247.                 delay10ms();
  248.                 //写配置寄存器选择增益,通道,缓冲    //
  249.                 SPI_Write_Byte(0x10);          //单极选择位=1(000000H--FFFFFFH)    增益为1
  250.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  251.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  252.                 delay10ms();
  253.                 return;
  254.             }
  255.             else if(Gain==2)
  256.             {
  257.                 //写通信寄存器,下一次为写配置寄存器
  258.                 SPI_Write_Byte(0x10);
  259.                 delay10ms();
  260.                 //写配置寄存器选择增益,通道,缓冲    //
  261.                 SPI_Write_Byte(0x11);          //单极选择位=1(000000H--FFFFFFH)    增益为2
  262.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  263.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  264.                 delay10ms();
  265.                 return;
  266.             }
  267.             else if(Gain==4)
  268.             {
  269.                 //写通信寄存器,下一次为写配置寄存器
  270.                 SPI_Write_Byte(0x10);
  271.                 delay10ms();
  272.                 //写配置寄存器选择增益,通道,缓冲    //
  273.                 SPI_Write_Byte(0x12);          //单极选择位=1(000000H--FFFFFFH)    增益为4
  274.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  275.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  276.                 delay10ms();
  277.                 return;
  278.             }
  279.             else if(Gain==8)
  280.             {
  281.                 //写通信寄存器,下一次为写配置寄存器
  282.                 SPI_Write_Byte(0x10);
  283.                 delay10ms();
  284.                 //写配置寄存器选择增益,通道,缓冲    //
  285.                 SPI_Write_Byte(0x13);          //单极选择位=1(000000H--FFFFFFH)    增益为8
  286.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  287.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  288.                 delay10ms();
  289.                 return;
  290.             }
  291.             else if(Gain==16)
  292.             {
  293.                 //写通信寄存器,下一次为写配置寄存器
  294.                 SPI_Write_Byte(0x10);
  295.                 delay10ms();
  296.                 //写配置寄存器选择增益,通道,缓冲    //
  297.                 SPI_Write_Byte(0x14);          //单极选择位=1(000000H--FFFFFFH)    增益为16
  298.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  299.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  300.                 delay10ms();
  301.                 return;
  302.             }
  303.             else if(Gain==32)
  304.             {
  305.                 //写通信寄存器,下一次为写配置寄存器
  306.                 SPI_Write_Byte(0x10);
  307.                 delay10ms();
  308.                 //写配置寄存器选择增益,通道,缓冲    //
  309.                 SPI_Write_Byte(0x15);          //单极选择位=1(000000H--FFFFFFH)    增益为32
  310.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  311.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  312.                 delay10ms();
  313.                 return;
  314.             }
  315.             else if(Gain==64)
  316.             {
  317.                 //写通信寄存器,下一次为写配置寄存器
  318.                 SPI_Write_Byte(0x10);
  319.                 delay10ms();
  320.                 //写配置寄存器选择增益,通道,缓冲    //
  321.                 SPI_Write_Byte(0x16);          //单极选择位=1(000000H--FFFFFFH)    增益为64
  322.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  323.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  324.                 delay10ms();
  325.                 return;
  326.             }
  327.             else if(Gain==128)
  328.             {
  329.                 //写通信寄存器,下一次为写配置寄存器
  330.                 SPI_Write_Byte(0x10);
  331.                 delay10ms();
  332.                 //写配置寄存器选择增益,通道,缓冲    //
  333.                 SPI_Write_Byte(0x17);          //单极选择位=1(000000H--FFFFFFH)    增益为128
  334.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  335.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  336.                 delay10ms();
  337.                 return;
  338.             }
  339.         }
  340.     }
  341.     else if(Polarity==0)        //为0代表双极性
  342.     {
  343.         if(Ch==1)
  344.         {
  345.             if(Gain==1)
  346.             {
  347.                 //写通信寄存器,下一次为写配置寄存器
  348.                 SPI_Write_Byte(0x10);
  349.                 delay10ms();
  350.                 //写配置寄存器选择增益,通道,缓冲    //
  351.                 SPI_Write_Byte(0x00);          //双极选择位=0(000000H--FFFFFFH)    增益为1
  352.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  353.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  354.                 delay10ms();
  355.                 return;
  356.             }
  357.             else if(Gain==2)
  358.             {
  359.                 //写通信寄存器,下一次为写配置寄存器
  360.                 SPI_Write_Byte(0x10);
  361.                 delay10ms();
  362.                 //写配置寄存器选择增益,通道,缓冲    //
  363.                 SPI_Write_Byte(0x01);          //双极选择位=0(000000H--FFFFFFH)    增益为2
  364.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  365.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  366.                 delay10ms();
  367.                 return;
  368.             }
  369.             else if(Gain==4)
  370.             {
  371.                 //写通信寄存器,下一次为写配置寄存器
  372.                 SPI_Write_Byte(0x10);
  373.                 delay10ms();
  374.                 //写配置寄存器选择增益,通道,缓冲    //
  375.                 SPI_Write_Byte(0x02);          //双极选择位=0(000000H--FFFFFFH)    增益为4
  376.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  377.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  378.                 delay10ms();
  379.                 return;
  380.             }
  381.             else if(Gain==8)
  382.             {
  383.                 //写通信寄存器,下一次为写配置寄存器
  384.                 SPI_Write_Byte(0x10);
  385.                 delay10ms();
  386.                 //写配置寄存器选择增益,通道,缓冲    //
  387.                 SPI_Write_Byte(0x03);          //双极选择位=0(000000H--FFFFFFH)    增益为8
  388.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  389.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  390.                 delay10ms();
  391.                 return;
  392.             }
  393.             else if(Gain==16)
  394.             {
  395.                 //写通信寄存器,下一次为写配置寄存器
  396.                 SPI_Write_Byte(0x10);
  397.                 delay10ms();
  398.                 //写配置寄存器选择增益,通道,缓冲    //
  399.                 SPI_Write_Byte(0x04);          //双极选择位=0(000000H--FFFFFFH)    增益为16
  400.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  401.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  402.                 delay10ms();
  403.                 return;
  404.             }
  405.             else if(Gain==32)
  406.             {
  407.                 //写通信寄存器,下一次为写配置寄存器
  408.                 SPI_Write_Byte(0x10);
  409.                 delay10ms();
  410.                 //写配置寄存器选择增益,通道,缓冲    //
  411.                 SPI_Write_Byte(0x05);          //双极选择位=0(000000H--FFFFFFH)    增益为32
  412.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  413.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  414.                 delay10ms();
  415.                 return;
  416.             }
  417.             else if(Gain==64)
  418.             {
  419.                 //写通信寄存器,下一次为写配置寄存器
  420.                 SPI_Write_Byte(0x10);
  421.                 delay10ms();
  422.                 //写配置寄存器选择增益,通道,缓冲    //
  423.                 SPI_Write_Byte(0x06);          //双极选择位=0(000000H--FFFFFFH)    增益为64
  424.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  425.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  426.                 delay10ms();
  427.                 return;
  428.             }
  429.             else if(Gain==128)
  430.             {
  431.                 //写通信寄存器,下一次为写配置寄存器
  432.                 SPI_Write_Byte(0x10);
  433.                 delay10ms();
  434.                 //写配置寄存器选择增益,通道,缓冲    //
  435.                 SPI_Write_Byte(0x07);          //双极选择位=0(000000H--FFFFFFH)    增益为128
  436.                 SPI_Write_Byte(0x20);         //REF-DEF=1 参考保护使能 通道选择为1    通道1 000  通道2  001   通道3  010
  437.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  438.                 delay10ms();
  439.                 return;
  440.             }
  441.         }
  442.         else if(Ch==2)
  443.         {
  444.             if(Gain==1)
  445.             {
  446.                 //写通信寄存器,下一次为写配置寄存器
  447.                 SPI_Write_Byte(0x10);
  448.                 delay10ms();
  449.                 //写配置寄存器选择增益,通道,缓冲    //
  450.                 SPI_Write_Byte(0x00);          //双极选择位=0(000000H--FFFFFFH)    增益为1
  451.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  452.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  453.                 delay10ms();
  454.                 return;
  455.             }
  456.             else if(Gain==2)
  457.             {
  458.                 //写通信寄存器,下一次为写配置寄存器
  459.                 SPI_Write_Byte(0x10);
  460.                 delay10ms();
  461.                 //写配置寄存器选择增益,通道,缓冲    //
  462.                 SPI_Write_Byte(0x01);          //双极选择位=0(000000H--FFFFFFH)    增益为2
  463.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  464.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  465.                 delay10ms();
  466.                 return;
  467.             }
  468.             else if(Gain==4)
  469.             {
  470.                 //写通信寄存器,下一次为写配置寄存器
  471.                 SPI_Write_Byte(0x10);
  472.                 delay10ms();
  473.                 //写配置寄存器选择增益,通道,缓冲    //
  474.                 SPI_Write_Byte(0x02);          //双极选择位=0(000000H--FFFFFFH)    增益为4
  475.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  476.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  477.                 delay10ms();
  478.                 return;
  479.             }
  480.             else if(Gain==8)
  481.             {
  482.                 //写通信寄存器,下一次为写配置寄存器
  483.                 SPI_Write_Byte(0x10);
  484.                 delay10ms();
  485.                 //写配置寄存器选择增益,通道,缓冲    //
  486.                 SPI_Write_Byte(0x03);          //双极选择位=0(000000H--FFFFFFH)    增益为8
  487.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  488.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  489.                 delay10ms();
  490.                 return;
  491.             }
  492.             else if(Gain==16)
  493.             {
  494.                 //写通信寄存器,下一次为写配置寄存器
  495.                 SPI_Write_Byte(0x10);
  496.                 delay10ms();
  497.                 //写配置寄存器选择增益,通道,缓冲    //
  498.                 SPI_Write_Byte(0x04);          //双极选择位=0(000000H--FFFFFFH)    增益为16
  499.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  500.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  501.                 delay10ms();
  502.                 return;
  503.             }
  504.             else if(Gain==32)
  505.             {
  506.                 //写通信寄存器,下一次为写配置寄存器
  507.                 SPI_Write_Byte(0x10);
  508.                 delay10ms();
  509.                 //写配置寄存器选择增益,通道,缓冲    //
  510.                 SPI_Write_Byte(0x05);          //双极选择位=0(000000H--FFFFFFH)    增益为32
  511.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  512.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  513.                 delay10ms();
  514.                 return;
  515.             }
  516.             else if(Gain==64)
  517.             {
  518.                 //写通信寄存器,下一次为写配置寄存器
  519.                 SPI_Write_Byte(0x10);
  520.                 delay10ms();
  521.                 //写配置寄存器选择增益,通道,缓冲    //
  522.                 SPI_Write_Byte(0x06);          //双极选择位=0(000000H--FFFFFFH)    增益为64
  523.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  524.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  525.                 delay10ms();
  526.                 return;
  527.             }
  528.             else if(Gain==128)
  529.             {
  530.                 //写通信寄存器,下一次为写配置寄存器
  531.                 SPI_Write_Byte(0x10);
  532.                 delay10ms();
  533.                 //写配置寄存器选择增益,通道,缓冲    //
  534.                 SPI_Write_Byte(0x07);          //双极选择位=0(000000H--FFFFFFH)    增益为128
  535.                 SPI_Write_Byte(0x21);         //REF-DEF=1 参考保护使能 通道选择为2    通道1 000  通道2  001   通道3  010
  536.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  537.                 delay10ms();
  538.                 return;
  539.             }
  540.         }
  541.         else if(Ch==3)
  542.         {
  543.             if(Gain==1)
  544.             {
  545.                 //写通信寄存器,下一次为写配置寄存器
  546.                 SPI_Write_Byte(0x10);
  547.                 delay10ms();
  548.                 //写配置寄存器选择增益,通道,缓冲    //
  549.                 SPI_Write_Byte(0x00);          //双极选择位=0(000000H--FFFFFFH)    增益为1
  550.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  551.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  552.                 delay10ms();
  553.                 return;
  554.             }
  555.             else if(Gain==2)
  556.             {
  557.                 //写通信寄存器,下一次为写配置寄存器
  558.                 SPI_Write_Byte(0x10);
  559.                 delay10ms();
  560.                 //写配置寄存器选择增益,通道,缓冲    //
  561.                 SPI_Write_Byte(0x01);          //双极选择位=0(000000H--FFFFFFH)    增益为2
  562.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  563.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  564.                 delay10ms();
  565.                 return;
  566.             }
  567.             else if(Gain==4)
  568.             {
  569.                 //写通信寄存器,下一次为写配置寄存器
  570.                 SPI_Write_Byte(0x10);
  571.                 delay10ms();
  572.                 //写配置寄存器选择增益,通道,缓冲    //
  573.                 SPI_Write_Byte(0x02);          //双极选择位=0(000000H--FFFFFFH)    增益为4
  574.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  575.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  576.                 delay10ms();
  577.                 return;
  578.             }
  579.             else if(Gain==8)
  580.             {
  581.                 //写通信寄存器,下一次为写配置寄存器
  582.                 SPI_Write_Byte(0x10);
  583.                 delay10ms();
  584.                 //写配置寄存器选择增益,通道,缓冲    //
  585.                 SPI_Write_Byte(0x03);          //双极选择位=0(000000H--FFFFFFH)    增益为8
  586.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  587.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  588.                 delay10ms();
  589.                 return;
  590.             }
  591.             else if(Gain==16)
  592.             {
  593.                 //写通信寄存器,下一次为写配置寄存器
  594.                 SPI_Write_Byte(0x10);
  595.                 delay10ms();
  596.                 //写配置寄存器选择增益,通道,缓冲    //
  597.                 SPI_Write_Byte(0x04);          //双极选择位=0(000000H--FFFFFFH)    增益为16
  598.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  599.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  600.                 delay10ms();
  601.                 return;
  602.             }
  603.             else if(Gain==32)
  604.             {
  605.                 //写通信寄存器,下一次为写配置寄存器
  606.                 SPI_Write_Byte(0x10);
  607.                 delay10ms();
  608.                 //写配置寄存器选择增益,通道,缓冲    //
  609.                 SPI_Write_Byte(0x05);          //双极选择位=0(000000H--FFFFFFH)    增益为32
  610.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  611.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  612.                 delay10ms();
  613.                 return;
  614.             }
  615.             else if(Gain==64)
  616.             {
  617.                 //写通信寄存器,下一次为写配置寄存器
  618.                 SPI_Write_Byte(0x10);
  619.                 delay10ms();
  620.                 //写配置寄存器选择增益,通道,缓冲    //
  621.                 SPI_Write_Byte(0x06);          //双极选择位=0(000000H--FFFFFFH)    增益为64
  622.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  623.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  624.                 delay10ms();
  625.                 return;
  626.             }
  627.             else if(Gain==128)
  628.             {
  629.                 //写通信寄存器,下一次为写配置寄存器
  630.                 SPI_Write_Byte(0x10);
  631.                 delay10ms();
  632.                 //写配置寄存器选择增益,通道,缓冲    //
  633.                 SPI_Write_Byte(0x07);          //双极选择位=0(000000H--FFFFFFH)    增益为128
  634.                 SPI_Write_Byte(0x22);         //REF-DEF=1 参考保护使能 通道选择为3    通道1 000  通道2  001   通道3  010
  635.                 //(22H)3通道      (21H) 2通道      (20H) 1通道
  636.                 delay10ms();
  637.                 return;
  638.             }
  639.         }
  640.     }
  641. }

  642. /*---------- AD7799修改转换模式和转换速率 ----------*/
  643. void AD7799_Set_Conversion_mode_and_Time(uchar Conversion_mode,uchar Time)        //Conversion_mode为0代表连续转换,为1代表单次转换,Conversion_mode代表转换速率
  644. {
  645.         if(Conversion_mode==0)                //Conversion_mode为0代表连续转换
  646.         {
  647.                 if(Time==4)                                //转换速率为4ms
  648.                 {
  649.                         //写通信寄存器,下一次为写模式寄存器
  650.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  651.                         delay10ms();
  652.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  653.                         SPI_Write_Byte(0x00);        //连续转换
  654.                         SPI_Write_Byte(0x01);        //速率(4ms)
  655.                         delay10ms();
  656.                 }
  657.                 else if(Time==8)                //转换速率为8ms
  658.                 {
  659.                         //写通信寄存器,下一次为写模式寄存器
  660.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  661.                         delay10ms();
  662.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  663.                         SPI_Write_Byte(0x00);        //连续转换
  664.                         SPI_Write_Byte(0x02);        //速率(8ms)
  665.                         delay10ms();
  666.                 }
  667.                 else if(Time==16)                //转换速率为16ms
  668.                 {
  669.                         //写通信寄存器,下一次为写模式寄存器
  670.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  671.                         delay10ms();
  672.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  673.                         SPI_Write_Byte(0x00);        //连续转换
  674.                         SPI_Write_Byte(0x03);        //速率(16ms)
  675.                         delay10ms();
  676.                 }
  677.                 else if(Time==32)                //转换速率为32ms
  678.                 {
  679.                         //写通信寄存器,下一次为写模式寄存器
  680.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  681.                         delay10ms();
  682.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  683.                         SPI_Write_Byte(0x00);        //连续转换
  684.                         SPI_Write_Byte(0x04);        //速率(32ms)
  685.                         delay10ms();
  686.                 }
  687.                 else if(Time==60)                //转换速率为60ms
  688.                 {
  689.                         //写通信寄存器,下一次为写模式寄存器
  690.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  691.                         delay10ms();
  692.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  693.                         SPI_Write_Byte(0x00);        //连续转换
  694.                         SPI_Write_Byte(0x07);        //速率(60ms)
  695.                         delay10ms();
  696.                 }
  697.                 else if(Time==120)                //转换速率为120ms
  698.                 {
  699.                         //写通信寄存器,下一次为写模式寄存器
  700.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  701.                         delay10ms();
  702.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  703.                         SPI_Write_Byte(0x00);        //连续转换
  704.                         SPI_Write_Byte(0x0A);        //速率(120ms)
  705.                         delay10ms();
  706.                 }
  707.                 else if(Time==200)                //转换速率为200ms
  708.                 {
  709.                         //写通信寄存器,下一次为写模式寄存器
  710.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  711.                         delay10ms();
  712.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  713.                         SPI_Write_Byte(0x00);        //连续转换
  714.                         SPI_Write_Byte(0x0C);        //速率(200ms)
  715.                         delay10ms();
  716.                 }
  717.                 else if(Time==480)                //转换速率为480ms
  718.                 {
  719.                         //写通信寄存器,下一次为写模式寄存器
  720.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  721.                         delay10ms();
  722.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  723.                         SPI_Write_Byte(0x00);        //连续转换
  724.                         SPI_Write_Byte(0x0F);        //速率(480ms)
  725.                         delay10ms();
  726.                 }
  727.         }
  728.         else if(Conversion_mode==1)                //Conversion_mode为1代表单次转换
  729.         {
  730.                 if(Time==4)                                //转换速率为4ms
  731.                 {
  732.                         //写通信寄存器,下一次为写模式寄存器
  733.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  734.                         delay10ms();
  735.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  736.                         SPI_Write_Byte(0x20);        //单次转换
  737.                         SPI_Write_Byte(0x01);        //速率(4ms)
  738.                         delay10ms();
  739.                 }
  740.                 else if(Time==8)                //转换速率为8ms
  741.                 {
  742.                         //写通信寄存器,下一次为写模式寄存器
  743.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  744.                         delay10ms();
  745.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  746.                         SPI_Write_Byte(0x20);        //单次转换
  747.                         SPI_Write_Byte(0x02);        //速率(8ms)
  748.                         delay10ms();
  749.                 }
  750.                 else if(Time==16)                //转换速率为16ms
  751.                 {
  752.                         //写通信寄存器,下一次为写模式寄存器
  753.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  754.                         delay10ms();
  755.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  756.                         SPI_Write_Byte(0x20);        //单次转换
  757.                         SPI_Write_Byte(0x03);        //速率(16ms)
  758.                         delay10ms();
  759.                 }
  760.                 else if(Time==32)                //转换速率为32ms
  761.                 {
  762.                         //写通信寄存器,下一次为写模式寄存器
  763.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  764.                         delay10ms();
  765.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  766.                         SPI_Write_Byte(0x20);        //单次转换
  767.                         SPI_Write_Byte(0x04);        //速率(32ms)
  768.                         delay10ms();
  769.                 }
  770.                 else if(Time==60)                //转换速率为60ms
  771.                 {
  772.                         //写通信寄存器,下一次为写模式寄存器
  773.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  774.                         delay10ms();
  775.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  776.                         SPI_Write_Byte(0x20);        //单次转换
  777.                         SPI_Write_Byte(0x07);        //速率(60ms)
  778.                         delay10ms();
  779.                 }
  780.                 else if(Time==120)                //转换速率为120ms
  781.                 {
  782.                         //写通信寄存器,下一次为写模式寄存器
  783.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  784.                         delay10ms();
  785.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  786.                         SPI_Write_Byte(0x20);        //单次转换
  787.                         SPI_Write_Byte(0x0A);        //速率(120ms)
  788.                         delay10ms();
  789.                 }
  790.                 else if(Time==200)                //转换速率为200ms
  791.                 {
  792.                         //写通信寄存器,下一次为写模式寄存器
  793.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  794.                         delay10ms();
  795.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  796.                         SPI_Write_Byte(0x20);        //单次转换
  797.                         SPI_Write_Byte(0x0C);        //速率(200ms)
  798.                         delay10ms();
  799.                 }
  800.                 else if(Time==480)                //转换速率为480ms
  801.                 {
  802.                         //写通信寄存器,下一次为写模式寄存器
  803.                         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  804.                         delay10ms();
  805.                         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  806.                         SPI_Write_Byte(0x20);        //单次转换
  807.                         SPI_Write_Byte(0x0F);        //速率(480ms)
  808.                         delay10ms();
  809.                 }
  810.         }
  811. }

  812. /*---------- SPI写函数        ----------*/
  813. void SPI_Write_Byte(uchar Data)
  814. {
  815.         uchar i;
  816.         for(i=0;i<8;i++)
  817.         {
  818.                 clk=0;
  819.                 if(Data&0x80) DIN=1;
  820.                 else DIN=0;
  821.                 Data=Data<<1;
  822.                 delay1ms();
  823.                 clk=1;
  824.                 delay1ms();
  825.         }
  826. }

  827. /*---------- AD7799复位        ----------*/
  828. void AD7799_Reset(void)
  829. {
  830.         SPI_Write_Byte(0xff);
  831.         SPI_Write_Byte(0xff);
  832.         SPI_Write_Byte(0xff);
  833.         SPI_Write_Byte(0xff);
  834.         AD7799_init_1();                //初始化
  835.         LED=1;                                        //灯灭
  836. }

  837. /*---------- 等待7799转换完成,看是否有错误        ----------*/
  838. uchar Waite_DOUT(void)
  839. {
  840.         uchar i;
  841.         unsigned int count=0;
  842.         while(DOUT)
  843.         {        
  844.                 count++;
  845.                 if(count>10000)
  846.                 {
  847.                         //灯亮
  848.                         LED=0;        
  849.                         while(i--)
  850.                                 delay10ms();
  851.                         return 0;
  852.                 }
  853.         }
  854.         return 1;
  855. }

  856. /*这两个函数是标准推荐程序,用于以后项目用,此处只是列写并不使用  (始)  */
  857. /*---------- AD单次转换及读取函数 ----------*/
  858. unsigned long Single_Conversion_and_Read_AD(void)        //单次转换及读取函数
  859. {
  860.         //写通信寄存器,下一次为写模式寄存器
  861.         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  862.         delay10ms();
  863.         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  864.         SPI_Write_Byte(0x20);        //单次转换
  865.         SPI_Write_Byte(0x0A);        //默认速率(120ms)
  866.         delay10ms();
  867.         return Read_AD_Value();
  868. }

  869. /*---------- AD连续转换及读取函数 ----------*/
  870. unsigned long Continuous_Conversion_and_Read_AD(void)        //连续转换及读取函数,以后使用只需调用        Read_AD_Value();        函数即可返回AD值
  871. {
  872.         //写通信寄存器,下一次为写模式寄存器
  873.         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  874.         delay10ms();
  875.         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  876.         SPI_Write_Byte(0x00);        //连续转换
  877.         SPI_Write_Byte(0x0A);        //默认速率(120ms)
  878.         delay10ms();
  879.         //以后使用只需调用        Read_AD_Value();        函数即可返回AD值
  880.         return Read_AD_Value();
  881. }
  882. /*这两个函数是标准推荐程序,用于以后项目用,此处只是列写并不使用  (终)  */

  883. /*---------- 从AD获取一次数据 ----------*/
  884. unsigned long Read_AD_Value(void)
  885. {
  886.     unsigned long get_data=0;
  887.         uchar i;
  888.         
  889.         if(Waite_DOUT()==0)                //查看是否超时
  890.         {
  891.                 //reset ad7799
  892.                 /*---------- 防止时序混乱,重新同步        ----------*/
  893.                 AD7799_Reset();
  894.                 return 0;                        //超时退出读函数
  895.         }
  896.         else
  897.         {
  898.                 SPI_Write_Byte(0x58);        //发送读操作指令,读数据寄存器
  899.                 delay1ms();
  900.                
  901.                 clk=1;
  902.                 delay1ms();
  903.                 //读数据
  904.                 for(i=0;i<24;i++)         //第一次进入本函数,就是下降沿
  905.                 {
  906.                         delay1ms();
  907.                         clk=0;
  908.                         
  909.                         get_data=get_data<<1;        
  910.                         if(DOUT)
  911.                                 get_data+=1;                                
  912.                         clk=1;                        
  913.                 }
  914. //                for(i=0;i<8;i++)
  915. //                {
  916. //                        delay1ms();
  917. //                        clk=0;
  918. //                        delay1ms();
  919. //                        clk=1;
  920. //                }
  921.                 DOUT=1;
  922.                 return get_data;
  923.         }
  924. }

  925. void Internal_Zero_Scale_Calibration(void)                //片内零刻度校准
  926. {
  927.         //写通信寄存器,下一次为写模式寄存器
  928.         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  929.         delay10ms();
  930.         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  931.         SPI_Write_Byte(0x80);        //内部零刻度校准模式
  932.         SPI_Write_Byte(0x0A);        //默认速率(120ms)
  933.         delay10ms();
  934.         Waite_DOUT();                        //等待零刻度校准完成
  935. }

  936. void Internal_Full_Scale_Calibration(void)                //片内满刻度校准
  937. {
  938.         //写通信寄存器,下一次为写模式寄存器
  939.         SPI_Write_Byte(0x08);        //RS2 RS1 RS0  001(模式寄存器16bits) 设置数据寄存器不能连续可读
  940.         delay10ms();
  941.         //写模式寄存器,为低电平接地,操作模式为连续转换,频率为50HZ
  942.         SPI_Write_Byte(0xA0);        //内部慢刻度校准模式
  943.         SPI_Write_Byte(0x0A);        //默认速率(120ms)
  944.         delay10ms();
  945.         Waite_DOUT();                        //等待满刻度校准完成
  946. }        


  947. /**************************************
  948.   名称:display100num
  949.   功能:将24位数据转化为对应的ASCII码并在1602显示
  950.   输入参数:输入000-FFFF的任意一个数
  951.   输出参数: 对应的ASCII给1602显示
  952. *************************************/
  953. void display100num(unsigned long num)
  954. {
  955.         uchar a,b,c,d,e,f,g,h;
  956. /*显示电压的变量*/        
  957. //        float s;
  958. //        long vv;
  959. /*显示电压的变量*/        
  960.         uchar i,j,k,l,m,n;
  961.          
  962.         a=num/10000000;                        //
  963.         b=(num/1000000)%10;                //
  964.         c=(num/100000)%10;                //
  965.         d=(num/10000)%10;                //
  966.         e=(num/1000)%10;                //
  967.         f=(num/100)%10;                        //
  968.         g=(num/10)%10;                        //
  969.         h=num%10;                                //
  970.         
  971.         n=num%16;
  972.         m=(num/16)%16;
  973.         l=(num/16/16)%16;
  974.         k=(num/16/16/16)%16;
  975.         j=(num/16/16/16/16)%16;
  976.         i=(num/16/16/16/16/16)%16;

  977.         LCD1602_WriteCom(0xC0);         //10进制的AD值显示在第二行         
  978.         LCD1602_WriteData(0x30+a);                        
  979.         LCD1602_WriteData(0x30+b);
  980.         LCD1602_WriteData(0x30+c);
  981.         LCD1602_WriteData(0x30+d);
  982.         LCD1602_WriteData(0x30+e);
  983.         LCD1602_WriteData(0x30+f);
  984.         LCD1602_WriteData(0x30+g);
  985.         LCD1602_WriteData(0x30+h);
  986.         
  987. /*显示电压的函数*/        
  988. //        s=((num*4.9869f)/16777215.0f);  //电压转换   
  989. //        s*=10000.0f;
  990. //        vv=(unsigned long)s;         
  991. //        LCD1602_WriteCom(0xCA);   //显示在第二行        显示的电压
  992. //        LCD1602_WriteData(0x30+(vv/10000));
  993. //        LCD1602_WriteData('.');        
  994. //        LCD1602_WriteData(0x30+(vv/1000%10));                          
  995. //        LCD1602_WriteData(0x30+(vv/100%10));
  996. //        LCD1602_WriteData(0x30+(vv/10%10));
  997. //        LCD1602_WriteData(0x30+(vv%10));
  998. //        LCD1602_WriteData('V');      
  999. /*显示电压的函数*/        
  1000.         
  1001.         LCD1602_WriteCom(0xCA);   //16进制的AD值显示在第二行
  1002.         LCD1602_WriteData(LCD1602_HEX_to_ASC(i));
  1003.         LCD1602_WriteData(LCD1602_HEX_to_ASC(j));
  1004.         LCD1602_WriteData(LCD1602_HEX_to_ASC(k));
  1005.         LCD1602_WriteData(LCD1602_HEX_to_ASC(l));
  1006.         LCD1602_WriteData(LCD1602_HEX_to_ASC(m));
  1007.         LCD1602_WriteData(LCD1602_HEX_to_ASC(n));
  1008. }

  1009. //延时函数
  1010. void delay10ms(void)   //误差 0us
  1011. {
  1012.     unsigned char a,b,c;
  1013.     for(c=5;c>0;c--)
  1014.         for(b=4;b>0;b--)
  1015.             for(a=248;a>0;a--);
  1016. }

  1017. void delay1ms(void)   //误差 0us
  1018. {
  1019.     unsigned char a,b;
  1020.     for(b=199;b>0;b--)
  1021.         for(a=1;a>0;a--);
  1022. }
复制代码

主程序:
  1. #include <main.h>

  2. uchar code str1[]=" Welcome to use ";
  3. uchar code str2[]="AD7799 Board 509";

  4. uchar Q_Menu=0;                                //全局变量-菜单号
  5. uchar Q_Channel=0;                        //全局变量-模拟通道(取值1,2,3)
  6. uchar Q_Gain_ADC=0;                        //全局变量-通道增益(最大128,不超过256,用uchar类型)
  7. uint  Q_Time_Settle=0;                //全局变量-转换时间(因为最大480,超过256,故用uint类型)
  8. uchar Q_Polarity=0;                        //全局变量-转换极性(1单极性 0双极性)
  9. uchar Q_Conversion_mode=0;        //全局变量-连续单次模式(1单次转换 0连续转换)
  10. uchar Q_enable_Conversion=0;//是否可以转换标志,为1代表可以转换,为0代表当前正在设置功能不能转换

  11. void main(void)
  12. {
  13.         
  14.         LCD1602_Init();                                //LCD1602初始化程序
  15.         LCD_Display_AnyStr(0x80,16,str1);                //位置  长度  指针
  16.         LCD_Display_AnyStr(0xC0,16,str2);                //位置  长度  指针
  17.         while(key1&&key2&&key3&&key4);                        //任意键继续
  18.         LCD1602_WriteCom(0x01);          //清屏
  19.         
  20.         AD7799_init_1();                        //AD7799初始化,通道3,增益1,速率120ms  
  21.         AD7799_Reset();                                //手动复位一次
  22.         
  23.         Q_Menu=0;
  24.         Q_enable_Conversion=0;
  25.         
  26.         Q_Channel=3;
  27.         Q_Gain_ADC=1;
  28.         Q_Time_Settle=120;
  29.         Q_Polarity=1;
  30.         Q_Conversion_mode=1;

  31.         
  32.         Display_Menu_0();        //显示基础框架
  33.         while(1)
  34.         {
  35.                
  36.                 if(Check_key1())                //检测设置功能键是否长按
  37.                 {
  38.                         Display_Menu_1();        //当前显示指向CHx
  39.                         Q_Menu=1;
  40.                         
  41.                         Q_enable_Conversion=0;                        //如果有按键触发,将Q_enable_Conversion置0,代表正在设置
  42.                         //再次检测是否抖动并且
  43.                         while(!Q_enable_Conversion)                //当还未按OK时,不能跳出while,只有按了OK,可以跳出本循环,执行显示数值
  44.                         {
  45.                                 Display_Menu(Judge_Key());
  46.                         }
  47.                 }
  48.                 else        //没有检测到按键
  49.                 {
  50.                         if(Q_Conversion_mode==1)        //为1代表当前是单次转换,用单次转换的读取函数
  51.                         {
  52.                                 //更新显示AD值及配置信息
  53.                                 Display_AD((float)Single_Conversion_and_Read_AD());                //更新显示AD值及配置信息
  54.                         }
  55.                         if(Q_Conversion_mode==0)        //为0代表当前是连续转换,用连续转换的读取函数
  56.                         {
  57.                                 Display_AD((float)Read_AD_Value());
  58.                         }
  59.                 }
  60.         }
  61. }

  62. uchar Check_key1(void)                        //检测设置功能键是否长按
  63. {
  64.         uint i=0;
  65.         while(!key1)                //按下了
  66.         {
  67.                 i++;                        //累加按下时间
  68.                 if(i>=40000)        //时间如果足够,则返回1
  69.                 {
  70.                         LED=0;                        //点亮
  71.                         return 1;
  72.                 }
  73.         }
  74.         return 0;                        //若按下时间不够或者没按,返回0
  75. }

  76. uchar Judge_Key(void)                //判键程序
  77. {
  78.         if(!key1)
  79.         {
  80.                 delay10ms_12M();        //10ms效抖
  81.                 if(!key1)
  82.                 {
  83.                         while(!key1);
  84.                         return 1;                //按key1
  85.                 }
  86.         }
  87.         else if(!key2)
  88.         {
  89.                 delay10ms_12M();        //10ms效抖
  90.                 if(!key2)
  91.                 {
  92.                         while(!key2);
  93.                         return 2;                //按key2
  94.                 }
  95.         }
  96.         else if(!key3)
  97.         {
  98.                 delay10ms_12M();        //10ms效抖
  99.                 if(!key3)
  100.                 {
  101.                         while(!key3);
  102.                         return 3;                //按key3
  103.                 }
  104.         }
  105.         else if(!key4)
  106.         {
  107.                 delay10ms_12M();        //10ms效抖
  108.                 if(!key4)
  109.                 {
  110.                         while(!key4);
  111.                         return 4;                //按key4
  112.                 }
  113.         }
  114.         return 0;                                //未按键或者是抖动
  115. }

  116. void Display_Menu(uchar key_Value)                //根据当前界面和按键号显示菜单内容
  117. {
  118.         if(key_Value==0)        //如果未按或者抖动直接退出
  119.         {
  120.                 return;
  121.         }
  122.         Q_enable_Conversion=0;        //为0代表正在设置功能,禁止显示
  123.         
  124.         switch (Q_Menu)                //判断当前菜单
  125.         {
  126.                 case 0:                //AD结果及设置显示界面
  127.                 {
  128.                         if(key_Value==1)
  129.                         {
  130.                                 Display_Menu_1();        //当前显示指向CHx
  131.                                 Q_Menu=1;
  132.                         }
  133.                         else if(key_Value==4)
  134.                         {
  135.                                 //fuwei
  136.                         }
  137.                         break;
  138.                 }
  139.                 case 1:                //当前显示指向CHx
  140.                 {
  141.                         if(key_Value==1)
  142.                         {
  143.                                 //fanhui
  144.                         }
  145.                         else if(key_Value==2)
  146.                         {
  147.                                 
  148. ……………………

  149. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
AD7799程序C51.zip (125.19 KB, 下载次数: 132)

评分

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

查看全部评分

回复

使用道具 举报

ID:384870 发表于 2020-4-15 15:34 | 显示全部楼层
谢谢,正在找这个代码
回复

使用道具 举报

ID:402026 发表于 2020-4-16 11:11 | 显示全部楼层
感谢您这么辛苦的整理资料,我在这里向您致敬!
回复

使用道具 举报

ID:756729 发表于 2020-5-20 18:35 | 显示全部楼层
太感谢楼主了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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