ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:23.51KB ,
资源ID:7973238      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7973238.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(51单片机计算器 ADDA.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

51单片机计算器 ADDA.docx

1、51单片机计算器 AD DA说明:该源程序包括键盘计算器,AD总线 DA总线 Music播放 串口收发 液晶显示;程序段均用/*/隔开;为方便大家使用已将各程序段分开,共参考。若需建立全部功能则分别建立各自.H文件,将它们全加入工程。另附仿真Proteus图。 各延时程序/*/#include #include #include delay.h#define uchar unsigned char#define uint unsigned int void delay_nus(uint x) while(x-); void delay_nms(uint z)/毫秒级延时函数 uint i,j;

2、 for(i=0;iz;i+) for(j=0;j0;c-) for(a=125;a0;a-) for(b=200;b0;b-);void music_delay(uint z) /延时165MS,即十六分音符 uint x,y; for(x=z;x0;x-) for(y=19000;y0;y-);void music_delay1(uint z) /延时1MS uint x,y; for(x=z;x0;x-) for(y=112;y0;y-); /*/#include /包括一个 52 标准内核的头文件 #include #include /包含有左右循环移位子函数的库#include ad

3、c.h#include LCD1602.h#include delay.h#define uchar unsigned char /宏定义, 定义一下方便使用#define uint unsigned int#define IN0 XBYTE0X0000uchar bai,shi,ge,ii=0,jieguo;uchar xdata *ad_adr; /=/ ADC0809模数转换/=void ADC0809_main(void) uchar cun; ad_adr=&IN0; *ad_adr=ii; delay_nus(1000); jieguo=*ad_adr; /读取转换结果 jiegu

4、o=jieguo*500/255; /A/D分辨率为8位(255),转换出0-5v的实数值 cun=(unsigned char)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);/*/#include #include #inc

5、lude #include delay.h#include dac.h#define uchar unsigned char#define uint unsigned int#define DAC0832 XBYTE 0x7fff /=/ DAC0832转换函数/=void DAC0832_shanjiaobo() uchar i,k; for(i=0;i100;i+) for(k=0;k255;k+) /k0;k-) DAC0832=k; void DAC0832_fangbo() uchar i; for(i=0;i100;i+) DAC0832=0X00; /输入低电平 delay_nu

6、s(500); /延时 DAC0832=0xff; delay_nus(500); void dac0832_main() DAC0832_fangbo(); DAC0832_shanjiaobo();/*/#include #include delay.h#include LCD1602.h#include KEY.h#define uchar unsigned char#define uint unsigned intuchar num; /存放按键标识uchar denghao=0,flag=0,fuhao,key; /denghao存放是否按下等号键,flag存放是否按下符号键,fuh

7、ao存放按下是什么符号,key存放按键ASCII码值long a,b,c; /加数a、b 结果为cuchar code table= /键盘显示编码,加上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,

8、0x3d-0x30, 0x2f-0x30; / 0、 =、 CE、 / ;void keyscan() uchar temp; KEY_8=0xfe; /1111 1110 temp=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) case 0xee:num=0;break; /1110 1110 case 0xde:num=1;break; /1101 1110 case 0xbe:num

9、=2;break; /1011 1110 case 0x7e:num=3;break; /0111 1110 while(temp!=0xf0) /等待按键释放 temp=KEY_8; temp=temp&0xf0; if(num=0|num=1|num=2) /判断是按下1,2,3 if(flag=0) /如果没有按符号键,符号前的数值为a a=a*10+tablenum; else if(flag=1) /如果按了符号键,符号后的数值为b b=b*10+tablenum; if(denghao=1) /如果之前按了=号,再按键时清屏,进行下一次计算 denghao=0; LCD_init(

10、); LCD_write_str(0,0,JIsuanqitest); write_com(0x80+0x40); /清屏 else if(num=3) /判断是否按下+ flag=1; fuhao=4; key=tablenum; /显示按下的键 write_dat(0x30+key); KEY_8=0xfd; / 1111 1101 temp=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

11、) case 0xed:num=4;break; /1110 1101 case 0xdd:num=5;break; /1101 1101 case 0xbd:num=6;break; /1011 1101 case 0x7d:num=7;break; /0111 1101 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_st

12、r(0,0,JIsuanqitest); write_com(0x80+0x40); /清屏 if(flag=0) /如果没有按符号键,符号前的数值为a a=a*10+tablenum; else if(flag=1)/如果按了符号键,符号后的数值为b b=b*10+tablenum; else if(num=7) /判断是否按下- flag=1; fuhao=3; key=tablenum; /显示按下的键 write_dat(0x30+key); KEY_8=0xfb; /1111 1011 temp=KEY_8; temp=temp&0xf0; while(temp!=0xf0) del

13、ay_nms(20); temp=KEY_8; temp=temp&0xf0; while(temp!=0xf0) temp=KEY_8; switch(temp) case 0xeb:num=8;break; /1110 1011 case 0xdb:num=9;break; /1101 1011 case 0xbb:num=10;break; /1011 1011 case 0x7b:num=11;break; /0111 1011 while(temp!=0xf0) temp=KEY_8; temp=temp&0xf0; if(num=8|num=9|num=10) /判断是按下7,8,

14、9 if(denghao=1) /如果之前按了=号,再按键时清屏,进行下一次计算 denghao=0; LCD_init(); LCD_write_str(0,0,JIsuanqitest); write_com(0x80+0x40); /清屏 if(flag=0) a=a*10+tablenum; /如果没有按符号键,符号前的数值为a else if(flag=1) b=b*10+tablenum; /如果按了符号键,符号后的数值为b else if(num=11) /判断是否按下* flag=1; fuhao=2; key=tablenum; write_dat(0x30+key); KE

15、Y_8=0xf7; /1111 0111 temp=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) case 0xe7:num=12;break; /1110 0111 case 0xd7:num=13;break; /1101 0111 case 0xb7:num=14;break; /1011 0111 case 0x77:num=15;break; /0111 0111 while(t

16、emp!=0xf0) temp=KEY_8; temp=temp&0xf0; switch(num) case 13: /按0键 if(denghao=1) /如果之前按了=号,再按键时清屏,进行下一次计算 denghao=0; LCD_init(); LCD_write_str(0,0,JIsuanqitest); write_com(0x80+0x40); /清屏 if(flag=0) a=a*10; else if(flag=1) b=b*10; write_dat(0x30); break; case 14: /按=键(+、-、*、/、) denghao=1; if(fuhao=1)

17、/如果符号键是+,执行+运算 write_com(0x80+0x4f); /使结果从屏幕最右下角显示出来 write_com(0x04); /从右到左显示 c=a+b; while(c!=0) write_dat(0x30+c%10); c=c/10; write_dat(0x3d); /显示等号= fuhao=0; a=0; b=0; flag=0; if(fuhao=2) /如果符号键是-,执行-运算 write_com(0x80+0x4f); /使结果从屏幕最右下角显示出来 write_com(0x04); if(a=b) c=a-b; while(c!=0) write_dat(0x3

18、0+c%10); c=c/10; else if(ab) c=b-a; while(c!=0) write_dat(0x30+c%10); c=c/10; write_dat(0x2d); /显示负号 write_dat(0x3d); /显示等号= a=0; b=0; flag=0; fuhao=0; if(fuhao=3) /如果符号键是*,执行*运算 write_com(0x80+0x4f); /使结果从屏幕右下角显示出来 write_com(0x04); c=a*b; while(c!=0) write_dat(0x30+c%10); c=c/10; write_dat(0x3d); /

19、显示等号= a=0; b=0; flag=0; fuhao=0; if(fuhao=4) /如果符号键是/,执行/运算 key=0; /小数位数 write_com(0x80+0x4f); write_com(0x04); if(b!=0) c=(long)( ( (float)a/b )*10000); /结果保留4位小数 else LCD_write_str(1,15,rorre); /显示错位 while(c!=0) write_dat(0x30+c%10); c=c/10; key+; if(key=4) /显示完六位小数后,显示小数点 write_dat(0x2e); /显示小数点

20、if(a/b=0) write_dat(0x30); /显示0 write_dat(0x3d); /显示等号 a=0; b=0; flag=0; fuhao=0; break; case 12: LCD_init(); LCD_write_str(0,0,JIsuanqitest); write_com(0x80+0x40); /清屏 a=0; b=0; flag=0; fuhao=0; break; case 15: flag=1; fuhao=1; write_dat(0x30+tablenum); break; void jisuanqi_main() keyscan(); void i

21、nt1() interrupt 2 EX1=0;/关外部中断1 /music_delay1(1);/去抖 EX1=1;/开外部中断1/*/#include#include LCD1602.h#include delay.hvoid write_num(uchar num) /写数据线命令(四线模式数据要分两次写) LCD_date &= 0x0F; /清高四位端口 LCD_date |= (num&0xF0); /写高四位数据 LCD_EN = 1; /EN=1 delay_nus(5); LCD_EN = 0; /EN=0 LCD_date &= 0x0F; /清高四位端口 LCD_date

22、 |= (num&0x0F)4); /写低四位数据 LCD_EN = 1; /EN=1 delay_nus(5); LCD_EN = 0; /EN=0void write_com(uchar com) /写指令/ check_busy(); /读忙 LCD_RS = 0;/ LCD_RW=0; /写入 write_num(com); void write_dat(uchar dat) /写函数/ check_busy(); /读忙 LCD_RS = 1;/ LCD_RW=0; /写入 write_num(dat);void LCD_init(void) /LCD初始化 delay_nms(15

23、); /原来1602初始化成4位数据线之前必需先初始化成8位 write_com(0x33); /(此时命令发送方式是8位格式,但数据线只需接4位), delay_nms(5); /然后再改到4位线宽,这样初始化才稳定 write_com(0x32); delay_nms(5); write_com(0x28); /四线模式设置 write_com(0x0f); /显示开-对应开关显示控制指令 write_com(0x01); /清屏-对应清屏指令 delay_nms(5);void LCD_set_addr(uchar x,uchar y)/写地址函数 if(x) write_com(0xc0+y); /第二行显示 else write_com(0x80+y); /第一行显示 void LCD_write_char(uchar x,uchar y,uchar zifu)/写字符函数 LCD_set_addr(x,y); write_dat(zifu); void LCD_write_str(uc

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1