stc12c5a60s2AD转换问题

2019-03-24 21:06发布

这是我的程序 #include <reg52.h>
#include <intrins.h>
#define FOSC    18432000L
#define BAUD    9600
#define scanp P2
#define segled P0
#define scanp P2
#define segled P0
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr ADC_CONTR   =   0xBC;          //ADC控制寄存器
sfr ADC_RES     =   0xBD;          //ADC转换结果寄存器,高8位结果寄存器
sfr ADC_LOW2    =   0xBE;          //ADC第2位结果寄存器 
sfr P1ASF       =   0x9D;          //P1口第二功能控制寄存器,置1则设置为AD输入通道
//定义ADC控制寄存器操作常量
#define ADC_POWER   0x80         //定义ADC电源控制位,0关闭,1打开   
#define ADC_FLAG    0x10            //ADC转换结束标志位
#define ADC_START   0x08            //ADC转换启动控制位
#define ADC_SPEEDLL 0x00            //ADC转换速度控制位,540个时钟周期转换一次
#define ADC_SPEEDL  0x20            //ADC转换速度控制位,360个时钟周期转换一次
#define ADC_SPEEDH  0x40            //ADC转换速度控制位,180个时钟周期转换一次
#define ADC_SPEEDHH 0x60   //ADC转换速度控制位,90个时钟周期转换一次
#define output P0    
unsigned char const duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//unsigned char code seg[]={0,1,2,3,4,5,6,7};
sbit w0=P2^0;
sbit w1=P2^1;
sbit w2=P2^2;
sbit w3=P2^3; 
void InitUart();    //声明初始化Uart函数
void SendData(BYTE dat);  //声明发送数据函数
void delay(WORD n);    //声明延时函数
void InitADC();    //声明初始化ADC函数
void leddata(unsigned char);
BYTE ch = 0;    //转换通道
void main()       //主函数
{
    InitUart();        //初始化Uart函数          
    InitADC();         //初始化ADC函数        
    IE = 0xa0;      //打开ADC中断
 output=0x01;                                                    
    while(1); } void adc_isr() interrupt 5  //ADC中断函数
{
    ADC_CONTR &= !ADC_FLAG;  //清空ADC中断标志位     
    SendData(ch);            //发送转换通道上的数据
    SendData(ADC_RES);       //得到ADC转换高八位结果并发送到UART    
    //if (++ch > 7) ch = 0;    //切换到下一个通道    
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
 
} void InitADC()   //初始化ADC
{
    P1ASF = 0x02; //设置P1口所有口都为模拟输入通道                 
    ADC_RES = 0;  //清空之前的结果                
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
    delay(2);     //ADC电源打开并延时启动转换                   
}
void InitUart()   //初始化Uart函数
{
    SCON = 0x5a;  //8位数据,无奇偶校验位                
    TMOD = 0x20;  //定时器18位自动重载                 
    TH1 = TL1 = -(FOSC/12/32/BAUD);
    TR1 = 1;      //打开定时器1                 
} void SendData(BYTE dat)   //发送数据
{
    while (!TI);         //等待结果发送,即T1=1;          
    TI = 0;              //清空定时器1标志位          
    SBUF = dat;    //发送当前数据
 leddata(ADC_RES);
}   
void leddata(unsigned char data_in)  //在数码管显示数据        
{
  int result,l0,l1,l2,l3;   //定义整形变量result
 result=data_in*5/256;
 result=result*1000;
 l0=result/1000;
 l1=result%1000/100;
 l2=result%100/10;
 l3=result%10;
 P0=duma[l0]+0x80;
 w0=0;
 w1=1;
 w2=1;
 w3=1;
 delay(2);
 
  P0=duma[l1];
  w0=1;
  w1=0;
  w2=1;
  w3=1;
 delay(2);   P0=duma[l2];
  w0=1;
  w1=1;
  w2=0;
  w3=1;
 delay(2);  P0=duma[l3];
  w0=1;
  w1=1;
  w2=1;
  w3=0;
 delay(2);
}
void delay(WORD z)    //延时函数
{
    WORD x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
} 现象和问题是数码管只有第一位会显示2,调节电位器也会发生变化,但是就是后三位一直是0.这是怎么回事呢、 谢谢! 此帖出自小平头技术问答
0条回答

一周热门 更多>