




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于51单片机实验报告(计算器)一计算器模块1. 功能介绍利用8051单片机硬件资源和常用外围电路如 LCD1602七段数码管,时钟 (DS1302)温度传感器(18B20)等实现一个能做简单四则运算,并具有时钟显示, 温度显示附加功能的计算器。2. 设计方案利用STC89C5为内核的单片机,PC机。四则运算利用4*4矩阵键盘实现从0 9和运算符号的输入,并将操作过程 和结果显示在LCD 1 6 0 2上。时钟显示和温度显示,可以利用 DS1302产生年份,月份,日期,星期,时, 分,秒的数据,并将数据送往LCD 1 6 0 2显示,同样可以利用单片机开发板上面集成的DS18B20温度传感器来
2、测试周围环境的温度,将获取的温度通过在 LCD1602来 显示。DS1302<=>LCD 160矩阵缝盘DS18B2系统设计框图3. 具体实现代码计算器四则运算部分主要分为键盘扫描的键值读取,判断运算符号实现乘除优先级计算,LCD1602显示。键盘扫描常用的有行扫描法,线反转法,此处我们用行扫描法,可以更 明了读取键值。un sig ned char temp; key = nu II;/第一行按键P3 = 0xfe; temp = P3;temp = temp & OxfO;if (temp != OxfO)延时软件去抖动确认有键按下/读键值delay(10);/temp
3、 = P3;temp = temp & OxfO; if (temp != OxfO) / temp = P3; switch (temp)case Oxee: key = 'D' break;case Oxde: key = 0; break;case Oxbe: key ='=' break;case 0x7e: key = '/' break; flag+;读完按键值之后我们需要读取运算的数字与运算符号,通过判断键值为 数字则通过nun=nun*1O+key,计算出数字,判断键值为运算符号则读出 数字和键值。flag = O;add
4、r+;while (flag = O)sca n();如果有数据从键盘输入则关闭数码管的显示/如果有数字输入则连续读取数字if (flag>O)/ / latch = O;if (key >= O && key <= 9)display_lcd(key); num = num * 1O + key;key = nu II;read();else if (key = '+' | key = '-' | key = '/' | key = '*' | key ='=')display_
5、lcd(key);/碰到运算符则同时读取数字和运算符sym = key; key = nu II;elsedisplay_lcd(key); _uint read_num()/ 读取数字uint temp = num;num = 0;return temp;uchar read_sym()/读取运算符 _uchar temp = sym;sym = n ull;return temp;读取完键值之后,对运算符进行判断如果第二位运算符为乘除则在读取 一次数字和运算符,并将第二个操作数与第三个操作数相计算并赋给第 二个操作数,将第三个运算符赋给第二个运算符,并调用开始计算两个 操作符的函数继续判断
6、第二个操作符,直到第二个运算符为“=”为止,即可实现四则运算的优先级运算。if (sym2 = '=')/简单运算如果第二个运算符为switch (sym1)case '+':result = num1 + num2; delay(500);display_result(result);/ 直接计算并在 LCD上显示break;case '-': result = numl - num2;delay(500);display_result(result);如果第二个操作符不是“=”,则需先先计算一步,并将计算结果,和读 取的第三个键值赋给第二组的
7、数字和运算符,继续循环判断。read();temp = sym2;if (syml = '*')/第一个操作符为乘除则先计算前两个数字 calculate( nu ml* nu m2, temp, read_ num(), read_sym();_ else if (sym1 = '/')calculate( numl / nu m2, temp, read_ num(), read_sym();_ else if (sym2 = '*')/第二个操作符为乘除先计算后面两个数字 calculate( nu ml, syml, nu m2*read
8、_ num(), read_sym();_ else if (sym2 = '/') calculate( nu ml, syml, num2 / read_ num(), read_sym();LCD显示结果LCD显示主要是控制三个端口 Icden = 0;lcdrs = 0;lcdrw=0;分别为使能端, 控制向LCD读写,控制向LCD写数据和命令。void ini t_lcd()lcdrw = 0;write_comma nd(0x38); /write_comma nd(0x0f);/write_comma nd(0x06);/write_comma nd(0x01);
9、/write_comma nd(0x80);/万年历模块1.功能描述主要依靠时钟芯片DS1302来实现,通过读取函数将芯片中的计时数据读 取出来,并显示在LCD上,再通过写入数据函数将初始值赋予时钟芯片,最 后的设置部分是靠单片机上的独立按键以及写入数据函数来实现的。VcC2 匚;12 8 VcciX1:;2'I SCLKX2匚;36n i/oGND匚45图3.1 DS1302引脚图使用DS1302时,要对其引脚和寄存器进行特殊设置,以实现所需功能。弓I 脚设置后面会提及,这里不做说明,主要讲一下程序的编写。2 代码实现:.DS1302的的工作过程中包过读写一个字节数据等过程,具体代码
10、实现如下:向DS1302中写入数据,利用 RTInputByte函数向DS1302中一字节一字 节的写入数据,RTInputByte函数具体是根据要输入的数据的每一位的1或0的情况,来控制IO 口来进行高低电平的变化,从而实现一字节数据 的输入。而对于DS1302而言,输入的数据前8位为地址,后8位为输入 的地址。void W1302(uchar ucAddr, uchar ucDa)T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr);/* 地址,命令 */RTInputByte(ucDa);/* 写 1Byte 数据 */T_CLK = 1;T
11、_RST = 0;从DS1302中读取数据,原理基本同上uchar R1302(uchar ucAddr)uchar ucData;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr);/*地址,命令 */ucData = RTOutputByte(); /*读 1Byte 数据 */T_CLK = 1;T_RST = 0;return(ucData);按键设置部分的实现,利用单片机上的独立按键来实现:void keysca n()if(s1=O)lcd_delay(10);if(s1=0)time_data_buff1+;if(time_data
12、_buff 1=0x5a) 一 一time_data_buff1=0x00; 一 一while(!s1);if(time_data_buff1=0x0a)time_data_buff 1=0x10; 一 一if(time_data_buff1=0x1a) 一 一time_data_buff1=0x20; 一 一if(time_data_buff1=0x2a) 一 一time_data_buff1=0x30; if(time_data_buff1=0x3a) 一 一time_data_buff1=0x40; 一 一if(time_data_buff1=0x4a) 一 一time_data_buf
13、f1=0x50;Set1302(time_data_buff); 一 一if(s2=0)lcd_delay(10);if(s2=0) time_data_buff2+;if(time_data_buff2=0x24) 一 一 time_data_buff2=0x00; 一 一 if(time_data_buff2=0x0a) time_data_buff2=0x10; 一 一if(time_data_buff2=0x1a) 一 一 time_data_buff2=0x20; 一 一while(!s2);Set1302(time_data_buff); 一 一if(s3=0)lcd_delay(
14、10);if(s3=0)time_data_buff5+;if(time_data_buff5=0x07) 一 一time_data_buff5=0x00;while(!s3);Set1302(time_data_buff); 一 一if(s4=0)lcd_delay(10);if(s4=0) time_data_buff3+;if(time_data_buff3=0x32) 一 一 time_data_buff3=0x01; if(time_data_buff3=0x0a)一一time_data_buff3=0x10;一一if(time_data_buff3=0x1a) 一 一 time_d
15、ata_buff3=0x20; 一 一 if(time_data_buff3=0x2a) time_data_buff3=0x30; 一 一 while(!s4);Set1302(time_data_buff); 一 一三温度测量模块1.功能描述:该模块主要利用温度传感器 DS18b20测量温度并将温度显示在LCD上。 1. DS18b20芯片介绍: 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即 可实现微处理器与DS18B20的双向通讯。 测温范围55C+125C,固有测温误差(注意,不是分辨率,这里 之前是错误的)1 °C。 支持多点组网功能,多个 DS18
16、B2C可以并联在唯一的三线上,最多只 能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。 工作电源:3.05.5V/DC(可以数据线寄生电源) 在使用中不需要任何外围元件 测量结果以912位数字量方式串行传送下图展示18b20时序图(非常重要!)*/*/*/町障>iiji *v _GND -.王左器乘样* ISiB测 3 ifciHH#in clude<reg52.h>#i ncludevi ntri ns.h>有 _nop_旨令sbit RS = P2A4;/1602控制端2.具体代码实现:/*/*温度测量*/*/*/*/*/头文
17、件端口定义Hi电怆时序% - 单彌GNDVm.亘思議(TNDDS I 迪 0王訐希技咲好三肿神至欢480中可T时視< -lTne xk刃妙T秤釜笼收 至少480usDSISB?O 炭走Hk- 60述壮此帚小宜型帚弋1*屮牝"一* 1、妙*|* 宀洋*1* 一 丸坚 fM2打时庁sbit RW = P2A5;sbit EN =卩2八6;sbit DQ = P1A3;/18b20总线引脚*/*函数声明*/*/*/*延时函数*/*/void Delay4us()延时 4usJvoid Delay(u nsig ned char j)/一个循环延时 15usun sig ned cha
18、r i;while(j-)i=5;while(-i);/*/*18b20初始化函数*/*/bit In it_18b20()bit dat;DQ = 1;/DQ 复位Delay4us();DQ = 0;/拉低总线Delay(35);/ 延时 525usDQ = 1;/拉高总线1时没有)Delay(2);/延时 30usdat = DQ;/读取返回值(为0时有18b20存在,为 Delay(2);return(dat);/*/*18b20/*/void WriteData_18b20(u nsig ned char dat)/ _un sig ned char i;for(i=0;i<8;
19、i+)写入数据函数*/写8位数据DQ = 0;/拉低总线DQ = dat&0x01;/将dat的最低位赋给总线Delay;延时 60usDQ = 1;/拉高总线准备写下一个数据dat>>=1;/数据右移一位/*/读数据*/*18b20/*/un sig ned char ReadData_18b20() _un sig ned char i,dat=0;for(i=0;i<8;i+)DQ = 0;/拉低总线dat >>= 1;/ 数据右移一位DQ = 1;/拉高总线准备读取数据if(DQ)/判断若是1.将数据赋给变量最高位dat=dat|0x80;Dela
20、y(4);return(dat);/*/*/读取温度值函数/* /*/ un sig ned int ReadTemp()un sig ned char i = 0;/低八位温度数据un sig ned char j = 0;/高八位温度数据unsigned int k = 0;/ 总 16 位温度数据 In it_18b20();/ 初始化 WriteData_18b20(0xcc);跳过序列号操作WriteData_18b20(0x44);/开启温度转换Delay(200); 延时 3msIni t_18b20();初始化WriteData_18b20(0xcc);WriteData_18
21、b20(0xbe); 读取 18b20 寄存器 i=ReadData_18b20(); 低八位 j=ReadData_18b20(); 高八位k = j;k <<= 8;k = k + i;return(k);*/*us延时*/*/void Delayus( un sig ned char t)while(-t);*/*ms延时*/*/void Delayms( un sig ned char t) while(-t)Delayus(245);Delayus(245);*/*1602读忙*/*/bit Busy_1602()P0 = 0xff;RS = 0;RW = 1;EN =
22、1;return (bit)(P0 & 0x80);*/*1602写入*/void Write_1602(bit i, un sig ned char j)/*/参数i为0写指令,为1写数据。参数j为数据while(Busy_1602()忙时等待_nop_();_nop_();_nop_();_nop_();_nop_();RS = i;RW = 0;EN = 1;P0 = j;_nop_();EN = 0;/*/*1602清屏*/*/void Clear_1602()Write_1602(0,0x01);Delayms(5);/*/*1602字符显示*/ void ShowByte_
23、1602(unsigned char x, unsigned char y, unsigned char dat)/x 为列,y为行,dat为数据if(y=0)Write_1602(0,(0x80+x); 第一行elseWrite_1602(0,(0xc0+x); 第二行Write_1602(1,dat);写入数据/*/*1602字符串显示*/void ShowStri ng_1602( un sig ned char x, un sig ned char y, un sig ned char *dat)if(y=0)Write_1602(0,(0x80+x);elseWrite_1602(0
24、,(0xc0+x);while(*dat)Write_1602(1,*dat);dat+;/*/*1602初始化*/ void In it_1602()Write_1602(0,0x38);Delayms(5);Write_1602(0,0x38);Delayms(5);Write_1602(0,0x38);Delayms(5);Write_1602(0,0x38);Write_1602(0,0x08);Write_1602(0,0x01);Write_1602(0,0x06); Delayms(5);Write_1602(0,0x0c); 显示模式设置只开显示显示清屏地址加1,当写入数据的时
25、候光标右移显示开,光标关/*1602自定义字符(摄氏度的小点)*/*/void Lcd_User_Char() 一 一Write_1602(0,0x48);Write_1602(1,0x03);Write_1602(0,0x49);Write_1602(1,0x03);Write_1602(0,0x4a);Write_1602(1,0x00);Write_1602(0,0x4b);Write_1602(1,0x00);Write_1602(0,0x4c);Write_1602(1,0x00);Write_1602(0,0x4d);Write_1602(1,0x00);Write_1602(0,0x4e);Write_1602(1,0x00);Write_1602(0,0x4f);Write_1602(1,0x00);/*/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业废弃物处理的物联网解决方案
- 工业旅游的规划与实施
- 工业机器人系统的集成与优化
- 工业机器人技术进展及影响
- 工业生态化改造与实践案例分析
- 工业能源管理与自动化控制技术
- 工业设备智能化升级解决方案
- 工业自动化中的语音控制技术应用
- 工业设计中的师徒智慧-产品设计专业成长
- 工作与生活平衡与员工福利设计
- 2025年特种设备安全考试题库特种设备安全管理人员法规应用试卷
- 普法试题及答案初中
- 中控岗位考试题及答案
- 商铺退押金协议书
- 碘对比剂护理应用与安全管理
- 2025-2030年中国航空密封件行业市场现状供需分析及投资评估规划分析研究报告
- 知识产权租赁协议书
- GB 45673-2025危险化学品企业安全生产标准化通用规范
- 医院培训课件:《新生儿早期基本保健专家共识(2020)解读》
- 山东开放大学招聘真题2024
- 《治疗癫痫药物》课件
评论
0/150
提交评论