单片机温度显示.docx

上传人:b****1 文档编号:479111 上传时间:2023-04-29 格式:DOCX 页数:27 大小:151.85KB
下载 相关 举报
单片机温度显示.docx_第1页
第1页 / 共27页
单片机温度显示.docx_第2页
第2页 / 共27页
单片机温度显示.docx_第3页
第3页 / 共27页
单片机温度显示.docx_第4页
第4页 / 共27页
单片机温度显示.docx_第5页
第5页 / 共27页
单片机温度显示.docx_第6页
第6页 / 共27页
单片机温度显示.docx_第7页
第7页 / 共27页
单片机温度显示.docx_第8页
第8页 / 共27页
单片机温度显示.docx_第9页
第9页 / 共27页
单片机温度显示.docx_第10页
第10页 / 共27页
单片机温度显示.docx_第11页
第11页 / 共27页
单片机温度显示.docx_第12页
第12页 / 共27页
单片机温度显示.docx_第13页
第13页 / 共27页
单片机温度显示.docx_第14页
第14页 / 共27页
单片机温度显示.docx_第15页
第15页 / 共27页
单片机温度显示.docx_第16页
第16页 / 共27页
单片机温度显示.docx_第17页
第17页 / 共27页
单片机温度显示.docx_第18页
第18页 / 共27页
单片机温度显示.docx_第19页
第19页 / 共27页
单片机温度显示.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机温度显示.docx

《单片机温度显示.docx》由会员分享,可在线阅读,更多相关《单片机温度显示.docx(27页珍藏版)》请在冰点文库上搜索。

单片机温度显示.docx

单片机温度显示

要求用两位共阴数码管显示,P0口控制abcdefg,dp,P2.01控制位选感谢~~~令求一位我可以问问题的大神,单片机方面的/按照我的电路图我这是四位有负温度显示你可以看一下。

有什么问题可以问我?

/********************************************************************

created:

2010/07/27

created:

27:

7:

201010:

27

filename:

D:

\KeilDebug\ds18b20.c

filepath:

D:

\KeilDebug

filebase:

ds18b20

fileext:

c

author:

HonguoZHU

purpose:

//DS18B20的读写程序,数据脚P2.7

//温度传感器18B20汇编程序,采用器件默认的12位转化

//最大转化时间750微秒,显示温度-55到+125度,显示精度

//为0.1度,显示采用4位LED共阳显示测温值

//P0口为段码输入,P34~P37为位选

**************************************************/

#include"reg51.h"

#include"intrins.h"

//_nop_();延时函数用

#define

DisdataP0

//段码输出口

#define

discanP3

//扫描口

#define

ucharunsignedchar

#define

uintunsignedint

#defineREADROM_18b20_CM

0x33

#defineMATCHROM_18b20_CM

0x55

#defineSKIPROM_18b20_CM0xCC

#defineSEARCHROM_18b20_CM0xF0

#defineALARMSEARCH_18b20_CM0xEC

 

//

//

//**************温度小数部分用查表法

ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

//ucharcodedis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};

//共阳LED段码表"0""1""2""3""4""5""6""7""8""9""

不亮""-"

ucharcodescan_con[4]={0x8f,0x4f,0x2f,0x1f};//列扫描控制字

//显示单元数据,共4

uchardatatemp_data[2]={0x00,0x00};//读出温度暂放

uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};

个数据和一个运算暂用

//

//

//

/*****************11us

延时函数*************************/

//

voiddelay(uintt){

for(;t>0;t--);

}

//

//4位LED扫描控制

//

//位选

//数据显示

//小数点显示

scan()

{chark;

for(k=0;k<4;k++)

{

Disdata=0xff;discan=scan_con[k];

Disdata=dis_7[display[k]];if(k==1)

{DIN=0;

}

delay(300);

}}////

/****************DS18B20复位函数************************/ow_reset(void)

charpresence=1;

while(presence)

while(presence)

DQ=0;

DQ=1;

 

delay(45);

//延时500us

presence=~DQ;

DQ=1;

//拉高电平

/////****************DS18B20写命令函数************************///向1-WIRE总线上写1个字节

