基于AT89C52单片机简易函数信号发生器的设计(6)

2019-04-09 17:04

void disp_lcd(uchar addr,uchar *temp1) {

uchar num;

write_com(addr);

delay(1); //延时一会儿??? for(num=0;num<16;num++) { write_date(temp1[num]);//或者这样写write_date(*(temp1+num)); delay(1); } }

void init_lcd() {

//uchar num;

lcden=0; //可有可无???

rw=0; //初始化一定要设置为零,表示写数据

write_com(0x38); //使液晶显示点阵,为下面做准备 write_com(0x0c); //初始设置 write_com(0x06); //初始设置 write_com(0x01); //清零

write_com(0x80); //使指针指向第一行第一格

disp_lcd(0x80,&lcd_hang1[4*16]); //在第一行显示 disp_lcd(0xc0,&lcd_hang1[5*16]); //在第二行显示 /*for(num=0;num<16;num++) { write_date(table[num]); delay(5); }

write_com(0x80+0x40); //给指针重新赋值,使之指向第二行第一格 for(num=0;num<16;num++) { write_date(table1[num]); delay(5); } */

/*TMOD=0x01; //选用定时方式1 TH0=(65536-50000)/256; //赋初值 TL0=(65536-50000)%6; // EA=1; //开总中断

ET0=1; //开定时器中断 TR0=1; //启动定时器*/ }

26

/********************1602液晶函数声明结束*********************/

void main() {

uchar i=0;

DA_S2=0; //使DAC寄存器处于直通状态 DAdata=0;

DA_S1=1; //关闭8位输入寄存器 init_lcd();

waveform=0;

TMOD=0x01; //设置定时器0为16位工作方式 IT0=1; //设置外部中断0为下降沿触发 ET0=1; //开定时器中断 EX0=1; EA=1; while(1) { //DAout(0xff); //可输出TTL波形 //DAout(0x80); //T_temp=32; } }

void timer0() interrupt 1 {

TH0=THtemp; TL0=TLtemp;

if(waveform==0) sine_out(); else if(waveform==1) triangle_out(); else if(waveform==2) square_out();

else if(waveform==3) sawtooth_out(); //tian jian }

void key_int0() interrupt 0 {

uchar keytemp;

uint total_freq; //总频率

EA=0; TR0=0; //关总中断与定时器 delay(5); //延时够吗???

if(key==0) //确实有按键按下而引发中断 { keytemp=P3&0xf0; //获取P3口高四位的值 switch(keytemp)

27

{ case 0xe0: //选择波形 waveform++; if(waveform>3) waveform=0; //jiang 2 gai wei 3 break; case 0xd0: //频率按规定单位依次增加 wavefreq[waveform]++; if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠

break; // 性更高,使加数有个上限,不会一直加下去*/

case 0xb0: //频率按规定单位依次衰减 wavefreq[waveform]--; if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用“<1”,因为它比“=0”可靠性更高

break; case 0x70: //TTL输出 DA_S2=1; //使DAC寄存器关闭 break; }

THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_temp

TLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];

total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)

lcd_hang2[5]=total_freq+0x30; //在液晶中显示个位,(0x30 在液晶显示中表示数字0)

total_freq/=10; lcd_hang2[4]=total_freq+0x30; //在液晶中显示时十位 total_freq/=10; lcd_hang2[3]=total_freq+0x30; //在液晶中显示时百位 total_freq/=10; lcd_hang2[2]=total_freq+0x30; //在液晶中显示时千位 disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示 disp_lcd(0xc0,lcd_hang2); //在第二行显示 }

wavecount=0; //'抽点'计数清零 while(!key);

EA=1; TR0=1; //开启总中断与定时器

28

附录三 电路原理图

图12 电路原理图

29


基于AT89C52单片机简易函数信号发生器的设计(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:冬吴相对论 文字版 第311-320期

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: