久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2926|回復: 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, 下載次數: 117)

-4a6ae0ae59c1f78e.jpg

-2e9f7ddfe629d12d.jpg (4.48 MB, 下載次數: 106)

-2e9f7ddfe629d12d.jpg

6fb19bac5786c84f.jpg (3.58 MB, 下載次數: 113)

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品九九在线 | 日韩国产欧美视频 | 在线日韩中文字幕 | 欧美乱淫视频 | 二区三区视频 | 亚洲最新在线视频 | 精品日韩一区二区 | 欧美色综合一区二区三区 | 伊人网综合在线 | 国产成人一区二区三区久久久 | 欧美精品在线观看 | 最近日韩中文字幕 | 成人综合一区二区 | 日韩精品久久久久 | 欧美天堂一区 | 中文字幕欧美一区二区 | 欧美一级在线免费观看 | 激情黄色在线观看 | 成人影音 | 日本不卡视频 | 亚洲精品视频免费观看 | 91在线一区 | 日韩av高清在线 | www.操.com | 国产日韩欧美一区二区 | 亚洲免费精品一区 | 欧美日韩亚洲一区 | 欧美精三区欧美精三区 | 青青久久久 | 免费成人高清在线视频 | 久久丁香 | 国产精品欧美大片 | 国产一区精品 | 男人天堂视频在线观看 | 免费福利视频一区二区三区 | 日韩福利在线 | 国产区高清 | 日韩精品在线免费 | 99久久精品免费看国产四区 | 亚洲综合99| 国产成人精品免费 |