MCU用的是STC15F2K60S2,外部硬件电路为一个20K的电位器,中间脚滑动端接AD输入引脚P1.0,另外两边引脚分别接GND和VCC,目前代码可以通过旋转电位器实现在四位一体共阴数码管上显示0~1023的数值,但是下一步想尝试显示电压值却总是格式不对显示不正常?参考了几个例程文件,还是不能弄出。代码部分的计算电压值时:adcnum=adcnum*500/1024;结果显示到数码管上就不正常了?以下是代码- #include "reg52.h"
- #include "intrins.h"
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sfr T2H = 0xd6; //定时器2高8位
- sfr T2L = 0xd7; //定时器2低8位
- sfr AUXR = 0x8e; //辅助寄存器
- sfr ADC_CONTR = 0xBC; //ADC控制寄存器
- sfr ADC_RES = 0xBD; //ADC高8位结果
- sfr ADC_RESL = 0xBE; //ADC低2位结果
- sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
- sfr CLK_DIV = 0x97;
- sbit LSA=P3^2;
- sbit LSB=P3^3;
- sbit LSC=P3^4;
- uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
- uchar DisplayData[8];
- void Delay_ms(unsigned int ms)//ms级延时
- {
- unsigned int a,b;
- for(a=ms;a>0;)
- {
- for(b=1000;b>0;)
- {
- b=b-1;
- }
- a--;
- }
- }
- void ADC_int() //ADC初始化
- {
- ADC_CONTR=0X80;
- P1ASF=0X01;
- CLK_DIV=0X20;
- ADC_RESL=0;
- ADC_RES=0;
- Delay_ms(10);
- }
- unsigned int ADC_Read()
- {
- unsigned int a=0;
- ADC_CONTR = 0X88;
- Delay_ms(1);
- while(!(ADC_CONTR&0X10));
- a=ADC_RES*256+ADC_RESL;
- ADC_CONTR&=~0x10;
- return a;
- }
- void DigDisplay()
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//显示第7位
- }
- P2=DisplayData[i];//发送段码
- Delay_ms(1);//间隔一段时间扫描
- P2=0x00;//消隐
- }
- }
- void datapros()
- {
- uint adcnum;
- adcnum=ADC_Read();
- adcnum=adcnum*500/1024;
- DisplayData[0]=smgduan[adcnum%1000%100%10/1]; //显示个位
- DisplayData[1]=smgduan[adcnum%1000%100/10]; //显示十位
- DisplayData[2]=smgduan[adcnum%1000/100]; //显示百位
- DisplayData[3]=smgduan[adcnum/1000]; //显示千位
- Delay_ms(10);
-
- }
- void main()
- {
- ADC_int(); //初始化ADC
- while(1)
- {
- datapros(); //数码管数据处理函数
- DigDisplay(); //数码管显示函数
-
- }
- }
复制代码
|