单片机温度显示_第1页
单片机温度显示_第2页
单片机温度显示_第3页
单片机温度显示_第4页
单片机温度显示_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、要求用两位共阴数码管显示, P0 口控制 abcdefg ,dp,P2.01 控制位选 感谢令求一位我可以问问题的大神,单片机方面的 /按照我的电路图我这是四位有负温度显示你可以看一下。有什么问题可以问 我?/*created: 2010/07/27created: 27:7:2010 10:27filename: D:Keil Debugds18b20.cfile path: D:Keil Debugfile base: ds18b20file ext: cauthor: Honguo ZHUpurpose:/DS18B20 的读写程序 ,数据脚 P2.7/温度传感器 18B20 汇编程序,

2、采用器件默认的 12 位转化/最大转化时间 750微秒,显示温度-55到+125 度,显示精度/为 0.1 度,显示采用 4 位 LED 共阳显示测温值/P0 口为段码输入 ,P34P37 为位选*/#include "reg51.h"#include "intrins.h"/_nop_(); 延时函数用#defineDisdata P0/段码输出口#definediscan P3/扫描口#defineuchar unsigned char#defineuint unsigned int#define READROM_18b20_CM0x33#defin

3、e MATCHROM_18b20_CM0x55#define SKIPROM_18b20_CM 0xCC#define SEARCHROM_18b20_CM 0xF0#define ALARMSEARCH_18b20_CM 0xEC#define CONVERTT_CM#define RSCRATCHPAD_CM#define WSCRATCHPAD_CM#define CSCRATCHPAD_CM#define RECALLE2_CM#define RPOWERSUNNLY_CMsbitDQ=P2A7;sbitDIN=P0A7;0x440xBE0x4E0x480xB80xB4/温度输入口/L

4、ED 小数点控制/* 温度小数部分用查表法uchar code ditab16= 0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08, 0x09,0x09;/ uchar code dis_712=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf;/共阳 LED 段码表"0" "1" "2" "3" "4" "5" &q

5、uot;6" "7" "8" "9" "不亮" "-"uchar code scan_con4=0x8f,0x4f,0x2f,0x1f;/列扫描控制字/ 显示单元数据,共 4uchar data temp_data2=0x00,0x00;/ 读出温度暂放uchar data display5=0x00,0x00,0x00,0x00,0x00;个数据和一个运算暂用/*11us延时函数 */void delay(uint t) for (;t>0;t-);/显示函数/4 位 LED

6、扫描控制/位选/数据显示/小数点显示scan() char k;for(k=0;k<4;k+)Disdata = 0xff; discan=scan_conk;Disdata=dis_7displayk; if (k=1) DIN=0;delay(300); / /*DS18B20 复位函数 */ ow_reset(void)char presence=1;while(presence)while(presence)DQ=1;_nop_();_nop_();/从高拉倒低DQ=0;delay(50);/550 usDQ=1;delay(6);/66 uspresence=DQ;/prese

7、nce=0 复位成功 ,继续下一步delay(45);/ 延时 500 uspresence=DQ;DQ=1;/拉高电平/ / /*DS18B20 写命令函数 */ /向 1-WIRE 总线上写 1 个字节void write_byte(uchar val) uchar i;for(i=8;i>0;i-)DQ=1;_nop_();_nop_();/从高拉倒低/最低位移出 /66 us / 右移 1 位DQ=0;_nop_();_nop_();_nop_();_nop_(); /5 usDQ=val&0x01; delay(6); val=val/2;DQ=1;delay(1);/

8、*DS18B20读 1 字节函数 */从总线上取 1 个字节uchar read_byte(void)uchar i;uchar value=0;for(i=8;i>0;i-)DQ=1;_nop_();_nop_();value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_();/4 usDQ=1;_nop_();_nop_();_nop_();_nop_();/4 usif(DQ)value|=0x80;delay(6); /66 us DQ=1;return(value);/读出温度函数uint read_temp()uint temp;/

