久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8437|回復: 4
打印 上一主題 下一主題
收起左側

AD7799的單片機驅動程序(帶詳細注釋,完全測試通過)

[復制鏈接]
跳轉到指定樓層
樓主
        本程序由《鄭州輕工業大學》星空總創空間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模式,因此適合于低功耗場合,
                   例如溫度、濕度等變化速度不快的參量。


單片機源程序如下:
  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, 下載次數: 140)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:384870 發表于 2020-4-15 15:34 | 只看該作者
謝謝,正在找這個代碼
回復

使用道具 舉報

板凳
ID:402026 發表于 2020-4-16 11:11 | 只看該作者
感謝您這么辛苦的整理資料,我在這里向您致敬!
回復

使用道具 舉報

地板
ID:756729 發表于 2020-5-20 18:35 | 只看該作者
太感謝樓主了
回復

使用道具 舉報

5#
ID:1144769 發表于 2025-3-11 17:16 | 只看該作者
感謝,很有幫助,不用自己挨個對寄存器了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕久久精品 | 成人蜜桃av | 国产一级免费视频 | 99视频在线 | 日韩一区在线播放 | 99精品久久久久久 | 精品视频在线观看 | 久久精品视频亚洲 | 天天干天天色 | 欧美国产亚洲一区二区 | 国产高潮av | 日韩视频在线免费观看 | 国产综合视频 | 日本免费黄色 | av网站在线播放 | 精品一区二区三区入口 | 国产精品成人一区二区三区 | 超碰天天| 国产综合第一页 | 女生羞羞视频 | 国产91丝袜在线18 | 欧美精品第三页 | 蜜桃传媒一区二区 | 精品国产乱码久久久久久88av | 午夜免费电影 | 成人免费精品视频 | 日日爱夜夜操 | 日韩精品在线播放 | 久久久久亚洲精品国产 | 最近免费日本视频在线 | 国产精品久久久久久久 | 欧美99 | 国产成人在线免费 | 丁香五月网久久综合 | 在线观看视频91 | 成人高清视频在线观看 | 免费在线成人网 | 久久久久久电影 | 国产做爰 | 超碰美女在线 | 一区二区三区小视频 |