资源描述
信号源(正弦波,三角波,锯齿波,方波,步进10HZ,0.1V)
2009-08-27 19:14:00| 分类: 默认分类|字号 订阅
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DAC1 P0
#define DAC2 P2
sbit rs=P3^0;
sbit rw=P3^1;
sbit en=P3^2;
sbit k1=P3^3;
sbit k2=P3^4;
sbit k3=P3^5;
sbit k4=P3^6;
uchar mm,gao,di,temp,k1num,k2num,num,Anum,Fnum;
uchar bai,shi,ge,Fbai,Fshi,Fge,date2,Ashi,Age;
uchar code tbsin[]=
{128,144,160,175,190,203,216,227,236,244,250,254,255,255,254,250,244,236,
227,216,203,190,175,160,144,128,112,96,81,66,53,40,29,20,12,6,2,0,0,2,6,12,
20,29,40,53,66,81,96,112};
uchar code tbsanjiao[]=
{0,10.625,21.25,31.875,42.5,53.125,63.75,74.375,85,95.625,106.25,
116.875,127.5,138.125,148.75,159.375,170,180.625,191.25,201.875,212.5
,223.125,233.75,244.375,255,255,244.375,233.75,223.125,212.5,201.875,
191.25,180.625,170,159.375,148.75,138.125,127.5,116.875,106.25,95.625,85,
74.375,63.75,53.125,42.5,31.875,21.25,10.625,0,};
uchar code tbjuchi[]=
{0,5,10,16,21,26,31,36,42,47,52,57,62,68,73,78,83,88,94,99,104,109,115,120,125,
130,135,141,146,151,156,161,167,172,177,182,187,193,198,203,208,213,219,224,229,
234,239,245,250,255,};
uchar code tbfangbo[]=
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};
uchar code tbDAC2[]=
{1,5,10,16,21,26,31,36,42,47,52,57,62,68,73,78,83,88,94,99,104,109,115,120,125,
130,135,141,146,151,156,161,167,172,177,182,187,193,198,203,208,213,219,224,229,
234,239,245,250,255,};
uchar code tbF[]=
{56,74,89,102,113,123,131,138,145,151,156,161,165,169,173,176,179,182,185,187,189,
191,194,195,197,199,200,202,203,205,206,207,208,209,211,212,213,213,214,215,216};
void delay(uint z)//延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//LCD写命令
{
rs=0;
rw=0;
en=0;
P1=com;
delay(2);
en=1;
delay(2);
en=0;
}
void write_date( uchar date)//LCD写数据
{
rs=1;
rw=0;
en=0;
P1=date;
delay(2);
en=1;
delay(2);
en=0;
}
void lcd_wr_str(uchar i,uchar *date)//写一个字符串
{
if(i==0)
{
write_com(0x80);
while(*date!='\0')
{
write_date(*date);
date++;
delay(5);
}
}
if(i==1)
{
write_com(0x80+0x40);
while(*date!='\0')
{
write_date(*date);
date++;
delay(5);
}
}
}
void init()//初始化
{
TMOD=0x02;
TH0=56;
TL0=56;
EA=1;
ET0=1;
TR0=1;
en=0;
write_com(0x38);
write_com(0x06);
write_com(0x0f);
write_com(0x0c);
write_com(0x80);
write_com(0x01);
write_com(0x80+5);
delay(5);
lcd_wr_str(0," Press K1");
lcd_wr_str(1," Chose One Wave");
}
void timer0() interrupt 1//中断
{
switch (k1num)
{ case 1:{num++;if(num==50)num=0;DAC1=tbsin[num]; }break;//正弦波
case 2:{num++;if(num==50)num=0;DAC1=tbsanjiao[num];}break;//三角波
case 3:{num++;if(num==50)num=0;DAC1=tbjuchi[num]; }break;//锯齿波
case 4:{num++;if(num==50)num=0;DAC1=tbfangbo[num]; }break;//方波
}
}
void sel_wave(void)
{
if(k1==0)//选择波形
{
TR0=0;
delay(5);
if(k1==0)
{
while(!k1);
delay(5);
k1num++;
if(k1num==5)
{
k1num=0;
}
}
}
TR0=1;
}
void sel_FV()//选择调幅 调频
{ TR0=0;
if(k2==0)
{
delay(10);
if(k2==0)
{ while(k2==0);
k2num++;
if(k2num==3)k2num=0;
}
}
TR0=1;
}
void keyadd()
{
if(k3==0)
{
delay(10);
if(k3==0)
{ while(!k3);
if(k2num==1)//调幅+
{
DAC2=tbDAC2[Anum];
Anum++;
if(Anum==50)Anum=0;
write_com(0x01);
lcd_wr_str(0," tbDAC2[Anum]/10 . tbDAC2[Anum]%10 V");
}
else if(k2num==2) //调频+
{ //while(!k3);
Fnum++;
TH0=tbF[Fnum];
if(Fnum==50)Fnum=0;
write_com(0x01);
lcd_wr_str(1," tbDAC2[Anum]/100 tbDAC2[Anum]/10%10 tbDAC2[Anum]%10 F");
}
}
}
}
void keysub()
{
if(k4==0)
{
delay(10);
if(k4==0)
{
if(k2num==1)//调幅--
{
DAC2=tbDAC2[Anum];
Anum--;
if(Anum==0)Anum=50;
write_com(0x01);
lcd_wr_str(0," tbDAC2[Anum]/10 . tbDAC2[Anum]%10 V");
}
else if(k2num==2) //调频--
{
TH0=tbF[Fnum];
Fnum--;
if(Fnum==0)Fnum=50;
write_com(0x01);
lcd_wr_str(1," tbDAC2[Anum]/100 tbDAC2[Anum]/10%10 tbDAC2[Anum]%10 F");
}
}
while(!k4);
}
}
void main()
{
init();
DAC2=0xff;
while(1)
{
sel_wave();
sel_FV();
keyadd();
keysub();
}
}
展开阅读全文