找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2510|回復: 3
打印 上一主題 下一主題
收起左側(cè)

STC12C5A60S2單片機AD功能程序調(diào)試問題

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:357396 發(fā)表于 2019-5-12 17:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
今天在調(diào)STC12的AD功能時發(fā)現(xiàn)一個問題,我從P1.0到P1.6一個一個試過去,但到P1.7的時候就問題了,雖然P1.0到P1.6精度不高,但用P1.7口時,數(shù)碼管一直顯示4.9,  我一直找不到問題所在,求大神幫幫忙,我改的只有黑體字。。


單片機程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. float temp,v;
  6. /*Declare SFR associated with the ADC */
  7. sfr ADC_CONTR = 0xBC; //ADC control register
  8. sfr ADC_RES = 0xBD; //ADC hight 8-bit result register
  9. sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
  10. sfr P1ASF = 0x9D; //P1 secondary function contr ol register

  11. sbit Max7219_pinCLK = P2^2;
  12. sbit Max7219_pinCS  = P2^1;
  13. sbit Max7219_pinDIN = P2^0;
  14. uchar ge ,shi, bai;
  15. uchar code shuzi[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};
  16. /*Define ADC operation const for ADC_CONTR*/
  17.   #define ADC_POWER 0x80 //ADC power control bit
  18.   #define ADC_FLAG 0x10 //ADC complete flag
  19.   #define ADC_START 0x08 //ADC start control bit
  20.   #define ADC_SPEEDLL 0x00 //540 clocks

  21.   #define ADC_CHS 0x07;        // AD通道選擇  (P1.0 - 0X01,  P1.1 - 0X02  .... P1.6 - 0x06 ), 到P1.7就有問題了。。。

  22. void delay(uint n);
  23. void InitADC();

  24. void Dispaly();

  25. void Write_Max7219_byte(uchar DATA)         
  26. {
  27.             uchar i;   
  28.                 Max7219_pinCS=0;               
  29.             for(i=8;i>=1;i--)
  30.           {                  
  31.             Max7219_pinCLK=0;
  32.             Max7219_pinDIN=DATA&0x80;
  33.             DATA=DATA<<1;
  34.             Max7219_pinCLK=1;
  35.            }                                 
  36. }

  37. void Write_Max7219(uchar address,uchar dat)
  38. {
  39.      Max7219_pinCS=0;
  40.          Write_Max7219_byte(address);           //寫入地址,即數(shù)碼管編號
  41.      Write_Max7219_byte(dat);               //寫入數(shù)據(jù),即數(shù)碼管顯示數(shù)字
  42.          Max7219_pinCS=1;                        
  43. }

  44. void Init_MAX7219(void)
  45. {
  46. Write_Max7219(0x09, 0x00);       //譯碼方式:BCD碼
  47. Write_Max7219(0x0a, 0x05);       //亮度
  48. Write_Max7219(0x0b, 0x07);       //掃描界限;8個數(shù)碼管顯示
  49. Write_Max7219(0x0c, 0x01);       //掉電模式:0,普通模式:1
  50. Write_Max7219(0x0f, 0x00);       //顯示測試:1;測試結(jié)束,正常顯示:0
  51. }
  52. void voltage_display()
  53. {        uchar u;

  54.    u = v;
  55.    ge = u%10;
  56.         shi = (u%100)/10;
  57.         bai = (u%1000)/100;

  58.         Write_Max7219(1,0x01);
  59.         Write_Max7219(2,0x01);
  60.         Write_Max7219(3,shuzi[ge]);
  61.         Write_Max7219(4,shuzi[shi]);
  62.     Write_Max7219(5,shuzi[bai]);
  63.         Write_Max7219(6,0x01);
  64.         Write_Max7219(7,0x01);
  65.         Write_Max7219(8,0x01);
  66. }
  67. void main()
  68. {  
  69.     Init_MAX7219();
  70.     InitADC(); //Init ADC sfr  
  71.         IE = 0xa0; //Enable ADC interrupt and Open master interrupt switch  //Start A/D conversion
  72.         while (1)
  73.         {
  74.      voltage_display();      
  75.         }
  76. }
  77. /*---------------------------- ADC interrupt service routine ----------------------------*/

  78. void adc_isr() interrupt 5 using 1
  79. {  
  80.    ADC_CONTR &= !ADC_FLAG; //Clear ADC interrupt flag
  81.    temp = ADC_RES;
  82.    v = temp*0.1/256*500;

  83.    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ADC_CHS;
  84. }
  85. /*---------------------------- Initial ADC sfr ----------------------------*/
  86. void InitADC( )
  87. {   P1ASF = 0X80; //Set  P1.7 as analog input port   
  88.                   // P1.0 - 0X01     P1.1 - 0X02
  89.                   // P1.2 - 0X04     P1.3 - 0X08
  90.                   // P1.4 - 0X10     P1.5 - 0X20
  91.                   // P1.6 - 0X40
  92.     ADC_RES = 0; //Clear previous result

  93.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ADC_CHS;  
  94.         delay(2); //ADC power-on delay and Sta rt A/D conversion
  95. }

  96. /*---------------------------- Software delay function ----------------------------*/

  97. void delay(uint n)
  98. {  uint x;  
  99.   while (n--)  
  100.    {  x = 5000;  
  101.       while (x--);
  102.            }
  103.          
  104. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:123289 發(fā)表于 2019-5-13 08:27 | 只看該作者
硬件圖上它們之間有區(qū)別嗎?
回復

使用道具 舉報

板凳
ID:213173 發(fā)表于 2019-5-13 11:45 | 只看該作者
#define ADC_CHS 0x07;// AD通道選擇  (P1.0 - 0X01,  P1.1 - 0X02  .... P1.6 - 0x06 ), 到P1.7就有問題了。。。?????
ADC_CHS通常是一個變量,賦值范圍0x00~0x07,對應ADC通道1~8。如果使用常量只能用于一個ADC通道,樓主這樣定義(P1.0 - 0X01,  P1.1 - 0X02  .... P1.6 - 0x06)不妥,漏掉第一通道。如果所有通道設(shè)為模擬輸入應設(shè)P1ASF = 0XFF;,并且設(shè)置P1端口全部為高阻        P1M1 = 0xFF; P1M0 = 0x00; 。
回復

使用道具 舉報

地板
ID:357396 發(fā)表于 2020-8-3 10:17 | 只看該作者
wulin 發(fā)表于 2019-5-13 11:45
#define ADC_CHS 0x07;// AD通道選擇  (P1.0 - 0X01,  P1.1 - 0X02  .... P1.6 - 0x06 ), 到P1.7就有問 ...

遲來的感謝....
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表