DAC0832 數(shù)控功率放大器程序
/******************************************
功能:數(shù)控功率放大器
(按相應(yīng)的按鍵,數(shù)碼管顯示功率增益)
單片機(jī):AT89S52
數(shù)模轉(zhuǎn)換:DAC0832
******************************************/
#include
typedef unsigned int uint ;
typedef unsigned char uchar ;
uchar temp,a,GAIN;
sbit P7=P0^7; // 數(shù)碼管的接口
sbit P6=P0^6;
sbit P5=P0^5;
sbit P4=P0^4;
sbit DAT=P0^3; //數(shù)碼管的驅(qū)動(dòng)
sbit CLK=P0^2;
void delay(uint); // 延遲程序
void sendbyte(uchar); // 數(shù)碼管顯示
void display(uint); // 增益顯示
uchar keyscan();
uchar code tab[]={
0xed,0x09,0xbc,0x9d,0x59,0xd5,
0xf5,0x0d,0xfd,0xdd,0x7d,0xf1,
0xe4,0xb9,0xf4,0x74,0x00} ; //0-F, 全滅
void main (void)
{
sendbyte(0); //初始時(shí)數(shù)碼管無(wú)顯示
P1=0x01;
while(1)
{
GAIN = keyscan(); //按鍵掃描
display(GAIN);
if(GAIN == 0)
{
P1=0x01;
}
if(GAIN == 1)
{
P1=0x01; // 10db
}
if(GAIN == 2)
{
P1=0x02; // 20db
}
if(GAIN == 3)
{
P1=0x07; // 30db
}
if(GAIN == 4)
{
P1=0x15; // 40db
}
if(GAIN == 5)
{
P1=0x43; // 50db
}
if(GAIN == 6)
{
P1=0xd5; // 60db
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void sendbyte(uchar byte)
{
uchar num,c;
num=tab[byte];
for(c=0;c<8;c++)
{
CLK=0;
DAT=num&0x01;
CLK=1;
num>>=1; //右移位賦值
}
}
void display(uint Gain) //數(shù)碼管的動(dòng)態(tài)顯示子函數(shù)
{
P5=0;
P6=0;
P7=0;
sendbyte(Gain);
P4=1;
delay(1);
P4=0;
P6=0;
P7=0;
sendbyte(0); // "0"
P5=1;
delay(1);
P4=0;
P5=0;
P7=0;
sendbyte(13); // "d"
P6=1;
delay(1);
P4=0;
P5=0;
P6=0;
sendbyte(11); // "b"
P7=1;
delay(1);
}
uchar keyscan()
{
/*第一行按鍵的掃描*/
P2=0xfe; //確定第一行的按鍵有效
temp=P2; //將其賦給一個(gè)變量(處理I/O口時(shí),一般先賦值給一個(gè)變量,然后通過(guò)處理變量來(lái)處理I/O口)
temp=temp&0xf0; //用于檢測(cè)第一行的哪個(gè)按鍵按下
while(temp!=0xf0) /*這個(gè)部分只要是用來(lái)消除按下抖動(dòng)的*/
{
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0) //這個(gè)地方,已經(jīng)消除了按下抖動(dòng),P2口的值已經(jīng)確定
{
temp=P2; //將P2口得值賦給變量
switch(temp) //這個(gè)switch語(yǔ)句,用來(lái)確定哪一個(gè)按鍵按下時(shí),數(shù)碼管的顯示值
{
case 0x7e:a=1;
break; //這個(gè)break很重要,表示如果有匹配的值,就跳出switch語(yǔ)句,防止程序跳不出來(lái)。
case 0xbe:a=2;
break;
case 0xde:a=3;
break;
case 0xee:a=4;
break;
default : a=0;
break;
}
while(temp!=0xf0) /*這個(gè)部分只要是用來(lái)消除釋放抖動(dòng)的*/
{
temp=P2;
temp=temp&0xf0;
}
}
}
/*第二行按鍵的掃描*/
P2=0xfd;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0x7d:a=5;
break;
case 0xbd:a=6;
break;
case 0xdd:a=0;
break;
case 0xed:a=0;
break;
default : a=0;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
return a;
}