找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
100黑币
大哥们   小弟刚学单片机  不是很懂  现在 有个实验一直不会  所以我想麻烦你们帮我看一下哪里错了然后怎么改

#include<stc15f2k60s2.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int

#define ADC_POWER   0x80            
#define ADC_FLAG    0x10            
#define ADC_START   0x08           


sfr ADC_LOW2    =   0xBE;           


sbit SRCLK=P4^3;
sbit SER=P4^0;
sbit RCLK=P3^4;

void adc();
uint adc_run();
void display595();
void display();
void time0_init();
void delay();
void led595(uchar h,uchar l);
void time_ris();

uint adc_data=10;
uint adc_r=0;
uchar code led[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code wex[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar ledbuf[]={0,0,0,0,0,0,0,0};
int Data[6];
int j;
uchar id=0;
void main()
{
        time0_init();
        SRCLK=0;
        SER=0;
        RCLK=0;
        adc();
        while(1)
        {        
                display();
        }
}

void adc()
{
    P1ASF = 0xff;                  
    ADC_RES = 0;                    
    ADC_CONTR =0x80;
    delay();        
}

uint adc_run()
{
   ADC_CONTR = 0x8c;
    _nop_();                       
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));
    ADC_CONTR &= ~ADC_FLAG;         
          adc_r=ADC_RES;
          //adc_r=adc_r*4;
          //adc_r=adc_r+ADC_RES;
    return adc_r;                 
}


void time0_init()
{
        TMOD=0x00;
        TH1=0x6c;
        TL1=0x76;
        ET1=1;
        TR1=1;
        EA=1;
}
void display()
{
        double a;
        a=adc_run();
        //a=a*(10000.00000/51);
        adc_data=a;
  //adc_data=adc_data;        
        ledbuf[0]=adc_data/10000000;
        ledbuf[1]=adc_data/1000000%10;
        ledbuf[2]=adc_data/100000%10;
        ledbuf[3]=adc_data/10000%10;
        ledbuf[4]=adc_data/1000%10;
        ledbuf[5]=adc_data/100%10;
        ledbuf[6]=adc_data/10%10;
        ledbuf[7]=adc_data%10;
}
void time_ris()interrupt 3
{
        TR1=0;
        display595();
        TR1=1;
}
void display595()
{
        uchar temp;
        switch(id)
        {
                case 0:               
                led595(0xff,0xff);
                temp=led[ledbuf[0]];
                led595(wex[0],temp);
                delay();id++;break;
                case 1:
                led595(0xff,0xff);
                temp=led[ledbuf[1]];
                led595(wex[1],temp);
                delay();id++;break;
                case 2:
                led595(0xff,0xff);
                temp=led[ledbuf[2]];
                led595(wex[2],temp);
                delay();id++;break;
                case 3:
                led595(0xff,0xff);
                temp=led[ledbuf[3]];
                led595(wex[3],temp);
                delay();id++;break;
    case 4:
                led595(0xff,0xff);
                temp=led[ledbuf[4]];
                led595(wex[4],temp);
                delay();id++;break;
    case 5:
                led595(0xff,0xff);
                temp=led[ledbuf[5]];
                led595(wex[5],temp);
                delay();id++;break;
                case 6:
                led595(0xff,0xff);
                temp=led[ledbuf[6]];
                led595(wex[6],temp);
                delay();id++;break;
                case 7:
                led595(0xff,0xff);
                temp=led[ledbuf[7]];
                led595(wex[7],temp);
                delay();id=0;break;        
    default:break;               
        }
}

void led595(uchar h,uchar l)
{
        uchar i,temp;
        temp=h;
        for(i=0;i<8;i++)
        {
                if(temp >=0x80)
                        SER=1;
                else
                        SER=0;
                temp<<=1;
          SRCLK=0;
                _nop_();
                _nop_();
          SRCLK=1;
        }        
        temp=l;
        for(i=0;i<8;i++)
        {
                if(temp >=0x80)
                        SER=1;
                else
                        SER=0;
                temp<<=1;
          SRCLK=0;
                _nop_();
                _nop_();
          SRCLK=1;
        }        
        RCLK=0;
        RCLK=1;
}
void delay()
{
        unsigned char i, j;

        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 10;
        do
        {
                while (--j);
        } while (--i);
}


-4a6ae0ae59c1f78e.jpg (2.06 MB, 下载次数: 91)

-4a6ae0ae59c1f78e.jpg

-2e9f7ddfe629d12d.jpg (4.48 MB, 下载次数: 83)

-2e9f7ddfe629d12d.jpg

6fb19bac5786c84f.jpg (3.58 MB, 下载次数: 85)

6fb19bac5786c84f.jpg

最佳答案

查看完整内容

选择P1.0输入模拟量,10位转换结果最大值1023。8位数码管实际只用了4位。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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. }

复制代码
回复

使用道具 举报

板凳
ID:624769 发表于 2021-11-9 12:49 | 只看该作者
1,先把数码管搞出来,ledbuf 先 =  01234567 这8个数字能正确显示了。
2,按键后,ADC 读值直接数码管显示出来,确认每个按键 ADC读值不同,并且相差的和自己预期差不多。
3,这个时候开始,给不能读值的ADC按键 分配 键值。在数码管上显示出来。

你走到哪一步?
回复

使用道具 举报

地板
ID:401564 发表于 2021-11-9 17:10 | 只看该作者
按照一楼的方法来
写程序要一步一步来
不要一下子写个上千行代码,然后一试,有问题都不知道从哪里下手
一个函数一个函数的验证正确了,再写下一个函数
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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