9、 ow_reset();/总线复位/ write_byte(SKIPROM_18b20_CM);/发命令/ write_byte(CONVERTT_CM);/发转换命令/ delay(200);ow_reset();delay(1);write_byte(SKIPROM_18b20_CM);/发命令write_byte(RSCRATCHPAD_CM);temp_data0=read_byte();temp_data1=read_byte();temp=temp_data1;temp<<=8;temp=temp|temp_data0;/读温度值的第字节/读温度值的高字节/ 两字节合成

10、一个整型变量/return temp;/返回温度值温度数据处理函数/二进制高字节的低半字节和低字节的高半字节组成一字节,这个/字节的二进制转换为十进制后 ,就是温度值的百、十、个位值 ,而剩 /下的低字节的低半字节转化成十进制后 , 就是温度值的小数部分*work_temp(uint tem) uchar n=0;if(tem>6348)tem=65536-tem;/ 温度值正负判断n=1; / 负温度求补码 , 标志位置 1display4=tem&0x0f; display0=ditabdisplay4; display4=tem>>4; display3=dis

11、play4/100; display1=display4%100; display2=display1/10; display1=display1%10;/ 取小数部分的值/ 存入小数部分显示值/ 取中间八位 ,即整数部分的值/ 取百位数据暂存/ 取后两位数据暂存符号位显示判断/ 取十位数据暂存if(!display3)display3=0x0a;/最高位为 0 时不显示if(!display2)display2=0x0a;/次高位为 0 时不显示if(n)/ 负温度时最高位显示 "-"display3=0x0b;/主函数 */初始化端口/ 开机显示 "0000&

