Nokia5110程序.doc_第1页
Nokia5110程序.doc_第2页
Nokia5110程序.doc_第3页
Nokia5110程序.doc_第4页
Nokia5110程序.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include /* common defines and macros */#include derivative.h /* derivative-specific definitions */#define uchar unsigned char#define uint unsigned int#define lcd12864_date PORTB /数据口 #define lcd12864_rs PTT_PTT5/ PTT_PTT5; /寄存器选择输入 #define lcd12864_rw PTT_PTT3 /液晶读/写控制#define lcd12864_e PTT_PTT2 /液晶使能控制 #define DQ PORTA_PA0 / 定义DQ引脚为P3.3 #define DQ_HIGH() DDRA=0 /设置数据口为输入#define DQ_LOW() DDRA=1;DQ=0; /设置数据口为输出/uint temp; /温度值 variable of temperatureuchar A1,A2,A3; void delay2(uint i); void Init_Ds18b20(void); uchar Read_One_Byte(); void Write_One_Byte(uchar dat);uint Get_Tmp(); void DisplayTemp(uint temp) ; void delay(unsigned int t) uint i,j; for(i=t;i0;i-) for(j=1000;j0;j-); void lcd12864_write_cmd(unsigned char command) /写指令 lcd12864_rs=0; lcd12864_rw=0; lcd12864_e=0; lcd12864_date=command; delay(5); lcd12864_e=1; lcd12864_e=0; delay(5); void lcd12864_write_data(unsigned char data) / 写数据 写入一个字符 lcd12864_rs=1; lcd12864_rw=0; lcd12864_e=0; lcd12864_date=data; delay(5); lcd12864_e=1; lcd12864_e=0; delay(5); void lcd12864_pos(unsigned char x,unsigned char y) /确定位置 unsigned char pos; if (x=1) x=0x80; else if (x=2) x=0x90; else if (x=3) x=0x88; else x=0x98; pos=x+y-1; lcd12864_write_cmd(pos); /显示地址void io_init() lcd12864_write_cmd(0x30); /基本指令操作 lcd12864_write_cmd(0x0C); /显示开,关光标 lcd12864_write_cmd(0x01); /清除LCD的显示内容 位置计数器调整为0x00void lcd12864_wrtie_string( char *str) /写字符串 while(*str!=0) /未结束 lcd12864_write_data(*str+); void init_LCD() delay(20); lcd12864_write_cmd(0x30); delay(20); lcd12864_write_cmd(0x30); delay(20); lcd12864_write_cmd(0x0c);/开显示,不显示光标,且不闪烁 delay(20); lcd12864_write_cmd(0x01); /清屏 delay(20); lcd12864_write_cmd(0x06); /每次写入数据后地址指针加1 delay(20);/*/void Display1() lcd12864_pos(1,2); lcd12864_wrtie_string(温度调节系统); lcd12864_pos(2,1); lcd12864_wrtie_string(菜单1:当前温度); lcd12864_pos(3,1); lcd12864_wrtie_string(菜单2:目标温度); lcd12864_pos(4,1); lcd12864_wrtie_string(菜单3:温度曲线); void Display2() lcd12864_pos(1,2); lcd12864_wrtie_string(温度调节系统); lcd12864_pos(2,1); lcd12864_wrtie_string(当前温度 :*度); lcd12864_pos(3,1); lcd12864_wrtie_string(目标温度 :*度); lcd12864_pos(4,2); lcd12864_wrtie_string( Welcome ! ); void main(void) delay(5); DDRB=0xff; DDRT=0xff; / io_init(); init_LCD(); lcd12864_pos(2,2); lcd12864_wrtie_string( Welcome To ! ); lcd12864_pos(3,2); lcd12864_wrtie_string(温度调节系统); delay(2000); lcd12864_write_cmd(0x01); /清屏 delay(20); while(1) DisplayTemp(Get_Tmp(); lcd12864_pos(2,3); lcd12864_write_data(0x30+A1); lcd12864_pos(2,4); lcd12864_write_data(0x30+A2); lcd12864_pos(2,5); lcd12864_write_data(0x2e); lcd12864_pos(2,6); lcd12864_write_data(0x30+A3); /*Display1() ; */ /*精确延时函数*/void delay2(unsigned int i) i=10*i; while(-i); /*此延时函数针对的是12Mhz的晶振delay(0):延时518us 误差:518-2*256=6delay(1):延时7us (原帖写5us是错的)delay(10):延时25us 误差:25-20=5delay(20):延时45us 误差:45-40=5delay(100):延时205us 误差:205-200=5delay(200):延时405us 误差:405-400=5*/*DS18B20*/void Init_Ds18b20(void) /DS18B20初始化send reset and initialization commandchar presence=1;while(presence) /DQ = 1; /DQ复位,不要也可行。DQ_LOW(); delay2(250); /精确延时,维持至少480us DQ_HIGH(); delay2(11); if(DQ=1) presence=1; else presence=0;/DQ = 1; /释放总线,即拉高了总线/DQ_LOW();delay2(100); /此处延时有足够,确保能让DS18B20发出存在脉冲。uchar Read_One_Byte() /读取一个字节的数据read a byte date /读数据时,数据以字节的最低有效位先从总线移出uchar i = 0;uchar dat = 0;for(i=8;i0;i-) /DQ = 0; /将总线拉低,要在1us之后释放总线 /单片机要在此下降沿后的15us内读数据才会有效。 / delay2(1); /至少维持了1us,表示读时序开始 dat = 1; /让从总线上读到的位数据,依次从高位移动到低位。 delay2(1); DQ_LOW(); /释放总线,此后DS18B20会控制总线,把数据传输到总线上 delay2(1); /延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分 DQ_HIGH(); if(DQ) /控制器进行采样 dat |= 0x80; /若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0 delay2(10); /此延时不能少,确保读时序的长度60us。return (dat);void Write_One_Byte(uchar dat)uchar i = 0;uchar flag;for(i=8;i0;i-) /DQ=0; /拉低总线 / delay2(1); /至少维持了1us,表示写时序(包括写0时序或写1时序)开始 flag = dat&0x01; /从字节的最低位开始传输 DQ_LOW(); /指令dat的最低位赋予给总线,必须在拉低总线后的15us内, /因为15us后DS18B20会对总线采样。 if(flag=1) DQ_HIGH(); delay2(10); /必须让写时序持续至少60us DQ_HIGH(); /写完后,必须释放总线, delay2(1); dat = 1; /delay2(1);uint Get_Tmp() /获取温度get the temperaturefloat tt;uint temp1;uchar a,b;DQ_HIGH(); Init_Ds18b20(); /初始化Write_One_Byte(0xcc); /忽略ROM指令Write_One_Byte(0x44); /温度转换指令 delay2(10); Init_Ds18b20(); /初始化Write_One_Byte(0xcc); /忽略ROM指令Write_One_Byte(0xbe); /读暂存器指令a = Read_One_Byte(); /读取到的第一个字节为温度LSBb = Read_One_Byte(); /读取到的第一个字节为温度MSBDQ_HIGH(); temp1 = b; /先把高八位有效数据赋于temptemp1 = 8; /把以上8位数据从temp低八位移到高八位temp1 = temp1|a; /两字节合成一个整型变量tt = temp1*0.062

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论