找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

stc15f2k60s2单片机AD转换和数据采集程序问题

查看数: 3081 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-11-9 10:39

正文摘要:

大哥们   小弟刚学单片机  不是很懂  现在 有个实验一直不会  所以我想麻烦你们帮我看一下哪里错了然后怎么改 #include<stc15f2k60s2.h> #include<intrins.h> ...

回复

ID:401564 发表于 2021-11-9 17:10
按照一楼的方法来
写程序要一步一步来
不要一下子写个上千行代码,然后一试,有问题都不知道从哪里下手
一个函数一个函数的验证正确了,再写下一个函数
ID:624769 发表于 2021-11-9 12:49
1,先把数码管搞出来,ledbuf 先 =  01234567 这8个数字能正确显示了。
2,按键后,ADC 读值直接数码管显示出来,确认每个按键 ADC读值不同,并且相差的和自己预期差不多。
3,这个时候开始,给不能读值的ADC按键 分配 键值。在数码管上显示出来。

你走到哪一步?
ID:213173 发表于 2021-11-9 10:39
选择P1.0输入模拟量,10位转换结果最大值1023。8位数码管实际只用了4位。
  1. #include <STC15F2K60S2.H>
  2. #include<intrins.h>
  3. //#include<math.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. //宏定义ADC的操作命令
  7. #define ADC_POWER   0x80                        //ADC power control dit (宏定义ADC电源控制位)1000 0000
  8. #define ADC_START   0x08                        //ADC start control dit (宏定义ADC启动控制位)0000 1000
  9. #define ADC_FLAG    0x10                        //ADC complete flag (宏定义ADC完成标志位)    0001 0000
  10. #define ADC_SPEEDLL 0x00                        //420 clocks (宏定义420时钟)速度控制         0000 0000           
  11. //sfr ADC_LOW2=0xBE;//STC15系列           
  12. sbit SRCLK= P4^3;
  13. sbit SER  = P4^0;
  14. sbit RCLK = P3^4;

  15. void InitADC();
  16. uint adc_run(uchar CHA);
  17. void display595();
  18. void display();
  19. //void time0_init();
  20. void delay();
  21. void led595(uchar h,uchar l);
  22. void time_ris();

  23. //uint adc_data=10;
  24. //uint adc_r=0;
  25. uchar code led[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
  26. uchar code wex[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  27. uchar ledbuf[]={10,10,10,10,0,0,0,0};
  28. //int Data[6];
  29. //int j;
  30. uchar id=0;

  31. void main()
  32. {
  33. //        time0_init();
  34. //        SRCLK=0;
  35. //        SER=0;
  36. //        RCLK=0;
  37.         InitADC();       
  38.         while(1)
  39.         {        
  40.                 display();
  41.                 display595();
  42.         }
  43. }

  44. void InitADC()
  45. {
  46.         P1M1 = 0x01;                                         //设置P1.0高阻
  47.         P1M0 = 0x00;                                         //设置P1.0高阻
  48.         P1ASF = 0x01;                                        //设置P1.0模拟输入
  49.         ADC_RES = 0;
  50.         ADC_RESL= 0;
  51.         ADC_CONTR =0x80;                                //开启ADC电源
  52.         delay();
  53. }

  54. uint adc_run(uchar CHA)
  55. {
  56.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL|CHA|ADC_START;//启动转换1000 1000
  57.     _nop_();                        //延时确保正确读到ADC_CONTR寄存器的值
  58.     _nop_();
  59.     _nop_();
  60.     _nop_();
  61.         while(!(ADC_CONTR & ADC_FLAG));        //等待ADC转换完成标志置位 1001 1000
  62.         ADC_CONTR &=~ADC_FLAG;                        //关闭ADC
  63.         return ADC_RES<<2|ADC_RESL ;        //返回十位ADC结果,0~1023
  64. }
  65. /*
  66. void time0_init()
  67. {
  68.         TMOD=0x00;
  69.         TH1=0x6c;
  70.         TL1=0x76;
  71.         ET1=1;
  72.         TR1=1;
  73.         EA=1;
  74. }*/
  75. void display()
  76. {
  77.         uint a;
  78.         a=adc_run(0);   
  79.         ledbuf[4]=a/1000%10;
  80.         ledbuf[5]=a/100%10;
  81.         ledbuf[6]=a/10%10;
  82.         ledbuf[7]=a%10;
  83. }
  84. /*
  85. void time_ris()interrupt 3
  86. {
  87.         TR1=0;
  88.         display595();
  89.         TR1=1;
  90. }*/
  91. void display595()
  92. {
  93.         uchar temp;
  94.         switch(id)
  95.         {
  96.                 case 0:               
  97.                         led595(0xff,0xff);
  98.                         temp=led[ledbuf[0]];
  99.                         led595(wex[0],temp);
  100.                         delay();id++;break;
  101.                 case 1:
  102.                         led595(0xff,0xff);
  103.                         temp=led[ledbuf[1]];
  104.                         led595(wex[1],temp);
  105.                         delay();id++;break;
  106.                 case 2:
  107.                         led595(0xff,0xff);
  108.                         temp=led[ledbuf[2]];
  109.                         led595(wex[2],temp);
  110.                         delay();id++;break;
  111.                 case 3:
  112.                         led595(0xff,0xff);
  113.                         temp=led[ledbuf[3]];
  114.                         led595(wex[3],temp);
  115.                         delay();id++;break;
  116.                 case 4:
  117.                         led595(0xff,0xff);
  118.                         temp=led[ledbuf[4]];
  119.                         led595(wex[4],temp);
  120.                         delay();id++;break;
  121.                 case 5:
  122.                         led595(0xff,0xff);
  123.                         temp=led[ledbuf[5]];
  124.                         led595(wex[5],temp);
  125.                         delay();id++;break;
  126.                 case 6:
  127.                         led595(0xff,0xff);
  128.                         temp=led[ledbuf[6]];
  129.                         led595(wex[6],temp);
  130.                         delay();id++;break;
  131.                 case 7:
  132.                 led595(0xff,0xff);
  133.                 temp=led[ledbuf[7]];
  134.                 led595(wex[7],temp);
  135.                 delay();id=0;break;
  136.                 default:break;
  137.         }
  138. }

  139. void led595(uchar h,uchar l)
  140. {
  141.         uchar i,temp;
  142.         temp=h;
  143.         for(i=0;i<8;i++)
  144.         {
  145.                 if(temp&0x80)
  146.                         SER=1;
  147.                 else
  148.                         SER=0;
  149.                 temp<<=1;
  150.                 SRCLK=0;
  151.                 _nop_();
  152.                 _nop_();
  153.                 SRCLK=1;
  154.         }        
  155.         temp=l;
  156.         for(i=0;i<8;i++)
  157.         {
  158.                 if(temp&0x80)
  159.                         SER=1;
  160.                 else
  161.                         SER=0;
  162.                 temp<<=1;
  163.                 SRCLK=0;
  164.                 _nop_();
  165.                 _nop_();
  166.                 SRCLK=1;
  167.         }        
  168.         RCLK=0;
  169.         RCLK=1;
  170. }
  171. void delay()                //1ms@11.0592MHz
  172. {
  173.         unsigned char i, j;
  174.         _nop_();
  175.         _nop_();
  176.         _nop_();
  177.         i = 11;
  178.         j = 190;
  179.         do
  180.         {
  181.                 while (--j);
  182.         } while (--i);
  183. }

复制代码

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

Powered by 单片机教程网

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