voidwrite_byte(ucharval){

uchari;

for(i=8;i>0;i--)

{

DQ=1;_nop_();_nop_();

//从高拉倒低

//最低位移出//66us//右移1位

DQ=0;_nop_();_nop_();_nop_();_nop_();//5us

DQ=val&0x01;delay(6);val=val/2;

}

DQ=1;

delay

(1);

}

//

**************DS18B20

读1字节函数************************/

//从总线上取1个字节

ucharread_byte(void)

{

uchari;

ucharvalue=0;

for(i=8;i>0;i--)

{

DQ=1;_nop_();_nop_();

value>>=1;

DQ=0;_nop_();_nop_();_nop_();_nop_();//4us

DQ=1;_nop_();_nop_();_nop_();_nop_();//4us

if(DQ)

{value|=0x80;}

delay(6);//66us}

DQ=1;

return(value);

//

//

//write_byte(SKIPROM_18b20_CM);

//发命令

//write_byte(CONVERTT_CM);

//发转换命令

//delay(200);

ow_reset();

delay

(1);

write_byte(SKIPROM_18b20_CM);//发命令

//

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩//下的低字节的低半字节转化成十进制后,就是温度值的小数部分

*****************************************************

work_temp(uinttem){

ucharn=0;

if(tem>6348)

{

tem=65536-tem;

//温度值正负判断

n=1;

}//负温度求补码,标志位置1

//取小数部分的值

//存入小数部分显示值

//取中间八位,即整数部分的值

//取百位数据暂存

//取后两位数据暂存

//取十位数据暂存

if(!

display[3])

{

display[3]=0x0a;//最高位为0时不显示

if(!

display[2])

{

display[2]=0x0a;//次高位为0时不显示

}

}

if(n)

{

//负温度时最高位显示"-"

display[3]=0x0b;

}

//

//

主函数**********************

 

//初始化端口

//开机显示"0000"

//开机先转换一次//SkipROM//发转换命令//开机显示"0000"

//处理温度数据

//显示温度值

main()

{

uinth;

Disdata=0xff;

discan=0xff;

for(h=0;h<4;h++)

{display[h]=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();

}

}

//

结束

 

单片机温度采集系统的流程图总编程~~~

 

sbitDQ=P3A5;//数据传输线接单片机的相应的引脚

unsignedchartempL=O;//设全局变量

unsignedchartempH=O;

bitfg=1;〃温度正负标志

//这个延时程序的具体延时时间是time="i"*8+10,适用于小于2ms的延时

〃************************************************************

voiddelay(unsignedchari)

{

for(i;i>0;i--);

}

**********************************************************

//************************************************************

/*voiddelay1ms()

{

unsignedchari;

for(i=124;i>0;i--);//延时124*8+10=1002us

}*/

 

Init_DS18B20(void)

{

unsignedcharx=0;

DQ=1;//DQ先置高

delay(8);//稍延时

DQ=0;//发送复位脉冲

delay(80);//延时(>480us)

DQ=1;//拉高数据线

delay(5);//等待(15~60us)

x=DQ;//用X的值来判断初始化有没有成功,18B20存在的话X="0",否则X="1"delay(20);

}

ReadOneChar(void)//主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号

{

unsignedchari=0;//每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期

unsignedchardat=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(unsignedchardat)

{

unsignedchari=0;//数据线从高电平拉至低电平,产生写起始信号。

15us之内将所需写的位送到数据线上,

for(i=8;i>0;i--)//在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。

DQ=0;//在开始另一个写周期前必须有1us以上的高电平恢复期。

DQ=dat&0x01;

delay(5);

DQ=1;

dat>>=1;

}

delay(4);

}

//读温度值(低位放tempL;高位放tempH;)

voidTempcor(void)

{

Init_DS18B20();//初始化

WriteOneChar(0xcc);//跳过读序列号的操作

WriteOneChar(0x44);//启动温度转换

}

voidReadTemp(void)

{

Init_DS18B20();//初始化

WriteOneChar(0xcc);//跳过读序列号的操作

WriteOneChar(0xbe);//读温度寄存器(头两个值分别为温度的低位和高位)tempL=ReadOneChar();//读出温度的低位LSBtempH=ReadOneChar();//读出温度的高位MSB

tempL=~tempL+1;tempH=~tempH;

//补码转换,取反加一

fg=0;//读取温度为负时fg="0

}}

/*ReadTemperature(void)

{

Init_DS18B20();//初始化

WriteOneChar(0xcc);//跳过读序列号的操作

WriteOneChar(0x44);//启动温度转换

delay(200);//转换需要一点时间,延时

Init_DS18B20();//初始化

WriteOneChar(0xcc);//跳过读序列号的操作

WriteOneChar(0xbe);//读温度寄存器(头两个值分别为温度的低位和高位)tempL=ReadOneChar();//读出温度的低位LSBtempH=ReadOneChar();//读出温度的高位MSB

if(tempH>0x7f)//最高位为1时温度是负

{

tempL=~tempL+1;//补码转换,取反加一

tempH=~tempH;

fg=0;//读取温度为负时fg="0"

}

}*/

//主程序

/*floatTemperature()

floattvalue;

ReadTemperature();

tvalue=tempL/16+tempH*16+(tempL&0x0f)*0.0625;if(!

fg)tvalue=-tvalue;

fg=1;

return(tvalue);

}*/

floatTemperature()

{

floattemp;

ReadTemp();

temp=tempL/16+tempH*16+(tempL&0x0f)*0.0625;

if(fg)

{

return(temp);

}

else

{

fg=1;

return(-temp);

}

}

DS18B20温度采集,通过调用Temperature()函数可得到温度数据

51单片机怎样设按键切换数码管显示时间和日期?

在51单片机中6位共阳数码管显示中,怎样设置某一按键,按下第一次从时间显示方式转为日期显示方式,按第二次从日期显示方式转为星期显示方式,按第三次显示温度,按第四次返回显示日期?

你要设置一个标志变量,如flag,在进入按键程序后,flag++;然后加个控制判断语句

if(flag>3)

flag=0;

这样,在显示模块中再加入开关语句;

switch(flag)

{

case0:

...显示时间..

case1:

...显示日期。

.

case2:

...显示温度。

}

基于单片机的带时间显示和紧急控制的交通灯的显示

晶振频率为11.0592MHZ

;用定时器1延时,外部中断0接紧急控制

;R0为100MS延时常数,R2为状态延时常数

;8279控制数码管显示时间

;用P1口控制双色灯

;此程序写于2007-7-6,作者:

徐学军

Z8279EQU0FF82H

;8279状态/命令口地址

D8279EQU0FF80H

;8279数据口地址

LEDMODEQU00H;

左边输入八位字符显示

;外部译码键扫描方式,双键互锁

LEDFEQ

EQU

33H

扫描速率

LEDCLS

EQU

0C1H

清除显示RAM

LEDWR0

EQU

80H

设定的将要写入的显示RAM地址

ORG

0000H

LJMPSTART

ORG

0中断入口地址

START:

LJMPINT_0

ORG

001BH

;T1

LJMPINT_T1

ORG

0040H

MOVSP,#60H

MOV

TMOD,#10H

J

SETBEX0

SETBIT0

SETBEA

;INT0

中断有效

MOV

TL1,#00H

J

MOV

TH1,#4cH

MOV

R0,#2

J

0003H

;INT

中断入口地址

T1为方式1

时50mS常数

启动T1

时100mS常数

SETBTR1

SETBET1setb设置定时器1的中断优先级高于外部中断

pt1

必须

LCALLINIT8279

初始化

8279

 

 

LCALLSTATUS0;

CIRCLE:

LCALLSTATUS1;

LCALLSTATUS2;

LCALLSTATUS3;

LCALLSTATUS4;

LJMPCIRCLE

INT_0:

PUSHPSW;

PUSH2

PUSH90H

clrex0

MOVP1,#0FH

MOVR2,#100;

LCALLDELAY_DISPLAY

setbex0

初始状态(都是红灯)

南北绿灯,东西红灯南北绿灯闪转黄灯,东西红灯南北红灯,东西绿灯南北红灯,东西绿灯闪转黄灯

保护现场

南北,东西都亮红

延时10秒

POP90H;恢复现场

POP2

POPPSW

RETI

INT_T1:

PUSHACC

PUSHPSW

CLRTR1

;延

MOVTL1,#00H

时50mS常数

MOVTH1,#4CHSETBTR1

DJNZR0,EXIT

MOVR0,#2

J

时100ms常数

DECR2

EXIT:

POPPSW

POPACC

RETI

STATUS0:

;

南北红灯,东西红灯

MOVP1,#0FH

MOVR2,#10;

延时1秒

LCALLDELAY_DISPLAY

RET

STATUS1:

;

南北绿灯,东西红灯

MOVP1,#96H;

南北绿灯,东西红

MOVR2,#200;

延时20秒

LCALLDELAY_DISPLAY

RET

STATUS2:

;

南北绿灯闪转黄灯,东西红

MOVR3,#03H;

绿灯闪3次

FLASH:

MOVP1,#9FH

MOVR2,#03H

LCALLDELAY_DISPLAY

MOVP1,#96H

MOVR2,#03H

LCALLDELAY_DISPLAY

DJNZR3,FLASH

MOVP1,#06H;

南北黄灯,东西红

MOVR2,#10;

LCALLDELAY_DISPLAY

RET

延时1秒

STATUS3:

J

南北红灯,东西绿灯

MOVP1,#69H

MOVR2,#200

J

延时20秒

LCALLDELAY

DISPLAY

RET

STATUS4:

J

南北红灯,东西绿灯闪转黄灯

MOVR3,#03H

J

绿灯闪3次

FLASH1:

MOVP1,#6FH

MOVR2,#03H

LCALLDELAY

DISPLAY

MOVP1,#69H

MOVR2,#03H

LCALLDELAY

DISPLAY

DJNZR3,FLASH1

MOVP1,#09H

J

南北红灯,东西黄

MOVR2,#10

J

延时1秒

LCALLDELAY

DISPLAY

NOP

RET

INIT8279:

;8279

始化子程序

PUSH

DPH

J

保存现场

PUSH

DPL

PUSH

ACC

LCALLDELAY

MOV

J

DPTR,#Z8279

延时

MOV

A,#LEDMOD

J

置8279工作方式

MOVX@DPTR,A

MOVA,#LEDFEQ;

置键盘扫描速率

MOVX@DPTR,A

MOVA,#LEDCLS;

清除LED显示

MOVX@DPTR,A

LCALLDELAY;延时

POPACC;

恢复现场

POPDPL

POPDPH

RET

;显示字符子程序

;输入:

R4,位置R5,值

DISLED:

PUSHDPH;

保存现场

PUSHDPL

PUSHACC

MOVA,#LEDWR0;

置显示起始地址

ADDA,R4;

加位置偏移量

MOVDPTR,#Z8279

MOVX@DPTR,A;

设定显示位置

MOVDPTR,#LEDSEG;置显示常数表

起始位置

MOVA,R5

MOVCA,@A+DPTR;

查表

MOVDPTR,#D8279

MOVX@DPTR,A;

显示数据

POPACC;

恢复现场

POPDPL

POPDPH

RET

DELAY:

;延时子程序

PUSH0;

保存现场

PUSH1

MOV0,#0H

DELAY1:

MOV1,#0H

DJNZ1,$

DJNZ0,DELAY1

POP1;

恢复现场

POP0

RET

DELAY_DISPLAY:

;延时和显示时间子程

PUSH1

PUSH0

pushacc

loopwait:

movb,#10

mova,2

divab

movb,#10

divab

movr4,#1

movr5,a

LCALLDISLED;显示秒高位

movr4,#0

movr5,b

LCALLDISLED;显示秒低位

mova,2

jnzloopwait;

延时等待

popacc

POP0

POP1

RET

LEDSEG:

DB

3FH,06H,5BH,4FH,66H,6DH,7DH,07H;'0,1,2,3,4,5,6,7'

DB

7FH,6FH,77H,7CH,39H,5EH,79H,71H;'8,9,A,B,C,D,E,F'

END

单片机led显示程序C语言的

悬赏分:

20|解决时间:

2010-6-1916:

30|提问者:

askkai1989

利用P1口和P3口控制8个共阴极LED显示器显示8个字符数据(自定义显示内容)。

非常着急,希望给予有帮助的回复和主要的程序

问题补充:

主要程序是实验用,程序我都不会,希望可以按照我说的内容给点

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2