找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3224|回复: 1
收起左侧

stc15单片机AD转换设计并进行串口通信源程序

[复制链接]
ID:353123 发表于 2019-1-2 22:34 | 显示全部楼层 |阅读模式
基于stc15系列单片机 AD转换设计并进行串口通信源程序

单片机源程序如下:
  1. #include<STC15.h>
  2. #include<intrins.h>
  3. #define BYTE unsigned char
  4. #define WORD unsigned int
  5. #define ADC_POWER   0x80            //ADC电源控制位
  6. #define ADC_FLAG    0x10            //ADC完成标志
  7. #define ADC_START   0x08            //ADC起始控制位
  8. #define ADC_SPEEDLL 0x00            //540个时钟
  9. #define ADC_SPEEDL  0x20            //360个时钟
  10. #define ADC_SPEEDH  0x40            //180个时钟
  11. #define ADC_SPEEDHH 0x60            //90个时钟
  12. void delay(WORD i);                 //数码管延时函数
  13. void lintADC();                                    //ADC特殊功能寄存器初始化          
  14. BYTE GetADCResult(BYTE ch) ;        //ADC结果返回函数
  15. void InitUart();                            //串口初始化
  16. void SendData(BYTE dat);            //串口发送
  17. void Time();                                            //定时器初始化
  18. float num;
  19. bit p=1,p1=1;
  20. WORD a0,a1,a2,a3,a4,a5,a6,a7,j=0,i,k=0,sum=0,n=0,RESULT,RESULT1;
  21. BYTE code AA[]={0x80,0xE5,0x28,0x24,0x45,0x82};                            //0.~4.字形码
  22. BYTE code BB[]={0x82,0xE7,0x2A,0x26,0x47,0x16,0x12,0xA7,0x02,0x06}; //0~9字形码
  23. BYTE code CC[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};        //0~9 ASCII码
  24.   /*~~~~~~~~~~~~~~~主函数~~~~~~~~~~~~~~~*/
  25. void  main()
  26. {  
  27.           
  28.    lintADC();                                            //ADC特殊功能寄存器初始化
  29.    InitUart();                                            //串口初始化
  30.    //P3=0xff;       
  31.    Time();                                                    //定时器初始化
  32.      while(1)
  33. {         
  34.                  if(n==100)
  35.                  {
  36.                  GetADCResult(7);}
  37.                  switch(j)
  38.                  {
  39.                       case 1:                                    // 判断j是否为1
  40.                         {
  41.                                  P37=0;
  42.                          P2=AA[a0];       
  43.                         }break;       
  44.                         case 2:                                    // 判断j是否为2
  45.                         {
  46.                                  P2=0xff;
  47.                                  P37=1;
  48.                         } break;
  49.                         case 3:                                    // 判断j是否为3
  50.                         {       
  51.                                 P36=0;
  52.                         P2=BB[a1];
  53.                         } break;
  54.                         case 4:                                        // 判断j是否为4
  55.                         {        P2=0xff;
  56.                                 P36=1;
  57.                         } break;
  58.                     case 5:                                    // 判断j是否为5
  59.                         {
  60.                                 P35=0;
  61.                         P2=BB[a2];
  62.                 /*           if(SBUF==2)
  63.                         {        if(0<i&&i<1000)
  64.                            {       
  65.                                  GetADCResult(7);
  66.                                          if(SBUF==1|SBUF==2)
  67.                      {
  68.                            a4=CC[a0];
  69.                                a5=CC[a1];
  70.                                a6=CC[a2];
  71.                                a7=CC[a3];         
  72.                                  SendData(a4);
  73.                                SendData(0x2e);
  74.                                SendData(a5);
  75.                                SendData(a6);
  76.                                SendData(a7);
  77.                                SendData(0x20);       
  78.                                
  79.                      }
  80.                                 }
  81.                         }        */
  82.                             
  83.                         } break;
  84.                         case 6:                                  // 判断j是否为6
  85.                         {        P2=0xff;
  86.                                 P35=1;
  87.                         } break;
  88.                         case 7:                                 // 判断j是否为7
  89.                         {
  90.                                 P34=0;
  91.                         P2=BB[a3];       
  92.                         } break;
  93.                     case 8:                                 // 判断j是否为8
  94.                         {         P2=0xff;
  95.                                 P34=1;
  96.                         } break;
  97.                         case 10:                         // 判断j是否为10
  98.                         {/*        if(0<i&&i<1000)
  99.                            {       
  100.                                //  GetADCResult(7);     //返回通道1 ADC结果
  101.                                          if(SBUF==1|SBUF==2)
  102.                      {
  103.                            a4=CC[a0];                          //发送电压值
  104.                                a5=CC[a1];
  105.                                a6=CC[a2];
  106.                                a7=CC[a3];         
  107.                                  SendData(a4);
  108.                                SendData(0x2e);
  109.                                SendData(a5);
  110.                                SendData(a6);
  111.                                SendData(a7);
  112.                                SendData(0x20);       
  113.                                
  114.                      }
  115.                                 } */
  116.                         } break;
  117.                        
  118.                 }
  119.    }
  120. }

  121. void lintADC()
  122. {
  123.         P1ASF=0xff;                //选择P1口作为AD转换口
  124.         ADC_RES=0;
  125.     ADC_RESL=0;
  126.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  127.         delay(10);

  128. }
  129. BYTE GetADCResult(BYTE ch)
  130. {
  131.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  132.     _nop_();                        //等待4个NOP
  133.     _nop_();
  134.     _nop_();
  135.     _nop_();
  136.     while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
  137.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC
  138.         RESULT=ADC_RES;
  139.         RESULT=RESULT<<2;
  140.         RESULT1=ADC_RESL;
  141.         RESULT=(RESULT|RESULT1);
  142.     return RESULT;                 //返回ADC结果
  143. }
  144. void delay(unsigned int i)
  145. {
  146.         unsigned int m,n;
  147.         for(m=i;m>0;m--)
  148.                 for(n=90;n>0;n--);
  149. }
  150. void SendData(BYTE dat)
  151. {        SBUF = dat;                     //发送当前数据
  152.     while (!TI);                    //等待前一个数据发送完成
  153.     TI = 0;                         //清除发送标志
  154.    
  155. }
  156. void InitUart()
  157. {
  158.         AUXR=(AUXR|0x11);                        //定时器2作为串口波特率发生器
  159.         T2H=0xFF;                                                //波特率为115200
  160.         T2L=0xFE;
  161.     SCON = 0x50;
  162. }
  163. void Time()                        
  164. {   
  165.     AUXR=AUXR&0x3f;
  166.         TMOD=0x00;                                           //定时器T0,T1选择方式0
  167.         TH0=0xFC;                      //定时器T0定时1ms
  168.         TL0=0x66;
  169.         EA=1;
  170.         ET0=1;
  171.         TR0=1;                                       
  172. }  
  173. timer2()interrupt 1
  174. {          n++;
  175.       j++;
  176.           i++;
  177.           if(i==2000)
  178.           i=0;
  179.           if(j==11)
  180.           j=0;
  181.           if(n==101)
  182.           n=0;
  183.           num=RESULT/1024.0*5;              //计算电压值
  184.           a0=(int)num;
  185.           a1=(int)(num*10);
  186.           a1=a1%10;
  187.           a2=(int)(num*100);
  188.           a2=a2%10;
  189.           a3=(int)(num*1000);                          
  190.           a3=a3%10;
  191. }
复制代码

所有资料51hei提供下载:
AD转换.zip (8.72 KB, 下载次数: 42)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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