[求助] 新手参加学院的比赛做一个测量电阻和电压的数字万用表遇到的问题,求解决!

20131348   2015-4-5 14:41 楼主
在用proteus进行仿真是,发现怎么也采集不到电压(P6.1)的模拟信号,反而只能采集到电阻(P6.0)的模拟信号。前来求助!跪谢啊!

  1. #include<msp430x24x.h>
  2. #include"wanyongbiaodianzuceliang.h"

  3. #define P2_0_high  P2OUT|=BIT0;     //控制电阻端输出高电平
  4. #define P2_0_low   P2OUT&=~BIT0;    //控制电阻端输出低电平

  5. #define RS_high   P4OUT|=BIT4;        //RS端置为高电平
  6. #define RS_low    P4OUT&=~BIT4;       //RS端置为低电平
  7. #define RW_high   P4OUT|=BIT5;        //RW端置为高电平
  8. #define RW_low    P4OUT&=~BIT5;       //rw端置为低电平
  9. #define E_high    P4OUT|=BIT6;        //e端置为高点平
  10. #define E_low     P4OUT&=~BIT6;       //e端置为低电平
  11. float results[2];
  12. unsigned char adc;
  13. unsigned int output;
  14. unsigned char shi,ge,bai,qian,wan;
  15. unsigned char code[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,};   //0~9的端码

  16. /*
  17.   lcd显示控制程序
  18. */
  19. void delay(unsigned int y)
  20. {
  21.   for(;y>0;y--){;}
  22. }
  23. /*void fbusy()
  24. {                                 //检查忙状态                  
  25.   RS_low();RW_high();
  26.   P5DIR=0X00;
  27.   E_high();E_low();
  28.   while(P5IN&0X80);
  29.   delay();
  30. }*/
  31. void write_r(unsigned char j)   
  32. {                                   //写命令程序
  33.   //fbusy();
  34.   P3DIR=0XFF;
  35.   E_low; RS_low;RW_low;
  36.   E_high;
  37.   P3OUT=j;
  38.   _NOP();
  39.   _NOP();
  40.   E_low;
  41.   delay(256);
  42. }
  43. void write_s(unsigned char j)
  44. {                                  //写数据程序
  45.   //fbusy();
  46.   P3DIR=0XFF;
  47.   E_low; RS_high;RW_low;
  48.   E_high;
  49.   P3OUT=j;
  50.   _NOP();
  51.   _NOP();
  52.   E_low;
  53.   delay(256);
  54. }

  55. void lcd_init()
  56. {
  57.   delay(2000);
  58.   write_r(0x3c);       //设置为8位 ,双行,5*7字型
  59.   delay(200);
  60.   write_r(0x3c);     //设置为8位 ,双行,5*7字型
  61.   write_r(0x01);     //清屏         
  62.   write_r(0x38);       //设置为8位 ,双行,5*7字型
  63.   write_r(0x0c);      //显示开,光标开,字符不闪
  64.   write_r(0x06);      //光标右移
  65. }
  66. void adc_init()
  67. {
  68.   adc=0; ge=shi=bai=0;
  69.   P6SEL|=BIT0+BIT1;
  70.   ADC12CTL0=ADC12ON+SHT0_2+MSC;
  71.   ADC12CTL1=SHP+CONSEQ_1;
  72.   ADC12MCTL0=INCH_0;
  73.   ADC12MCTL1=INCH_1+EOS;
  74.   ADC12IE|=BIT1;
  75.   ADC12CTL0|=ENC;
  76. }
  77. /*
  78.     电阻测量主程序
  79. */
  80. void dianzuceliang()
  81. {
  82.   lcd_init();
  83.   if(P1IN==0x36)                //2欧档
  84.   {
  85.     P2_0_low ;
  86.     write_r(0x80);             //第一行输出
  87.     write_s('R');
  88.     write_s('e');
  89.     write_s('s');
  90.     write_s(':');
  91.     write_s(' ');
  92.     write_s('0');
  93.     write_s('~');
  94.     write_s('~');
  95.     write_s('2');
  96.     write_s(0xf4);
  97.    
  98.     write_r(0xc4);            //第二行第四列输出
  99.     write_s('R');
  100.     write_s(' ');
  101.     write_s('=');
  102.     write_s(' ');
  103.     write_s(' ');
  104.     write_s(' ');
  105.     write_s(' ');
  106.     write_s('(');
  107.     write_s(0xf4);
  108.     write_s(')');
  109.     adc_init();
  110.     _EINT();
  111.     while(1)
  112.     {
  113.       ADC12CTL0|=ADC12SC;
  114.       if(adc==1)
  115.       {
  116.         results[0]=(results[0]*33)/4096;
  117.         output=(unsigned int)(results[0]*1000);
  118.         output=20206-output;
  119.         output=200-output;
  120.         adc=0;
  121.       }
  122.        bai=output/100;
  123.        shi=output%100/10;
  124.        ge=output%10;
  125.        write_r(0xc7);
  126.        write_s(code[bai]);
  127.        write_s('.');
  128.        write_s(code[shi]);
  129.        write_s(code[ge]);
  130.       if(P1IN!=0X36)  break;   delay(60000);
  131.     }
  132.   }
  133.   else if(P1IN==0x2e)        //200欧档
  134.   {
  135.     P2_0_high;
  136.    write_r(0x80);            //第一行输出
  137.    write_s('R');
  138.    write_s('e');
  139.    write_s('s');
  140.    write_s(':');
  141.    write_s(' ');
  142.    write_s('2');
  143.    write_s('~');
  144.    write_s('~');
  145.    write_s('2');
  146.    write_s('0');
  147.    write_s('0');
  148.    write_s(0xf4);
  149.   
  150.    write_r(0xc4);            //第二行第四列输出
  151.    write_s('R');
  152.    write_s(' ');
  153.    write_s('=');
  154.    write_s(' ');
  155.    write_s(' ');
  156.    write_s(' ');
  157.    write_s(' ');
  158.    write_s('(');
  159.    write_s(0xf4);
  160.    write_s(')');
  161.    adc_init();
  162.    _EINT();
  163.    while(1)
  164.    {
  165.      ADC12CTL0|=ADC12SC;
  166.      if(adc==1)
  167.      {
  168.         results[0]=(results[0]*33)/4096;
  169.         output=(unsigned int)(results[0]*1000);
  170.         adc=0;
  171.      }

  172.      if(10000<=output&&output<=20000)
  173.      {
  174.        wan=output/10000;
  175.        qian=output%10000/1000;
  176.        bai=output%1000/100;
  177.        write_r(0xc7);
  178.        write_s(code[wan]);
  179.        write_s(code[qian]);
  180.        write_s(code[bai]);
  181.        write_s(' ');}
  182.        else if(1000<=output&&output<10000)
  183.       {
  184.         qian=output/1000;
  185.         bai=output%1000/100;
  186.         shi=output%100/10;
  187.         write_r(0xc7);
  188.         write_s(code[qian]);
  189.         write_s(code[bai]);
  190.         write_s('.');
  191.         write_s(code[shi]);}
  192.        else if(100<=output&&output<1000)
  193.       {
  194.         bai=output/100;
  195.         shi=output%100/10;
  196.         ge=output%10;
  197.         write_r(0xc7);
  198.         write_s(code[bai]);
  199.         write_s('.');
  200.         write_s(code[shi]);
  201.         write_s(code[ge]);
  202.       }
  203.      if(P1IN!=0x2e) break;       delay(60000);
  204.    }  
  205.   }
  206.   else if(P1IN==0x1e)       //2M档电阻
  207.   {
  208.     P2_0_high;
  209.    write_r(0x80);            //第一行输出
  210.    write_s('R');
  211.    write_s('e');
  212.    write_s('s');
  213.    write_s(':');
  214.    write_s(' ');
  215.    write_s('2');
  216.    write_s('0');
  217.    write_s('0');
  218.    write_s('~');
  219.    write_s('~');
  220.    write_s('2');
  221.    write_s('M');
  222.    write_s(0xf4);
  223.   
  224.    write_r(0xc4);            //第二行第四列输出
  225.    write_s('R');
  226.    write_s(' ');
  227.    write_s('=');
  228.    write_s(' ');
  229.    write_s(' ');
  230.    write_s(' ');
  231.    write_s(' ');
  232.    write_s(' ');
  233.    write_s('(');
  234.    write_s('k');
  235.    write_s(0xf4);
  236.    write_s(')');
  237.    adc_init();
  238.    _EINT();
  239.    do
  240.    {
  241.      ADC12CTL0|=ADC12SC;
  242.      if(adc==1)
  243.       {
  244.         results[0]=(results[0]*33)/4096;
  245.         output=(unsigned int)(results[0]*1000);
  246.         output=18014-output;
  247.         output=output/9;
  248.         output=2000-output;
  249.         adc=0;
  250.       }
  251.       qian=output/1000;
  252.       bai=output%1000/100;
  253.       shi=output%100/10;
  254.       ge=output%10;
  255.       write_r(0xc7);
  256.       if(qian!=0) {write_s(code[qian]);}
  257.       write_s(code[bai]);
  258.       write_s(code[shi]);
  259.       write_s(code[ge]);                delay(60000);
  260.    }while(P1IN==0x1e);
  261.   }
  262. }

  263. #pragma vector= ADC12_VECTOR
  264. __interrupt void ADC12ISR(void)
  265. {
  266.     results[0]=ADC12MEM0;
  267.     results[1]=ADC12MEM1;
  268.     adc=1;
  269. }

  270. /*
  271.   电压测量主程序
  272. */

  273. void dianyaceliang()           //直流电压
  274. {
  275.     lcd_init();   
  276.     P2_2_high;
  277.     write_r(0x80);             //第一行输出
  278.     write_s('D');
  279.     write_s('C');
  280.     write_s(' ');
  281.     write_s('V');
  282.     write_s('O');
  283.     write_s('L');
  284.     write_s(':');
  285.     write_s(' ');
  286.     write_s('0');
  287.     write_s('~');
  288.     write_s('~');
  289.     write_s('2');
  290.     write_s('0');
  291.     write_s('V');
  292.    
  293.     write_r(0xC2);            //第二行第四列输出
  294.     write_s('V');
  295.     write_s('O');
  296.     write_s('L');
  297.     write_s(' ');
  298.     write_s('=');
  299.     write_s(' ');
  300.     write_s(' ');
  301.     write_s(' ');
  302.     write_s(' ');
  303.     write_s(' ');
  304.     write_s('(');
  305.     write_s('V');
  306.     write_s(')');
  307.     adc_init();
  308.     _EINT();
  309.    do
  310.     {
  311.       ADC12CTL0|=ADC12SC;
  312.       if(adc==1)
  313.       {
  314.         results[1]=(results[1]*33)/4096;
  315.         output=(unsigned int)(results[1]*1000);
  316.         adc=0;
  317.       }
  318.       if(output>=10000){
  319.                    wan=output/10000;
  320.                    qian=output%10000/1000;
  321.                    bai=output%1000/100;
  322.                    shi=output%100/10;
  323.                    write_r(0xc7);
  324.                    write_s(code[wan]);
  325.                    write_s(code[qian]);
  326.                    write_s('.');
  327.                    write_s(code[bai]);
  328.                    write_s(code[shi]);}
  329.       else if(output<10000){
  330.                        qian=output%10000/1000;
  331.                        bai=output%1000/100;
  332.                        shi=output%100/10;
  333.                        ge=output%10;
  334.                        write_r(0xc7);
  335.                        write_s(code[qian]);
  336.                        write_s('.');
  337.                        write_s(code[bai]);
  338.                        write_s(code[shi]);
  339.                        write_s(code[ge]);}    delay(60000);   
  340.     }while(P1IN==0x3d);   
  341. }

回复评论 (1)

看看你选择的模拟通道是哪一路,是P6.0那一路对应的通道号,还是P6.1对应的那一路通道号
点赞  2015-4-6 00:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复