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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

PIC16F877万年历.docx

1、PIC16F877万年历/* 标题:DS18B20测温 * 日期:2008年1月13日 * 说明:使用DS18B20芯片测温 */# define DQ RA3 /定义18B20数据端口 # define DQ_DIR TRISC3 /定义18B20D口方向寄存器 uchar Temp; float f_temp; void delay_18b20(uint i)while(i-); void init_DS18B20() /系统初始化函数 uchar x=0; ADCON1=0X07; /设置A口为普通数字口 TRISA=0X00; /设置A口方向为输出 TRISC3=0; DQ = 1;

2、/DQ复位 delay_18b20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18b20(80); /精确延时 大于 480us-900us DQ = 1; /拉高总线 delay_18b20(14); /拉高36us x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18b20(20); /设置C口方向为输出 reset_DS18B20(void) /复位DS18B20函数 char presence=1; while(presence) DQ=0 ; /主机拉至低电平 delay(2,90); /延时503us DQ=1; /释放总

3、线等电阻拉高总线,并保持1560us delay(2,8); /延时70us if(DQ=1) presence=1; /没有接收到应答信号,继续复位 else presence=0; /接收到应答信号 delay(2,70); /延时430us void Wait_DS18B20() /等待程序,等待 ds18b20 应答 uchar i; while(DQ); while(!DQ); i=6; while(i0)i-; void write_byte(uchar dat) /写18b20写字节函数 uchar i,j; bit temp1; for(j=8;j0;j-) temp1=dat

4、&0x01; /最低位移出 dat=dat1 /从高拉至低电平,产生写时间隙 if(temp1) DQ=0; i+;i+;i+;i+; DQ=1; i=13; while(i0) i-; DQ=1; /如果写1,拉高电平 i+,i+,i+,i+; /延时63us else DQ=0; i=13; while(i0) i-; DQ=1; i+;i+;i+;i+; bit read_temp_bit() /读取18b20一位数据函数 uchar i; bit dat; DQ=0;i+; DQ=1;i+;i+; dat=DQ; i=8; while(i0) i-; return (dat); uch

5、 read_temp_byte(void) /读取18b20读一字节函数 uchar i,j,value=0; for(i=8;i0;i-) j=read_temp_bit(); value=(j1); return(value); void temp_Convert(void) /开始转换 Reset_DS18B20(); Wait_DS18B20(); /等待应答脉冲 Write_byte(0xcc); /跳过序列号脉冲 Write_byte(0x44); /转换命令 uint get_temp() /启动温度转换函数 int i; uchar L_18B20,H_18B20; init_

6、DS18B20(); delay_DS18B20(1); reset_DS18B20(); Wait_DS18B20(); /复位等待从机应答 write_byte(0XCC); /忽略ROM匹配 write_byte(0Xbe); /发送温度转化命令 L_18B20=Read_temp_byte(); /读取低八位数据 H_18B20=Read_temp_byte(); /读取高八位数据 temp=H_18B20; temp0; i-) IO = d&0x01; /取最低位 SCLK = 1; /上升沿发送 SCLK = 0; /恢复 d = d 1; uchar RTOutputByte(

7、void) /从1302读取1Byte数据 uchar i,val=0; TRISA4=1; /RA4设置为输入 for(i=8; i0; i-) val = val 1; if(IO)val=val|0x80; / 从最低位开始接收 SCLK = 1; /下降沿接收 SCLK = 0; return(val); void W1302(uchar ucAddr, uchar ucDa) /先写地址,后写命令/数据 RST = 0; SCLK = 0; RST = 1; /打开DS1302 RTInputByte(ucAddr); /地址,命令 RTInputByte(ucDa); /写1Byt

8、e数据 RST = 0; /关闭DS1302 SCLK = 1;uchar R1302(uchar ucAddr) /先写地址,后读命令/数据 uchar ucData; RST = 0; SCLK = 0; RST = 1; RTInputByte(ucAddr); /地址,命令 ucData = RTOutputByte(); /读1Byte数据 RST = 0; SCLK = 1; return(ucData);void Set1302(uchar *pClock) /向1302写入秒分时日月星期 年 uchar i; uchar ucAddr = 0x80; /起使地址 W1302(0

9、x8e,0x00); /控制命令,WP=0,允许写操作 for(i =7; i0; i-) W1302(ucAddr,*pClock); /秒分时日月星期年 pClock+; ucAddr +=2; /写地址加2 W1302(0x8e,0x80); /控制命令,WP=1,写保护void v_Get1302(uchar ucCurtime) /从1302读出 秒 分 时 日 月 星期 年 uchar i;uchar ucAddr = 0x81;for(i=0;i7;i+) ucCurtimei = R1302(ucAddr); /格式为: 秒 分 时 日 月 星期 年 ucAddr += 2;

10、/* 标题:LCD操作 * 日期:2008年1月12日 * 说明:KS0108系列液晶不带字库 */#include #define E RA0 /液晶使能端#define RW RA1 /读写控制端#define DI RA2 /数据/指令通道#define CSA RA5 /片选#define CSB RA3 /片选#define nop() asm(nop)void delay(char x,char y) /延时 char z; do z=y; do;while(-z); while(-x); /其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页

11、面设定、传递参数花掉的7 个指令。则是:14+(3*(Y-1)+7)*(X-1)。void CheckState() /状态检查 unsigned int dat; RW=1; /读状态 DI=0; TRISB=0xff; /设置口为输入 while(1) E=1; /高电平读数据 dat=PORTB&0x90; /当4、7位为0时为正常状态 E=0; if(dat=0x00)break; TRISB=0x00; /恢复口为输出void WriteData(unsigned char dat) /写显示数据 CheckState(); DI=1; /写数据 RW=0; PORTB=dat; E

