找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9958|回复: 5
打印 上一主题 下一主题
收起左侧

单片机多通道AD采集源程序(8路) STC15w系列

  [复制链接]
跳转到指定楼层
楼主
12864为串行接法。AD0~AD4接的5V电源。
AD5~AD7接的GND。

STC15W408AS 自带8路10位AD  
程序只使用了高八位。量程为255.
程序里面含10位AD采集。1024。
代码已注释。
新手上路。有错误还请斧正。

制作出来的实物图如下:


单片机源程序如下:
  1. #include <STC15.h>
  2. #include"intrins.h"
  3. #define uchar unsigned char;
  4. #define uint unsigned int;

  5. uchar a1,b1; //接收高八位,低八位
  6. uint ad1;    //用于接收10位AD数据

  7. #define  ADC_POWER 0X80; // 上电状态
  8. #define  ADC_FLAG  0x10; // FLAG=1,结束转换。ADC_FLAG:A/D转换结束标志位
  9. #define  ADC_START 0X08; // START=1,开始转换。
  10. #define  ADC_SPEEDLL 0X00; //540个时钟
  11. #define  ADC_SPEEDL  0X20; //360个时钟
  12. #define  ADC_SPEEDH  0X40; //180个时钟
  13. #define  ADC_SPEEDHH  0X60;//90个时钟
  14. /*12864显示*/
  15. unsigned char tab[]= {"AD1:    AD2:    "};
  16. unsigned char tab1[]={"AD3:    AD4:    "};
  17. unsigned char tab2[]={"AD5:    AD6:    "};
  18. unsigned char tab3[]={"AD7:    AD8:    "};
  19. uchar num[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0~9
  20. sbit rw=P2^6;                //12864 input
  21. sbit e=P2^7;                 //12864 clock
  22. uint ADC_data;               //高八位数据
  23. void chushihua();            //12864初始化
  24. void zhiling(unsigned char zhiling);
  25. void shuru(unsigned char n);
  26. void shuju(unsigned char shuju);
  27. void guding();
  28. void ADC_init();
  29. uchar ADC_P(unsigned char ch);
  30. void delay(unsigned char x)
  31. {
  32.         while(x--);
  33. }
  34. void main()
  35. {
  36.         TMOD=0X11;
  37.         TH0=0X3C;
  38.         TL0=0XB0;
  39.         EA=1;
  40.         ET0=1;
  41.         TR0=1;
  42.         chushihua();//12864初始化程序
  43.         ADC_init(); //ADC初始化程序
  44.        
  45.         while(1)
  46.         {

  47.                 ADC_data=ADC_P(0);//ad通道1
  48.           delay(5);
  49.                 tab[4]=num[ADC_data/1000];
  50.                 delay(5);
  51.                 tab[5]=num[ADC_data%1000/100];
  52.                 delay(5);
  53.                 tab[6]=num[ADC_data%100/10];
  54.                 delay(5);
  55.                 tab[7]=num[ADC_data%10];
  56.                
  57.                 ADC_data=ADC_P(1);//ad通道2
  58.           delay(5);
  59.                 tab[12]=num[ADC_data/1000];
  60.                 delay(5);
  61.                 tab[13]=num[ADC_data%1000/100];
  62.                 delay(5);
  63.                 tab[14]=num[ADC_data%100/10];
  64.                 delay(5);
  65.                 tab[15]=num[ADC_data%10];
  66.        
  67.                 ADC_data=ADC_P(2);//ad通道3
  68.           delay(5);
  69.                 tab1[4]=num[ADC_data/1000];
  70.                 delay(5);
  71.                 tab1[5]=num[ADC_data%1000/100];
  72.                 delay(5);
  73.                 tab1[6]=num[ADC_data%100/10];
  74.                 delay(5);
  75.                 tab1[7]=num[ADC_data%10];
  76.                
  77.                 ADC_data=ADC_P(3);//ad通道4
  78.           delay(5);
  79.                 tab1[12]=num[ADC_data/1000];
  80.                 delay(5);
  81.                 tab1[13]=num[ADC_data%1000/100];
  82.                 delay(5);
  83.                 tab1[14]=num[ADC_data%100/10];
  84.                 delay(5);
  85.                 tab1[15]=num[ADC_data%10];
  86.                
  87.                 ADC_data=ADC_P(4);//ad通道5
  88.           delay(5);
  89.                 tab2[4]=num[ADC_data/1000];
  90.                 delay(5);
  91.                 tab2[5]=num[ADC_data%1000/100];
  92.                 delay(5);
  93.                 tab2[6]=num[ADC_data%100/10];
  94.                 delay(5);
  95.                 tab2[7]=num[ADC_data%10];
  96.                
  97.                 ADC_data=ADC_P(5);//ad通道6
  98.           delay(5);
  99.                 tab2[12]=num[ADC_data/1000];
  100.                 delay(5);
  101.                 tab2[13]=num[ADC_data%1000/100];
  102.                 delay(5);
  103.                 tab2[14]=num[ADC_data%100/10];
  104.                 delay(5);
  105.                 tab2[15]=num[ADC_data%10];
  106.                
  107.                 ADC_data=ADC_P(6);//ad通道7
  108.           delay(5);
  109.                 tab3[4]=num[ADC_data%1000/100];
  110.                 delay(5);
  111.                 tab3[5]=num[ADC_data%1000/100];
  112.                 delay(5);
  113.                 tab3[6]=num[ADC_data%100/10];
  114.                 delay(5);
  115.                 tab3[7]=num[ADC_data%10];
  116.                
  117.                 ADC_data=ADC_P(7);//ad通道8
  118.           delay(5);
  119.                 tab3[12]=num[ADC_data/1000];
  120.                 delay(5);
  121.                 tab3[13]=num[ADC_data%1000/100];
  122.                 delay(5);
  123.                 tab3[14]=num[ADC_data%100/10];
  124.                 delay(5);
  125.                 tab3[15]=num[ADC_data%10];
  126.                 guding();
  127.         }
  128. }
  129. /****************
  130. *以下关于ADC
  131. *****************/
  132. void ADC_init() //adc初始化
  133. {
  134.         P1ASF=0XFF;     //设置P1为ADC采集
  135.         ADC_RES=0;                        //清除高八位结果寄存器
  136.         ADC_CONTR=0XE0; //ADC上电  A/D转换周期90个时钟周期
  137.         delay(5);
  138. }

  139. uchar ADC_P(unsigned char ch) //ADC处理函数
  140. {
  141.         ADC_CONTR&=~ADC_FLAG;  //关闭标志位
  142.         ADC_CONTR=0X80|0X00|0X08|ch;
  143.         _nop_();_nop_();_nop_();_nop_();
  144.         while(!(ADC_CONTR&0x10));//等待ADC转换完成

  145.         return ADC_RES;  //返回ADC结果  8位AD
  146.        
  147. /*   ADC_CONTR &= !ADC_FLAG;         //清除ADC中断标志
  148.           delay(30);
  149.     ADC_CONTR=0x80|0x00|0x08|0x00;
  150.           a1=ADC_RES;  //高8位
  151.           b1=ADC_RESL; //低8位
  152.           delay(60);
  153. //        ADC_data=(a1<<2)|(b1>>6); //10AD  */
  154. }
  155. /*************************
  156. *
  157. *
  158. *以下12864相关子函数
  159. *
  160. *************************/
  161. void shuru(unsigned char n)
  162. {
  163.         unsigned char a;
  164.         for(a=0;a<8;a++)
  165.         {
  166.                 e=0;
  167.                 if((n<<a)&(0x80)) //串行输入
  168.                 {
  169.                         rw=1;
  170.                 }                                            
  171.                 else
  172.                 {
  173.                         rw=0;
  174.                 }
  175.                 e=1;        //移位时钟
  176.                 e=0;
  177.         }
  178. }
  179. void zhiling(unsigned char zhiling)         //写指令
  180. {
  181.         shuru(0xf8);
  182.         shuru(zhiling&(0xf0));
  183.         shuru((zhiling<<4)&(0xf0));
  184.         delay(2);
  185. }
  186. void shuju(unsigned char shuju)                  //写数据
  187. {
  188.         shuru(0xfa);
  189.         shuru(shuju&(0xf0));
  190.         shuru((shuju<<4)&(0xf0));
  191.         delay(2);
  192. }
  193. void chushihua()
  194. {
  195.         zhiling(0x30);
  196.         delay(1);
  197.         zhiling(0x0c);        //打开显示,无光标,光标不反光
  198.         zhiling(0x01);        //清屏
  199.         delay(1);
  200. }
  201. void guding()
  202. {
  203.         unsigned char i;
  204.         zhiling(0x80);
  205.         for(i=0;i<16;i++)
  206.         {
  207.                 shuju(tab[i]);
  208.                 delay(3);
  209.         }
  210.         zhiling(0x90);
  211.         for(i=0;i<16;i++)
  212.         {
  213.                 shuju(tab1[i]);
  214.                 delay(3);
  215.         }
  216.         zhiling(0x88);
  217.         for(i=0;i<16;i++)
  218.         {
  219.                 shuju(tab2[i]);
  220.                 delay(3);
  221.         }
  222.         zhiling(0x98);
  223.         for(i=0;i<16;i++)
  224.         {
  225.                 shuju(tab3[i]);
  226.                 delay(3);
  227.         }
  228. }

  229. void time0() interrupt 1
  230. {
  231.         TH0=0X3C;
  232.         TL0=0XB0;
  233.        
  234. }
复制代码

所有资料51hei提供下载:
多通道AD采集.zip (49.63 KB, 下载次数: 190)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:813923 发表于 2020-8-13 16:57 | 只看该作者
有没有proteus仿真电路鸭?
回复

使用道具 举报

板凳
ID:646328 发表于 2020-11-16 15:52 | 只看该作者
uchar ADC_P(unsigned char ch) //ADC处理函数
{
        ADC_CONTR&=~ADC_FLAG;  //关闭标志位
        ADC_CONTR=0X80|0X00|0X08|ch;
        _nop_();_nop_();_nop_();_nop_();
        while(!(ADC_CONTR&0x10));//等待ADC转换完成

        return ADC_RES;  //返回ADC结果  8位AD
      
/*   ADC_CONTR &= !ADC_FLAG;         //清除ADC中断标志
          delay(30);
    ADC_CONTR=0x80|0x00|0x08|0x00;
          a1=ADC_RES;  //高8位
          b1=ADC_RESL; //低8位
          delay(60);
//        ADC_data=(a1<<2)|(b1>>6); //10AD  */

}如果使用10位ad,不应该是
/*   ADC_CONTR &= !ADC_FLAG;         //清除ADC中断标志
          delay(30);
    ADC_CONTR=0x80|0x00|0x08|0x00;
          a1=ADC_RES;  //高8位
          b1=ADC_RESL; //低8位
          delay(60);
//        ADC_data=(b1<<2)|(a1>>6); //10AD  */
,详情请看图片

51hei截图_20201116155222.png (38.13 KB, 下载次数: 85)

51hei截图_20201116155222.png

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:996527 发表于 2022-3-25 22:28 | 只看该作者
good,程序学习下,请问有没有具体电路连接呢
回复

使用道具 举报

5#
ID:361216 发表于 2022-5-24 15:16 | 只看该作者
不错的资料,正是我想找了东西。
回复

使用道具 举报

6#
ID:97678 发表于 2023-4-18 12:48 | 只看该作者
10位 ADC 采集部分程序有问题
做如下修改编译就可以通过, 这样修改可以吗?
/****************
*以下关于ADC
*****************/
void ADC_init() //adc初始化
{
        P1ASF=0XFF;     //设置P1为ADC采集
        ADC_RES=0;        //清除高八位结果寄存器
        ADC_CONTR=0XE0; //ADC上电  A/D转换周期90个时钟周期
        delay(5);
}

uchar ADC_P(unsigned char ch) //ADC处理函数
{
ADC_CONTR &= !ADC_FLAG;         //清除ADC中断标志
          delay(30);
    ADC_CONTR=0x80|0x00|0x08|ch;
          a1=ADC_RES;  //高8位
          b1=ADC_RESL; //低8位
          delay(60);
        ADC_data=(a1<<2)|(b1>>6); //10AD  */

/*        ADC_CONTR&=~ADC_FLAG;  //关闭标志位
        ADC_CONTR=0X80|0X00|0X08|ch;
        _nop_();_nop_();_nop_();_nop_();  */
       
/*   ADC_CONTR &= !ADC_FLAG;         //清除ADC中断标志
          delay(30);
    ADC_CONTR=0x80|0x00|0x08|0x00;
          a1=ADC_RES;  //高8位
          b1=ADC_RESL; //低8位
          delay(60);
//        ADC_data=(a1<<2)|(b1>>6); //10AD  */

              while(!(ADC_CONTR&0x10));//等待ADC转换完成

        return ADC_RES;  //返回ADC结果  8位AD
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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