我在STC上仿真的时候,发现只有按键的键号可以改变,但是电压值恒为0.151V,ADC输入端电压为0-5V,不知道错误原因啊,急急急
- //程序功能说明:根据ADC转换结果得到按键号,将按键号显示在最左端
- //同时将AD转换的电压值显示在右边四位数码管上x.xxx,单位:V
- #include "STC15Fxxxx.h"
- #define delt 16 //设置ADC允许偏差
- u8 code seg7[]={//标准字库显示段码
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F H 灭
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x0};
-
- sbit P_HC595_SER = P4^0; //pin 14 SER data input
- sbit P_HC595_RCLK = P5^4; //pin 12 RCLk store (latch) clock
- sbit P_HC595_SRCLK = P4^3; //pin 11 SRCLK Shift data clock
- u8 KeyNo=0; //给用户使用的键码, 1~16有效
- u8 code wei[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//位选码
- u8 dsply_buf[]={0x10,0x11,0x11,0x11,5,0,0,0};//显示缓冲区定义
- u8 k=0;//
- u16 adc_VAL=0;
- float volt=0;
- //u8 KeyNo1;
- u8 KeyNo2; //键码中间变量
- u8 KeyNo3;
- u8 ge,shi,bai,qian; // 电压的个位/十位/百位/千位(毫伏)
- void delay(u8 N); //延时N毫秒子程序
- void Send_595(u8 dat); //发送一个字节数据到595
- void display();//8位数码管动态显示
- char get_KeyNo();
- void mcu_int();
- void delay500ms();
- /**********************************************/
- void main(void)
- { mcu_int();
- while(1)
- { while(ADC_CONTR!=0xF4)//等待转换完成
- {}
- //ADC_FLAG=1,说明转换完成
- adc_VAL=ADC_RES*256+ADC_RESL;//第一次读取转换结果
- ADC_CONTR=0xEC;//清除ADC_FLAG,继续转换
- if (adc_VAL>32) //转换结果不为零,说明有按键按下
- { delay(3); //延时3ms,
- while(ADC_CONTR!=0xF4)//等待转换完成
- {}
- adc_VAL=ADC_RES*256+ADC_RESL;//第二次读取转换结果
- ADC_CONTR=0xEC; //清除ADC_FLAG,继续转换
- if (adc_VAL>32) //转换结果不为零,说明确实有按键按下
- { KeyNo2=get_KeyNo();
- NOP4();//短延时
- while(ADC_CONTR!=0xF4)//等待转换完成
- {}
- adc_VAL=ADC_RES*256+ADC_RESL;//第三次读取转换结果
- ADC_CONTR=0xEC; //清除ADC_FLAG,继续转换
- KeyNo3=get_KeyNo();
- if (KeyNo2==KeyNo3)//两次读取键码相同,说明按键没有错误
- { //等待键松开
- volt=(adc_VAL*5)/1.023;
- while(1)
- { while(ADC_CONTR!=0xF4)//等待转换完成
- {}
- adc_VAL=ADC_RES*256+ADC_RESL;//第三次读取转换结果
- ADC_CONTR=0xEC; //清除ADC_FLAG,继续转换
- if (adc_VAL<32)//键松开了,电压低于5V×32/1023
- break;
- }
- KeyNo=KeyNo2;
- dsply_buf[0] = KeyNo / 10; //显示键码
- dsply_buf[1] = KeyNo % 10; //显示键码
- // dsply_buf[0]=KeyNo;
- volt=(adc_VAL*5)/1.023;
- adc_VAL=volt;
- ge=adc_VAL%1000%100%10;
- shi=adc_VAL%1000%100/10;
- bai=adc_VAL%1000/100;
- qian=adc_VAL/1000;
- dsply_buf[7]=ge;
- dsply_buf[6]=shi;
- dsply_buf[5]=bai;
- dsply_buf[4]=qian;
- }
- }
- }
- }
- }
- void mcu_int()//初始化单片机
- {// 端口初始化
- P0M1 = 0; P0M0 = 0; //设置为准双向口
- P1M1 = 0; P1M0 = 0; //设置为准双向口
- P2M1 = 0; P2M0 = 0; //设置为准双向口
- P3M1 = 0; P3M0 = 0; //设置为准双向口
- P4M1 = 0; P4M0 = 0; //设置为准双向口
- P5M1 = 0; P5M0 = 0; //设置为准双向口
- P6M1 = 0; P6M0 = 0; //设置为准双向口
- P7M1 = 0; P7M0 = 0; //设置为准双向口
- // 定时器T0初始化,定时4ms,模式0,16位自动重装方式,系统时钟12M,定时器输入12分频
- TMOD=0x00;
- TH0=0xF8;
- TL0=0x30;
- EA=1; //允许中断
- ET0=1; //开T0中断
- TR0=1; //启动定时器T0
- //ADC初始化
- P1ASF=0x10; //选择P14为ADC输入通道
- CLK_DIV=0x20; //ADRJ=1,10位模式,adc_val=ADC_RES*256+ADC_RESL
- ADC_CONTR=0xE4; //打开ADC电源,速度90T,通道4 ADC_start位置0,转换没有开始
- delay500ms(); //适当延时,等待内部电路稳定
- ADC_CONTR=0xEC; //ADC_START=1,开始转换
- delay500ms(); //延时500ms,确保转换电路稳定
- }
- void delay(u8 N) //@12.000MHz //软件延时Nms函数
- {
- u8 i, j;
- i = 12*N;
- j = 169;
- do
- {
- while (--j);
- } while (--i);
- }
- void Send_595(u8 dat) // 向HC595发送一个字节函数/
- {
- u8 i;
- for(i=0; i<8; i++)
- {
- dat <<= 1;
- P_HC595_SER = CY;
- P_HC595_SRCLK = 0;
- P_HC595_SRCLK = 1;
- }
- }
- void display() interrupt 1 //动态显示缓冲区内容
- { u8 segcode;
- TF0=0; //清除T0中断标志
- segcode=seg7[dsply_buf[k]];
- if (k==4)
- {
- segcode=(segcode|0x80);
- } //小数点位置1
- Send_595(wei[k]);
- Send_595(segcode);
- P_HC595_RCLK = 0;
- P_HC595_RCLK = 1;
- k++; //指向下一位
- if (k==8)
- k=0;
- }
- char get_KeyNo() //根据adc_VAL确定按键号
- { u8 KeyNo1;
- if ((adc_VAL>48)&&(adc_VAL<80))
- { KeyNo1=0;}
- if ((adc_VAL>112)&&(adc_VAL<144))
- {KeyNo1=1;}
- if ((adc_VAL>176)&&(adc_VAL<208))
- {KeyNo1=2;}
- if ((adc_VAL>240)&&(adc_VAL<272))
- {KeyNo1=3;}
- if ((adc_VAL>304)&&(adc_VAL<336))
- {KeyNo1=4;}
- if ((adc_VAL>368)&&(adc_VAL<400))
- {KeyNo1=5;}
- if ((adc_VAL>432)&&(adc_VAL<464))
- {KeyNo1=6;}
- if ((adc_VAL>496)&&(adc_VAL<528))
- {KeyNo1=7;}
- if ((adc_VAL>560)&&(adc_VAL<592))
- {KeyNo1=8;}
- if ((adc_VAL>624)&&(adc_VAL<656))
- {KeyNo1=9; }
- if ((adc_VAL>688)&&(adc_VAL<720))
- {KeyNo1=0xA;}
- if ((adc_VAL>752)&&(adc_VAL<784))
- {KeyNo1=0xB;}
- if ((adc_VAL>816)&&(adc_VAL<848))
- {KeyNo1=0xC;}
- if ((adc_VAL>880)&&(adc_VAL<912))
- {KeyNo1=0xD;}
- if ((adc_VAL>944)&&(adc_VAL<976))
- {KeyNo1=0xE;}
- if ((adc_VAL>1007)&&(adc_VAL<=1023))
- {KeyNo1=0xF;}
- return KeyNo1;
- }
- //延时500ms
- void delay500ms() //@12.000MHz
- {
- unsigned char l,m,n;
- _nop_();
- _nop_();
- l = 23;
- m = 205;
- n = 120;
- do
- {
- do
- {
- while (--n);
- } while (--m);
- } while (--l);
- }
复制代码
|