本帖最后由 zhengbingyan 于 2012-12-4 12:42 编辑
/***** 简易数控稳压源 ******/
/*主要功能:由4x4矩阵键盘,可以直接输入预设电压,得出电压;
并可以通过按键显示实际测量电压,可步进0.1V。*/
//项目:郑炳炎 ;广东松山职业技术学院 电气工程系 2011级 自动化专业 (1班)
#include
#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<
ADCSRA|=1<
while(1)
{
A_D_A();
anjian();
show_V();
show_LED();
show_NUM();
}
}
/*电压测量函数*/
void A_D_A(void)
{
ADCSRA|=1<
while(!ADCSRA&(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--);
}
1
评分
-
查看全部评分
|
|
|
|