12、quot;/开机先转换一次 /Skip ROM /发转换命令 /开机显示 "0000"/处理温度数据/显示温度值main()uint h;Disdata=0xff;discan=0xff;for(h=0;h<4;h+)displayh=0;ow_reset();write_byte(SKIPROM_18b20_CM); write_byte(CONVERTT_CM); for(h=0;h<100;h+)scan();while(1)work_temp(read_temp();scan();/结束单片机温度采集系统的流程图总编程sbit DQ=P3A5; /数据传

13、输线接单片机的相应的引脚unsigned char tempL=O; / 设全局变量un sig ned char tempH=O;bit fg=1;温度正负标志延时子程序*/这个延时程序的具体延时时间是 time="i"*8+10,适用于小于2ms的延时*void delay (un sig ned char i)for(i;i>0;i-);*/延时子程序/*/*void delay1ms()unsigned char i;for(i=124;i>0;i-); /延时 124*8+10=1002us */初始化程序/延时子程序/延时子程序Init_DS18B2

14、0(void)unsigned char x=0;DQ=1; /DQ 先置高delay(8); / 稍延时DQ=0; /发送复位脉冲delay(80); / 延时( >480us)DQ=1; /拉高数据线delay(5); / 等待( 1560us)x=DQ; /用X的值来判断初始化有没有成功,18B20存在的话X="0",否则X="1" delay(20);读一个字节ReadOneChar(void) / 主机数据线先从高拉至低电平 1us 以上,再使数据线升 为高电平,从而产生读信号unsigned char i=0; / 每个读周期最短的持续

15、时间为 60us ,各个读周期之间必须 有 1us 以上的高电平恢复期unsigned char dat=0;for (i=8;i>0;i-) / 一个字节有 8 位DQ=1;delay(1);DQ=0;dat>>=1;DQ=1;if(DQ)dat|=0x80;delay(4);return(dat);写一个字节WriteOneChar(unsigned char dat)unsigned char i=0; / 数据线从高电平拉至低电平,产生写起始信号。 15us 之 内将所需写的位送到数据线上,for(i=8;i>0;i-) / 在 1560us 之间对数据线进行采

16、样, 如果是高电平就写 1,低 写 0 发生。DQ=0; /在开始另一个写周期前必须有 1us 以上的高电平恢复期。DQ=dat & 0x01;delay(5);DQ=1;dat>>=1;delay(4);/读温度值(低位放 tempL; 高位放 tempH; )void Tempcor(void)Init_DS18B20(); / 初始化WriteOneChar(0xcc); / 跳过读序列号的操作WriteOneChar(0x44); / 启动温度转换void ReadTemp(void)Init_DS18B20(); / 初始化WriteOneChar(0xcc);

17、/ 跳过读序列号的操作WriteOneChar(0xbe); / 读温度寄存器(头两个值分别为温度的低位和高位) tempL=ReadOneChar(); / 读出温度的低位 LSB tempH=ReadOneChar(); / 读出温度的高位 MSBif(tempH>0x7f)/最高位为 1 时温度是负tempL=tempL+1; tempH=tempH;/补码转换,取反加一fg=0;/读取温度为负时 fg="0 /*ReadTemperature(void)Init_DS18B20(); / 初始化WriteOneChar(0xcc); / 跳过读序列号的操作WriteOn

18、eChar(0x44); / 启动温度转换delay(200); / 转换需要一点时间,延时Init_DS18B20(); / 初始化WriteOneChar(0xcc); / 跳过读序列号的操作WriteOneChar(0xbe); / 读温度寄存器(头两个值分别为温度的低位和高位) tempL=ReadOneChar(); / 读出温度的低位 LSB tempH=ReadOneChar(); / 读出温度的高位 MSBif(tempH>0x7f)/最高位为 1 时温度是负tempL=tempL+1;/补码转换,取反加一tempH=tempH;fg=0;/读取温度为负时 fg=&quo

19、t;0" */ 主程序/*float Temperature()float tvalue;ReadTemperature();tvalue=tempL/16+tempH*16+(tempL & 0x0f)*0.0625; if(!fg) tvalue=-tvalue;fg=1;return(tvalue); */float Temperature()float temp;ReadTemp();temp=tempL/16+tempH*16+(tempL & 0x0f)*0.0625;if(fg)return(temp);elsefg=1;return(-temp);DS

20、18B20 温度采集,通过调用 Temperature() 函数可得到温度数据51 单片机怎样设按键切换数码管显示时间和日期? 在 51 单片机中 6 位共阳数码管显示中,怎样设置某一按键,按下第一次从时间 显示方式转为日期显示方式, 按第二次从日期显示方式转为星期显示方式, 按第 三次显示温度,按第四次返回显示日期?你要设置一个标志变量,如 flag ,在进入按键程序后, flag+; 然后加个控制判断语句if(flag>3)flag=0;这样,在显示模块中再加入开关语句;switch(flag)case 0:. 显示时间 .case 1:. 显示日期。 .case 2:. 显示温度。

21、基于单片机的带时间显示和紧急控制的交通灯的显示晶振频率为 11.0592MHZ; 用定时器 1 延时,外部中断 0 接紧急控制;R0为100MS延时常数,R2为状态延时常数;8279 控制数码管显示时间; 用 P1 口控制双色灯; 此程序写于 2007-7-6 ,作者:徐学军Z8279EQU0FF82H;8279 状态 / 命令口地址D8279EQU0FF80H;8279 数据口地址LEDMODEQU00H;左边输入 八位字符显示; 外部译码键扫描方式 , 双键互锁LEDFEQEQU33H扫描速率LEDCLSEQU0C1H清除显示 RAMLEDWR0EQU80H设定的将要写入的显示RAM地址O

22、RG0000HLJMP STARTORG0 中断入口地址START:LJMP INT_0ORG001BH;T1LJMP INT_T1ORG0040HMOV SP,#60HMOVTMOD,#10HJ置SETB EX0SETB IT0SETB EA;INT 0中断有效MOVTL1,#00HJ延MOVTH1,#4cHMOVR0,#2J延0003H;INT中断入口地址T1 为方式 1时50mS常数启动 T1时100mS常数SETB TR1SETB ET1 setb 设置定时器 1 的中断优先级高于外部中断pt1必须LCALL INIT8279初始化8279LCALL STATUS0 ;CIRCLE:L

23、CALL STATUS1 ;LCALL STATUS2 ;LCALL STATUS3 ;LCALL STATUS4 ;LJMP CIRCLEINT_0:PUSH PSW;PUSH 2PUSH 90Hclr ex0MOV P1,#0FH灯MOV R2,#100 ;LCALL DELAY_DISPLAYsetb ex0初始状态(都是红灯 )南北绿灯 ,东西红灯 南北绿灯闪转黄灯 , 东西红灯 南北红灯 ,东西绿灯 南北红灯 ,东西绿灯闪转黄灯保护现场南北, 东西都亮红延时 10 秒POP 90H ; 恢复现场POP 2POP PSWRETIINT_T1:PUSH ACCPUSH PSWCLR TR

24、1; 延MOV TL1,#00H时 50mS 常数MOV TH1,#4CH SETB TR1DJNZ R0,EXITMOV R0,#2J延时 100ms 常数DEC R2EXIT:POPPSWPOPACCRETISTATUS0:;南北红灯 ,东西红灯MOV P1,#0FHMOV R2,#10 ;延时 1 秒LCALL DELAY_DISPLAYRETSTATUS1: ;南北绿灯 ,东西红灯MOV P1,#96H ;南北绿灯 , 东西红灯MOV R2,#200 ;延时 20 秒LCALL DELAY_DISPLAYRETSTATUS2: ;南北绿灯闪转黄灯 , 东西红灯MOV R3,#03H ;

25、绿灯闪 3 次FLASH:MOV P1,#9FHMOV R2,#03HLCALL DELAY_DISPLAYMOV P1,#96HMOV R2,#03HLCALL DELAY_DISPLAYDJNZ R3,FLASHMOV P1,#06H ;南北黄灯 , 东西红灯MOV R2,#10 ;LCALL DELAY_DISPLAYRET延时 1 秒STATUS3:J南北红灯 ,东西绿灯MOV P1,#69HMOV R2,#200J延时 20 秒LCALL DELAYDISPLAYRETSTATUS4:J南北红灯 ,东西绿灯闪转黄灯MOV R3,#03HJ绿灯闪 3 次FLASH1:MOV P1,#6

26、FHMOV R2,#03HLCALL DELAYDISPLAYMOV P1,#69HMOV R2,#03HLCALL DELAYDISPLAYDJNZ R3,FLASH1MOV P1,#09HJ南北红灯 , 东西黄灯MOV R2,#10J延时 1 秒LCALL DELAYDISPLAYNOPRETINIT8279:;8279初始化子程序PUSHDPHJ保存现场PUSHDPLPUSHACCLCALL DELAYMOVJDPTR ,#Z8279延时MOVA,#LEDMODJ置 8279 工作方式MOVXDPTR,AMOVA,#LEDFEQ;置键盘扫描速率MOVXDPTR,AMOVA,#LEDCLS

27、;清除 LED 显示MOVXDPTR,ALCALL DELAY; 延时POP ACC ;恢复现场POPDPLPOPDPHRET;显示字符子程序;输入:R4,位置R5,值DISLED:PUSH DPH ;保存现场PUSHDPLPUSHACCMOVA,#LEDWR0;置显示起始地址ADDA,R4;加位置偏移量MOVDPTR,#Z8279MOVXDPTR,A;设定显示位置MOVDPTR,#LEDSEG ;置显示常数表起始位置MOVA,R5MOVCA,A+DPTR;查表MOVDPTR,#D8279MOVXDPTR,A;显示数据POP ACC ;恢复现场POPDPLPOPDPHRETDELAY:;延时子程序PUSH0;保存现场PUSH1MOV0,#0HDELAY1:MOV1,#0HDJNZ1,$DJNZ0,DELAY1POP1 ;恢复现场POP0RETDELAY_DISPLAY:;延时和显示时间子程序PUSH 1PUSH 0push accloopwait: mov b,#10mov a,2div abmov b,#10div abmovr4,#1movr5,aLCALL DISLED;显示秒高位movr4,#0movr5,bLCALL DISLED;显示秒低位mov a,2jnzloopwait;延时等待popaccPOP 0PO

温馨提示

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

评论

0/150

提交评论