12、=1; E=0;/command:操作LCD的指令 /写指令void WriteCommand(unsigned char dat) CheckState(); RW=0; /写指令 PORTB=dat; E=1; E=0;void SetLine(unsigned char line) /设定页地址-X:0-7 line=line&0x07; /0=line=7 line=line|0xb8; WriteCommand(line);void SetColumn(unsigned char column) /设定列地址-Y:0-63 column=column&0x3f; /0=column=

13、63 column=column|0x40; WriteCommand(column);void SetStartLine(unsigned char startline) /设定开始行 startline=startline&0x3f; /0=startline=63 startline=startline|0xc0; WriteCommand(startline);void SetOnOff(unsigned char state) /开关显示1:开0:关 state=state|0x3e; WriteCommand(state);void SlectScreen(unsigned cha

14、r screen) /选择屏幕/screen: 1:左屏 2:右屏 switch(screen) case 1: CSA=0; CSB=1;/左屏 break; case 2: CSA=1; CSB=0;/右屏 break; void ClearScreen(unsigned char screen) /清屏/screen: 1:左屏 2:右屏 unsigned char i,j; SlectScreen(screen); for(i=0;i8;i+) SetLine(i); for(j=0;j64;j+) WriteData(0x00); WriteData(0x00); /显示一个16X1

15、6的汉字void Show16X16(unsigned char line,unsigned char column,const unsigned char *pt,uch mode) unsigned char i,column_temp; uch wei_1,wei_2; if(mode=0)wei_1=0x00;wei_2=0x00; if(mode=1)wei_1=0x01;wei_2=0x00; if(mode=2)wei_1=0x00;wei_2=0x80; column_temp=column; SlectScreen(1); /选通左屏 SetColumn(column); /

16、设置起始列 SetLine(line); /设置行 for(i=0;i=64) /如果列=64,则选通右屏 SlectScreen(2); column=column%64; /设置右屏起始列 SetColumn(column); SetLine(line); WriteData(*pt|wei_1); /写数据 *pt+;/ column+; SlectScreen(1); SetLine(line+1); /设置汉字下半部分显示页 column=column_temp; SetColumn(column); for(i=0;i=64) SlectScreen(2); column=colu

17、mn%64; SetColumn(column); SetLine(line+1); WriteData(*pt|wei_2); *pt+; column+; /显示一个8X16的字符void Show8X16(unsigned char line,unsigned char column,const unsigned char *pt,uch mode) unsigned char i,column_temp; uch wei_1,wei_2; if(mode=0)wei_1=0x00;wei_2=0x00; if(mode=1)wei_1=0x01;wei_2=0x00; if(mode=

18、2)wei_1=0x00;wei_2=0x80; column_temp=column; SlectScreen(1); /选通左屏 SetColumn(column); /设置起始列 SetLine(line); /设置行 for(i=0;i=64) /如果列=64,则选通右屏 SlectScreen(2); column=column%64; /设置右屏起始列 SetColumn(column); SetLine(line); WriteData(*pt|wei_1); /写数据 *pt+; column+; SlectScreen(1); SetLine(line+1); /设置汉字下半

19、部分显示页 column=column_temp; SetColumn(column); for(i=0;i=64) SlectScreen(2); column=column%64; SetColumn(column); SetLine(line+1); WriteData(*pt|wei_2); *pt+; column+; /显示一个16X32的字符void Show16X32(unsigned char line,unsigned char column,const unsigned char *pt) Unsigned char i,column_temp1, column_temp

20、2, column_temp3; column_temp1=column; column_temp2=column; column_temp3=column; SlectScreen(1); /选通左屏 SetColumn(column); /设置起始列 SetLine(line); /设置行 for(i=0;i=64) /如果列=64,则选通右屏 SlectScreen(2); column=column%64; /设置右屏起始列 SetColumn(column); SetLine(line); WriteData(*pt); /写数据 *pt+; column+; SlectScreen

21、(1); SetLine(line+1); column=column_temp1; SetColumn(column); for(i=0;i=64) SlectScreen(2); column=column%64; SetColumn(column); SetLine(line+1); WriteData(*pt); *pt+; column+; SlectScreen(1); SetLine(line+2); column=column_temp2; SetColumn(column); for(i=0;i=64) SlectScreen(2); column=column%64; Se

22、tColumn(column); SetLine(line+2); WriteData(*pt); *pt+; column+; SlectScreen(1); SetLine(line+3); column=column_temp3; SetColumn(column); for(i=0;i=64) SlectScreen(2); column=column%64; SetColumn(column); SetLine(line+3); WriteData(*pt); *pt+; column+; void LCDinit() /LCD初始化子程序 ADCON1=0x06; TRISA=0x

23、00; TRISB=0x00; PORTB=0x00; SetOnOff(1);/调用LCD显示子程序void ChangeToLCD(uch line,uch column,uch data,uch mode) int D_ge,D_shi; D_ge=data%10; /取个位 D_shi=data%100/10; /取十位 switch(D_ge) case 0:Show8X16(line,column+8,s0,mode);break; case 1:Show8X16(line,column+8,s1,mode);break; case 2:Show8X16(line,column+8,s2,mode);break; case 3:Show8X16(line,column+8,s3,mode);break; case 4:Show8X16(line,column+8,s4,mode);break; case 5:Show8X16(line,column+8,s5,mode);break; case 6:Show8X16(line,column+8,s6,mode);break; c

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

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