找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12C5A60S2单片机AD功能程序调试问题

[复制链接]
跳转到指定楼层
楼主
ID:357396 发表于 2019-5-12 17:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天在调STC12的AD功能时发现一个问题,我从P1.0到P1.6一个一个试过去,但到P1.7的时候就问题了,虽然P1.0到P1.6精度不高,但用P1.7口时,数码管一直显示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);           //写入地址,即数码管编号
  41.      Write_Max7219_byte(dat);               //写入数据,即数码管显示数字
  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个数码管显示
  49. Write_Max7219(0x0c, 0x01);       //掉电模式:0,普通模式:1
  50. Write_Max7219(0x0f, 0x00);       //显示测试:1;测试结束,正常显示: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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2019-5-13 08:27 | 只看该作者
硬件图上它们之间有区别吗?
回复

使用道具 举报

板凳
ID:213173 发表于 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)不妥,漏掉第一通道。如果所有通道设为模拟输入应设P1ASF = 0XFF;,并且设置P1端口全部为高阻        P1M1 = 0xFF; P1M0 = 0x00; 。
回复

使用道具 举报

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

迟来的感谢....
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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