这是我的程序
#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.这是怎么回事呢、
谢谢!
此帖出自
小平头技术问答
一周热门 更多>