

本程序实现的是通过4*4键盘的三个键值(0x7d,0xbd,0xdd;分别对应键盘的数字1,2,3)来选择输出波形(正弦,锯齿,方波)。几百年没写c程序了,出的波形都不是特别好看,如果各位看官觉得那里有错的请指点,谢谢!
[color=#00CC33,strength=3);text-shadow:1px]电路连接:P0口接DA,P1控制键盘,中断用外部中断1(INT1),J14为输出端用示波器观察波形。
程序:
# include < absacc.h >
# include < reg51.h >
#include<math.h>
# define DAC0832 XBYTE [0xc000 ]
# define uchar unsigned char
# define uint unsigned int
void sinusoidal();
void triangle();
void square();
void dlms() ;
unsigned char read_key(unsigned char);
code unsigned char Sin[128]={64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,
109,111,113,115,117,118,120,121,123,124,125,126,126,
127,127,127,127,127,127,127,126,126,125,124,123,121,
120,118,117,115,113,111,109,106,104,102,99,96,94,91,
88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,
36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,
1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,
25,28,31,33,36,39,42,45,48,51,54,57,60};
code unsigned char scan[4]={0xef,0xdf,0xbf,0x7f};
unsigned char key, old_key ; //键码,扫描码
uchar counter;
void dlms() //延时
{
uchar k;
for(k=200;k>0;k--){}
}
void main(){
IT1=0;
EX1=1;
PX1=1;
EA=1;
P1=0x0f;
while(1){
switch(key)
{
case 0x1: sinusoidal(); //zhenxian
break;
case 0x2: triangle(); //jvchi
break;
case 0x3: square(); //fanbo
break;
default:break;
}
}
}
void get_keypad_code() interrupt 2
{
unsigned char i;
uchar scan;
for (i=1;i<=4;i++)
{
P1=scan;
old_key=P1|0xf0;
if(old_key!=0xff) //有键?
{
key=read_key(scan); //读键码
dlms(); //延时5-10ms,去抖动
}
}
}
uchar read_key(uchar scan)
{
P1=scan; //扫描
switch(P1) //返回扫描码->键码
{
case 0x77:return(0x7);
case 0xb7:return(0x8);
case 0xd7:return(0x9);
case 0xe7:return(0xd);
case 0x7b:return(0x4);
case 0xbb:return(0x5);
case 0xdb:return(0x6);
case 0xeb:return(0xc);
case 0x7d:return(0x1);
case 0xbd:return(0x2);
case 0xdd:return(0x3);
case 0xed:return(0xb);
case 0x7e:return(0xf);
case 0xbe:return(0x0);
case 0xde:return(0xe);
case 0xee:return(0xa);
default: return(0xff);
}
}
void sinusoidal()
{
for(counter=0;counter<128;counter++){
DAC0832=Sin[counter];
}
}
void triangle ()
{
for(counter=0;counter<128;counter++ ){
DAC0832=counter;
dlms();
}
}
void square()
{
for(counter=1;counter<128;counter++)
{
if(counter<=64) DAC0832=0x00;
else DAC0832=0xf0;
}
}
|