单片机温度显示.docx
《单片机温度显示.docx》由会员分享,可在线阅读,更多相关《单片机温度显示.docx(27页珍藏版)》请在冰点文库上搜索。
单片机温度显示
要求用两位共阴数码管显示,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个字符数据(自定义显示内容)。
非常着急,希望给予有帮助的回复和主要的程序
问题补充:
主要程序是实验用,程序我都不会,希望可以按照我说的内容给点