[求助]碰到两个问题,希望大家能够帮忙看看

2020-02-09 11:28发布

我用PIC16F690内部的ADC对VCC进行一个模数转换,把转换的结果即电量显示到PORTC口的5个LED,现在碰到2个问题,希望大家能够帮忙看看

1.ADC转换结果送过去总是感觉转换结果有误

2.LED闪灯问题,我想用一个函数实现我想让RCx闪灯就让RCx闪灯、想让他闪几次就闪几次,想让哪个LED闪这个我能用一个switch case语句实现,但是想让他闪几次就不闪实现不了,他一直在闪,我是用一个for循环弄的

贴上源程序,希望大家有时间帮忙看看吧

#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
__CONFIG(INTIO & WDTDIS & PWRTEN & BORDIS & UNPROTECT);
void init();
void init_adc();
void delay_ms(uint);
void BlinkLed(uchar sled);//ok
void BlinkLedNum(uchar x,uchar z);
uint get_ad();
const uchar table[]={0x7f,0x3f,0x1f,0x0f,0x07};//这里是实验ADC转换结果用的
void main()
{
uint lednum;
uchar a1,a2,a3,a4;
init();
init_adc();
while(1)
{
  lednum = get_ad();
  a1=lednum/1000;//2
  a2=lednum%1000/100;//5
  a3=lednum%100/10;//0
  a4=lednum%10;//0
  
  PORTC =table[a1];
  delay_ms(1000);

  BlinkLedNum(3,3);//这句话是测试闪灯函数的
}
}
void BlinkLed(uchar sled)//闪烁RC3~RC7中的某一位
{
switch(sled)
{
  case 3: RC3=!RC3;
    delay_ms(300);
    break;
  case 4: RC4=!RC4;
    delay_ms(300);
    break;
  case 5: RC5=!RC5;
    delay_ms(300);
    break;
  case 6: RC6=!RC6;
    delay_ms(300);
    break;
  case 7: RC7=!RC7;
    delay_ms(300);
    break;
  default:break;
}
}
void BlinkLedNum(uchar xnum,uchar z)
{
//uchar x;
//for(x=xnum;x>0;x--)
do
{
  BlinkLed(z);
  xnum--;
}while(xnum==0);
}
void init_adc()
{
ANSEL = 0x40;//enable AN6
ANSELH = 0x04;//enable AN10
ADCON0 = 0xa9;//结果右对齐,基准为VDD,通道选择AN10
ADCON1 = 0x20;//ADC时钟选择Fosc/32
delay_ms(20);
}
uint get_ad()
{
uint adval;
float advalf;
GODONE = 1;
while(GODONE);
adval = ADRESH;//00000000 00000011
adval = adval << 8 | ADRESL;//00000011 00000000|11111111=00000011 11111111
advalf=adval/1023.0*5.0;//
//adval=advalf*1000;//
//advalf=advalf*124.7/14.7;//
advalf = advalf*1000;//
float advalf= (uint)adval;
return (adval);
}
void init()
{
OSCCON = 0x71;//振荡器控制寄存器配置为内部8MHz
TRISC = 0x04;//00000100RC2为模拟输入
PORTC = 0xf8;//11111000
TRISA = 0x00;//00000000
TRISB = 0x10;//RB4为模拟输入
PORTB = 0xff;//11111111
}
void delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
  for(j=152;j>0;j--);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
yklstudent
1楼-- · 2020-02-09 14:47
void BlinkLedNum(uchar xnum,uchar z)
{
//uchar x;
//for(x=xnum;x>0;x--)
do
{
  BlinkLed(z);
  xnum--;
}while(xnum==0);
}
感觉写的不合适
role_2099
2楼-- · 2020-02-09 16:46
大家多给些建议吧,我的脑子现在有些木

一周热门 更多>