微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > biyesheji kaitibaogao

biyesheji kaitibaogao

时间:10-02 整理:3721RD 点击:
/*****        简易数控稳压源           ******/
/*主要功能:由4x4矩阵键盘,可以直接输入预设电压,得出电压;
                    并可以通过按键显示实际测量电压,可步进0.1V。*/
//项目:郑炳炎 ;广东松山职业技术学院 电气工程系 2011级 自动化专业 (1班)
#include<iom16v.h>
#define uchar unsigned char
#define uint  unsigned int
uint NUM,CNT;
uchar q,b,Q,B,k,d,enter;
uchar table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
void delay(uchar t);//延时函数
void show_LED(void);//数码管函数
void anjian(void);//按键函数
void show_NUM(void);//键值函数
void A_D_A(void);//电压测量函数
void show_V(void);//预设电压函数
void main(void)
{DDRC=0X0F; //按键接口
PORTC|=0XF0;
SFIOR&=0XFB;
DDRA=0XC0;  //数码管接口
PORTA|=0X03; //A/D接口
DDRB=0XFF;
DDRD=0XFF;
PORTD=0XFF;
ADCSRA|=1<<ADEN|1<<ADSC;//ADC寄存器使能 ,单次触发;
ADCSRA|=1<<ADPS1|1<<ADPS2;//N=64,F=8M;
while(1)
{
A_D_A();
anjian();
show_V();
show_LED();
show_NUM();
  }
}
/*电压测量函数*/
void A_D_A(void)
{
ADCSRA|=1<<ADSC;
while(!ADCSRA&(1<<ADIF));//判断标志位 ADIF 是否为 1 ?
CNT=ADC&0X03FF;
CNT=2*((CNT*50)/1023);
if(q<=5)//弥补误差
  CNT-=2;
Q=CNT/10;//显示电压的 BCD 转换
B=CNT%10;
  }
  
/* 预设电压函数 */
void show_V(void)
{
if(q>5)
  {NUM=q*10;
   NUM+=b;
   NUM-=1;}
if(q<=5)
  {NUM=q*10;
   NUM+=b;
   NUM-=3;}
if(enter!=1) //初始电压 5V
  PORTD=117;
if(enter==1) //按键设置电压
  PORTD=NUM*255/100;
}
/*  键值函数   */
void show_NUM(void)
{
switch(k)
{
  case 0X00:if(d==0)q=7;if(d==1)b=7;break;
  case 0X01:if(d==0)q=8;if(d==1)b=8; break;
  case 0X02:if(d==0)q=9;if(d==1)b=9; break;
  
  case 0x03:delay(500);b+=1;break; //增加 0.1
  
  case 0X04:if(d==0)q=4;if(d==1)b=4; break;
  case 0X05:if(d==0)q=5;if(d==1)b=5; break;
  case 0X06:if(d==0)q=6;if(d==1)b=6; break;
  
  case 0x07:delay(500);b-=1;break; //减少 0.1
  
  case 0X08:if(d==0)q=1;if(d==1)b=1; break;
  case 0X09:if(d==0)q=2;if(d==1)b=2; break;
  case 0X0A:if(d==0)q=3;if(d==1)b=3; break;
  
  case 0X0C:q=0,b=0,d=0,enter=2; break;//取消
  case 0X0D:if(d==0)q=0;if(d==1)b=0; break;
  case 0X0E:d=1;break;// 小数点
  case 0X0F:enter=1; break;//确认
  }
}
/* 数码管 函数 */
void show_LED(void)
{
PORTA=0X83;
if((PINA&0X02)==0)
  {PORTB=table[Q];
   PORTB&=~0X80;}
else
  PORTB=table[q];
if(d==1)
  PORTB&=~0X80;
  delay(10);
  PORTA=0X43;
if((PINA&0X02)==0)
  PORTB=table[B];
else
  PORTB=table;
delay(10);
   }
/*  矩阵4*4函数  */
void anjian(void)
{
uchar i,j;
uchar hang[]={0XFE,0XFD,0XFB,0XF7};
uchar lie[]={0XE0,0XD0,0XB0,0X70};
  for(i=0;i<4;i++)
  {PORTC=hang;
   k=PINC&0XF0;
  for(j=0;j<4;j++)
   {if(k==lie[j])
     {k=4*i+j;
   i=0X05;
   break;}}
    }
  }
  
/* 延时函数  */  
void delay(uchar t)
{
uint i;
for(;t>0;t--)
for(i=1141;i>0;i--);
  }
PCB打样找华强 http://www.hqpcb.com 样板2天出货

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top