




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Proteus仿真图程序部分/*lcd1602.c文件程序源代码*/#include #define LCD1602_DB P0sbit LCD1602_RS = P10;sbit LCD1602_RW = P11;sbit LCD1602_E = P15;void LcdWaitReady() /等待液晶准备好 unsigned char sta; LCD1602_DB = 0xFF; LCD1602_RS = 0; LCD1602_RW = 1; do LCD1602_E = 1; sta = LCD1602_DB; /读取状态字 LCD1602_E = 0; while (sta & 0x80); /bit7等于1表示液晶正忙,重复检测直到其等于0为止void LcdWriteCmd(unsigned char cmd) /写入命令函数 LcdWaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DB = cmd; LCD1602_E = 1; LCD1602_E = 0;void LcdWriteDat(unsigned char dat) /写入数据函数 LcdWaitReady(); LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat; LCD1602_E = 1; LCD1602_E = 0;void LcdShowStr(unsigned char x, unsigned char y, const unsigned char *str) /显示字符串,屏幕起始坐标(x,y),字符串指针str unsigned char addr; /由输入的显示坐标计算显示RAM的地址 if (y = 0) addr = 0x00 + x; /第一行字符地址从0x00起始 else addr = 0x40 + x; /第二行字符地址从0x40起始 /由起始显示RAM地址连续写入字符串 LcdWriteCmd(addr | 0x80); /写入起始地址 while (*str != 0) /连续写入字符串数据,直到检测到结束符 LcdWriteDat(*str); str+; void LcdInit() /液晶初始化函数 LcdWriteCmd(0x38); /16*2显示,5*7点阵,8位数据接口 LcdWriteCmd(0x0C); /显示器开,光标关闭 LcdWriteCmd(0x06); /文字不动,地址自动+1 LcdWriteCmd(0x01); /清屏/*DS18B20.c文件程序源代码*/#include #include sbit IO_18B20 = P32; /DS18B20通信引脚void DelayX10us(unsigned char t) /软件延时函数,延时时间(t*10)us do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); while (-t);bit Get18B20Ack(void) /复位总线,获取存在脉冲,以启动一次读写操作 bit ack; EA = 0; /禁止总中断 IO_18B20 = 0; /产生500us复位脉冲 DelayX10us(50); IO_18B20 = 1; DelayX10us(6); /延时60us ack = IO_18B20; /读取存在脉冲 while(!IO_18B20); /等待存在脉冲结束 EA = 1; /重新使能总中断 return ack;void Write18B20(unsigned char dat) /向DS18B20写入一个字节数据 unsigned char mask; EA = 0; /禁止总中断 for (mask=0x01; mask!=0; mask=1) /低位在先,依次移出8个bit IO_18B20 = 0; /产生2us低电平脉冲 _nop_(); _nop_(); if (mask&dat) = 0) /输出该bit值 IO_18B20 = 0; else IO_18B20 = 1; DelayX10us(6); /延时60us IO_18B20 = 1; /拉高通信引脚 EA = 1; /重新使能总中断unsigned char Read18B20(void) /从DS18B20读取一个字节数据 unsigned char dat; unsigned char mask; EA = 0; /禁止总中断 for (mask=0x01; mask!=0; mask=1) /低位在先,依次采集8个bit IO_18B20 = 0; /产生2us低电平脉冲 _nop_(); _nop_(); IO_18B20 = 1; /结束低电平脉冲,等待18B20输出数据 _nop_(); /延时2us _nop_(); if (!IO_18B20) /读取通信引脚上的值 dat &= mask; else dat |= mask; DelayX10us(6); /再延时60us EA = 1; /重新使能总中断 return dat;bit Start18B20() /启动一次18B20温度转换,返回值代表是否启动成功 bit ack; ack = Get18B20Ack(); /执行总线复位,并获取18B20应答 if (ack = 0) /如18B20正确应答,则启动一次转换 Write18B20(0xCC); /跳过ROM操作 Write18B20(0x44); /启动一次温度转换 return ack; /ack=0表示操作成功,所以返回值为其取反值bit Get18B20Temp(int *temp) /读取DS18B20温度值,返回值代表是否读取成功 bit ack; unsigned char LSB, MSB; /16bit温度值的低字节和高字节 ack = Get18B20Ack(); /执行总线复位,并获取18B20应答 if (ack = 0) /如18B20正确应答,则读取温度值 Write18B20(0xCC); /跳过ROM操作 Write18B20(0xBE); /发送读命令 LSB = Read18B20(); /读温度值的低字节 MSB = Read18B20(); /读温度值的高字节 *temp = (int)MSB 8) + LSB; /合成为16bit整型数 return ack; /ack=0表示操作应答,所以返回值为其取反值/*main.c文件程序源代码*/#include bit flag1s = 0; /1s定时标志unsigned char T0RH = 0; /T0重载值的高字节unsigned char T0RL = 0; /T0重载值的低字节void ConfigTimer0(unsigned int ms);unsigned char IntToString(unsigned char *str, int dat);extern bit Start18B20();extern bit Get18B20Temp(int *temp);extern void LcdInit();extern void LcdShowStr(unsigned char x, unsigned char y, const unsigned char *str);void main () bit res; int temp; /读取到的当前温度值 int intT, decT; /温度值的整数和小数部分 unsigned char len; unsigned char str12; LcdInit(); /初始化液晶 Start18B20(); /启动DS18B20 ConfigTimer0(10); /T0定时10ms EA = 1; /开总中断 while(1) if (flag1s) /每秒更新一次温度 flag1s = 0; res = Get18B20Temp(&temp); /读取当前温度 if (res) /读取成功时,刷新当前温度显示 intT = temp 4; /分离出温度值整数部分 decT = temp & 0xF; /分离出温度值小数部分 len = IntToString(str, intT); /整数部分转换为字符串 strlen+ = .; /添加小数点 decT = (decT*10) / 16; /二进制的小数部分转换为1位十进制位 strlen+ = decT + 0; /十进制小数位再转换为ASCII字符 while (len 6) /用空格补齐到6个字符长度 strlen+ = ; strlen = 0; /添加字符串结束符 LcdShowStr(3, 0, temperature); LcdShowStr(7, 1, str); /显示到液晶屏上 else /读取失败时,提示错误信息 LcdShowStr(6, 0, error!); Start18B20(); /重新启动下一次转换 unsigned char IntToString(unsigned char *str, int dat) /整型数转换为十进制字符串,返回值为转换后的字符串长度 signed char i; unsigned char len = 0; unsigned char buf6; if (dat 0) /如果为负数,首先取绝对值,并添加负号 dat = -dat; *str+ = -; len+; for (i=0; i=1; i-) /查找有效数字最高位,以忽略更高位的0 if (buf i != 0) break; for ( ; i=0; i-) /有效数字位转换为ASCII码 *str+ = buf i + 0; len+; *str = 0; /添加字符串结束符 return len; /返回字符串长度void ConfigTimer0(unsigned int ms) /T0配置函数 unsigned long tmp; tmp = 11059200 / 12; /定时器计数频率 tmp = (tmp * ms) / 1000; /计算所需的计数值 tmp = 65536 - tmp; /计算定时器重载值 tmp = tmp + 12; /修正中断响应延时造成的误差 T0RH = (unsigned char)(tmp 8); /定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0; /清零T0的控制位 TMOD |= 0x01; /配置T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国双立轴刨木机行业市场发展前景及发展趋势与投资战略研究报告
- 2025-2030年中国机印手机刮条项目投资可行性研究分析报告
- 2025至2030年中国对甲氧基苯磺酰胺数据监测研究报告
- 2025至2030年中国咳喘鼻闻安市场分析及竞争策略研究报告
- 2025至2030年中国吊牌卡纸行业投资前景及策略咨询研究报告
- 2025至2030年中国叠式电焗炉行业发展研究报告
- 2025至2030年中国双工位收排线机行业投资前景及策略咨询研究报告
- 2025至2030年中国厨房用铲行业投资前景及策略咨询报告
- 2025至2030年中国压电天平式数字粉尘计市场分析及竞争策略研究报告
- 2025年中国变频调速电机市场竞争态势及投资战略规划研究报告
- 2024年四川省眉山市中考地理+生物试卷(含答案)
- 房地产中介服务质量调研报告
- 当代世界经济与政治 李景治 第八版 课件 第1、2章 当代世界政治、当代世界经济
- 2023年复合型胶粘剂项目安全评价报告
- DZ∕T 0215-2020 矿产地质勘查规范 煤(正式版)
- 【初中+语文】中考语文一轮专题复习+《名著阅读+女性的力量》课件
- 城市道路桥梁工程施工质量验收规范 DG-TJ08-2152-2014
- 响应面分析软件DesignExpert使用教程
- 《新病历书写规范》课件
- 2024城镇燃气管道非开挖修复更新工程技术规范
- 肠胃消化健康的知识讲座
评论
0/150
提交评论