单片机温度显示文档格式.docx
《单片机温度显示文档格式.docx》由会员分享,可在线阅读,更多相关《单片机温度显示文档格式.docx(27页珍藏版)》请在冰点文库上搜索。
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)
DQ=0;
DQ=1;
delay(45);
//延时500us
presence=~DQ;
//拉高电平
/////****************DS18B20写命令函数************************///向1-WIRE总线上写1个字节
voidwrite_byte(ucharval){
uchari;
for(i=8;
i>
i--)
_nop_();
//从高拉倒低
//最低位移出//66us//右移1位
//5us
DQ=val&
0x01;
delay(6);
val=val/2;
delay
(1);
**************DS18B20
读1字节函数************************/
//从总线上取1个字节
ucharread_byte(void)
ucharvalue=0;
value>
>
=1;
//4us
if(DQ)
{value|=0x80;
delay(6);
//66us}
return(value);
//write_byte(SKIPROM_18b20_CM);
//发命令
//write_byte(CONVERTT_CM);
//发转换命令
//delay(200);
ow_reset();
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时不显示
display[2])
display[2]=0x0a;
//次高位为0时不显示
if(n)
//负温度时最高位显示"
display[3]=0x0b;
主函数**********************
//初始化端口
//开机显示"
0000"
//开机先转换一次//SkipROM//发转换命令//开机显示"
//处理温度数据
//显示温度值
main()
uinth;
Disdata=0xff;
discan=0xff;
for(h=0;
h<
h++)
{display[h]=0;
write_byte(CONVERTT_CM);
for(h=0;
100;
{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--);
**********************************************************
//************************************************************
/*voiddelay1ms()
unsignedchari;
for(i=124;
//延时124*8+10=1002us
}*/
Init_DS18B20(void)
unsignedcharx=0;
//DQ先置高
delay(8);
//稍延时
//发送复位脉冲
delay(80);
//延时(>
480us)
//拉高数据线
delay(5);
//等待(15~60us)
x=DQ;
//用X的值来判断初始化有没有成功,18B20存在的话X="
,否则X="
delay(20);
ReadOneChar(void)//主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
unsignedchari=0;
//每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsignedchardat=0;
for(i=8;
i--)//一个字节有8位
dat>
dat|=0x80;
delay(4);
return(dat);
WriteOneChar(unsignedchardat)
//数据线从高电平拉至低电平,产生写起始信号。
15us之内将所需写的位送到数据线上,
i--)//在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
//在开始另一个写周期前必须有1us以上的高电平恢复期。
DQ=dat&
0x01;
//读温度值(低位放tempL;
高位放tempH;
)
voidTempcor(void)
Init_DS18B20();
//初始化
WriteOneChar(0xcc);
//跳过读序列号的操作
WriteOneChar(0x44);
//启动温度转换
voidReadTemp(void)
WriteOneChar(0xbe);
//读温度寄存器(头两个值分别为温度的低位和高位)tempL=ReadOneChar();
//读出温度的低位LSBtempH=ReadOneChar();
//读出温度的高位MSB
tempL=~tempL+1;
tempH=~tempH;
//补码转换,取反加一
fg=0;
//读取温度为负时fg="
}}
/*ReadTemperature(void)
delay(200);
//转换需要一点时间,延时
if(tempH>
0x7f)//最高位为1时温度是负
//补码转换,取反加一
tempH=~tempH;
//主程序
/*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&
if(fg)
return(temp);
else
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
0C1H
清除显示RAM
LEDWR0
80H
设定的将要写入的显示RAM地址
ORG
0000H
LJMPSTART
0中断入口地址
START:
LJMPINT_0
001BH
T1
LJMPINT_T1
0040H
MOVSP,#60H
MOV
TMOD,#10H
J
置
SETBEX0
SETBIT0
SETBEA
INT0
中断有效
TL1,#00H
延
TH1,#4cH
R0,#2
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
时100ms常数
DECR2
EXIT:
POPACC
STATUS0:
;
南北红灯,东西红灯
MOVR2,#10;
延时1秒
RET
STATUS1:
南北绿灯,东西红灯
MOVP1,#96H;
南北绿灯,东西红
MOVR2,#200;
延时20秒
STATUS2:
南北绿灯闪转黄灯,东西红
MOVR3,#03H;
绿灯闪3次
FLASH:
MOVP1,#9FH
MOVR2,#03H
MOVP1,#96H
DJNZR3,FLASH
MOVP1,#06H;
南北黄灯,东西红
STATUS3:
南北红灯,东西绿灯
MOVP1,#69H
MOVR2,#200
LCALLDELAY
DISPLAY
STATUS4:
南北红灯,东西绿灯闪转黄灯
MOVR3,#03H
FLASH1:
MOVP1,#6FH
DJNZR3,FLASH1
MOVP1,#09H
南北红灯,东西黄
MOVR2,#10
NOP
INIT8279:
初
始化子程序
PUSH
DPH
保存现场
DPL
ACC
DPTR,#Z8279
延时
A,#LEDMOD
置8279工作方式
MOVX@DPTR,A
MOVA,#LEDFEQ;
置键盘扫描速率
MOVA,#LEDCLS;
清除LED显示
LCALLDELAY;
延时
POPACC;
恢复现场
POPDPL
POPDPH
显示字符子程序
;
输入:
R4,位置R5,值
DISLED:
PUSHDPH;
PUSHDPL
MOVA,#LEDWR0;
置显示起始地址
ADDA,R4;
加位置偏移量
MOVDPTR,#Z8279
MOVX@DPTR,A;
设定显示位置
MOVDPTR,#LEDSEG;
置显示常数表
起始位置
MOVA,R5
MOVCA,@A+DPTR;
查表
MOVDPTR,#D8279
显示数据
DELAY:
延时子程序
PUSH0;
PUSH1
MOV0,#0H
DELAY1:
MOV1,#0H
DJNZ1,$
DJNZ0,DELAY1
POP1;
POP0
DELAY_DISPLAY:
延时和显示时间子程
序
PUSH0
pushacc
loopwait:
movb,#10
mova,2
divab
movb,#10
movr4,#1
movr5,a
LCALLDISLED;
显示秒高位
movr4,#0
movr5,b
显示秒低位
jnzloopwait;
延时等待
popacc
POP1
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个字符数据(自定义显示内容)。
非常着急,希望给予有帮助的回复和主要的程序
问题补充:
主要程序是实验用,程序我都不会,希望可以按照我说的内容给点