您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 51单片机计算器 AD DA
说明:该源程序包括键盘计算器,AD总线DA总线Music播放串口收发液晶显示;程序段均用/*****************************************************************************/隔开;为方便大家使用已将各程序段分开,共参考。若需建立全部功能则分别建立各自.H文件,将它们全加入工程。另附仿真Proteus图。各延时程序/*****************************************************************************/#includeREG52.H#includeintrins.h#includedelay.h#defineucharunsignedchar#defineuintunsignedintvoiddelay_nus(uintx){while(x--);}voiddelay_nms(uintz)//毫秒级延时函数{uinti,j;for(i=0;iz;i++)for(j=0;j120;j++);}voidled_delay10ms(ucharn){unsignedchara,b,c;for(c=n;c0;c--)for(a=125;a0;a--)for(b=200;b0;b--);}voidmusic_delay(uintz)//延时165MS,即十六分音符{uintx,y;for(x=z;x0;x--)for(y=19000;y0;y--);}voidmusic_delay1(uintz)//延时1MS{uintx,y;for(x=z;x0;x--)for(y=112;y0;y--);}/*****************************************************************************/#includereg52.h//包括一个52标准内核的头文件#includeabsacc.h#includeintrins.h//包含有左右循环移位子函数的库#includeadc.h#includeLCD1602.h#includedelay.h#defineucharunsignedchar//宏定义,定义一下方便使用#defineuintunsignedint#defineIN0XBYTE[0X0000]ucharbai,shi,ge,ii=0,jieguo;ucharxdata*ad_adr;//=================================================//ADC0809模数转换//=================================================voidADC0809_main(void){ucharcun;ad_adr=&IN0;*ad_adr=ii;delay_nus(1000);jieguo=*ad_adr;//读取转换结果jieguo=jieguo*500/255;//A/D分辨率为8位(255),转换出0-5v的实数值cun=(unsignedchar)jieguo;bai=(cun/100);//得到百位数shi=cun%100/10;//得到十位数ge=cun%10;LCD_write_str(1,0,value:);write_com(0xC0+9);write_dat(0x30+bai);write_dat(0x2e);//显示小数点write_dat(0x30+shi);write_dat(0x30+ge);write_dat('V');}/*****************************************************************************/#includereg52.h#includeintrins.h#includeabsacc.h#includedelay.h#includedac.h#defineucharunsignedchar#defineuintunsignedint#defineDAC0832XBYTE[0x7fff]//========================================================================//DAC0832转换函数//========================================================================voidDAC0832_shanjiaobo(){uchari,k;for(i=0;i100;i++){for(k=0;k255;k++){//k=255,没有达到我要的三角波,而是先是一个三角波,然后是锯齿波DAC0832=k;}for(k=255;k0;k--){DAC0832=k;}}}voidDAC0832_fangbo(){uchari;for(i=0;i100;i++){DAC0832=0X00;//输入低电平delay_nus(500);//延时DAC0832=0xff;delay_nus(500);}}voiddac0832_main(){DAC0832_fangbo();DAC0832_shanjiaobo();}/*****************************************************************************/#includereg52.h#includedelay.h#includeLCD1602.h#includeKEY.h#defineucharunsignedchar#defineuintunsignedintucharnum;//存放按键标识uchardenghao=0,flag=0,fuhao,key;//denghao存放是否按下等号键,flag存放是否按下符号键,fuhao存放按下是什么符号,key存放按键ASCII码值longa,b,c;//加数a、b结果为cucharcodetable[]={//键盘显示编码,加上0x30,为对应的ASCII码0x2f-0x307,8,9,0x2f-0x30,//1、2、3、+;0x2a-0x304,5,6,0x2a-0x30,//4、5、6、-;0x2d-0x301,2,3,0x2d-0x30,//7、8、9、*;0x2b-0x300x2f-0x30,0x2a-0x30,0,0x2b-0x30};//0、=、CE、/;0x01-0x30,0,0x3d-0x30,0x2f-0x30};//0、=、CE、/;voidkeyscan(){uchartemp;KEY_8=0xfe;//11111110temp=KEY_8;temp=temp&0xf0;while(temp!=0xf0){delay_nms(20);temp=KEY_8;temp=temp&0xf0;while(temp!=0xf0){temp=KEY_8;switch(temp){case0xee:num=0;break;//11101110case0xde:num=1;break;//11011110case0xbe:num=2;break;//10111110case0x7e:num=3;break;//01111110}while(temp!=0xf0)//等待按键释放{temp=KEY_8;temp=temp&0xf0;}}if(num==0||num==1||num==2)//判断是按下1,2,3{if(flag==0)//如果没有按符号键,符号前的数值为aa=a*10+table[num];elseif(flag==1)//如果按了符号键,符号后的数值为bb=b*10+table[num];if(denghao==1)//如果之前按了'='号,再按键时清屏,进行下一次计算{denghao=0;LCD_init();LCD_write_str(0,0,JIsuanqitest);write_com(0x80+0x40);//清屏}}elseif(num==3)//判断是否按下+{flag=1;fuhao=4;}key=table[num];//显示按下的键write_dat(0x30+key);}KEY_8=0xfd;//11111101temp=KEY_8;temp=temp&0xf0;while(temp!=0xf0){delay_nms(20);;temp=KEY_8;temp=temp&0xf0;while(temp!=0xf0){temp=KEY_8;switch(temp){case0xed:num=4;break;//11101101case0xdd:num=5;break;//11011101case0xbd:num=6;break;//10111101case0x7d:num=7;break;//01111101}while(temp!=0xf0)//等待按键释放{temp=KEY_8;temp=temp&0xf0;}}if(num==4||num==5||num==6)//判断是按下4,5,6{if(denghao==1)//如果之前按了'='号,再按键时清屏,进行下一次计算{denghao=0;LCD_init();LCD_write_str(0,0,JIsuanqitest);write_com(0x80+0x40);//清屏}if(flag==0)//如果没有按符号键,符号前的数值为aa=a*10+table[num];elseif(flag==1)//如果按了符号键,符号后的数值为bb=b*10+table[num];}elseif(num==7)//判断是否按下-{flag=1;fuhao=3;}key=table[num];//显示按下的键write_dat(0x30+key);}KEY_8=0xfb;//11111011temp=KEY_8;temp=temp&0xf0;while(temp!=0xf0){delay_nms(20);temp=KEY_8;temp=temp&0xf0;while(temp!=0xf0){temp=KEY_8;switch(temp){case0xeb:num=8;break;//11101011case0xdb:num=9;break;//11011011case0xbb:num=10;break;//10111011case0x7b:num=11;break;//01111011}while(temp!=0xf0){temp=KEY_8;temp=temp&0xf0;}}if(num==8||num==9||num==10)//判断是按下7,8,9{if(denghao==1)//如果之前按了'='号,再按键时清屏,进行下一次计算{denghao=0;LCD_init();LCD_write_str(0,0,JIsuanqitest);write_com(0x80+0x40);//清屏}if(flag==0)a=a*10+table[num];//如果没有按符号键,符号前的数值为aelseif(flag==1)b=b*10+table[num];//如果按了符号键,符号后的数值为b}elseif(num==11)//判断是否按下*{flag=1;fuhao=2;}key=table[num];write_dat(0x30+key);}KEY_8=0xf7;//11110111temp=KEY_8;temp=temp&0xf0;while(temp!=0xf0){delay_nms(20);temp=KEY_8;temp=temp&0xf0;while(temp!=0xf0){temp=KEY_8;switch
本文标题:51单片机计算器 AD DA
链接地址:https://www.777doc.com/doc-3687614 .html