这个数码管显示温度程序,keil编写是有两个错误的。我找了好久都没找到不是是为什么

这个数码管显示温度程序,keil编写是有两个错误的。我找了好久都没找到不是是为什么,第1张

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

unsigned char code duan[]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

sbit ds=P3^7

uint temp          //定义整形的温度数据

//unsigned code[4]

void delay(uint x)   //延时函数

{ uint i

for(xx>0x--)

for(i=110i>0i--)

}

void dsinit()     //DS18B20复位,初始化函数

{

uint a

ds=0

a=103

while(a>0)

a--

ds=1

a=4

while(a>0)

a--

}

bit tempreadbit(void)  //读1位数据函数

{

uint i

bit dat

ds=0i++

ds=1i++i++

dat=ds

i=8

while(i>0)

i--

return(dat)

}

uchar dsread()         //读1个字节数据函数

{

uint n,m

uchar dat,bi

for(n=0n<8n++)

{

ds=0

m++

ds=1

m++m++

bi=ds

dat=(dat>>1)|(bi<<7)

m=4

while(m--)

}

return dat

}

void dswrite(uchar dat)   //向DS18B20写一个字节的数据函数

{

uint i

uchar j

bit bit1

for(j=0j<8j++)

{

bit1=dat&0x01

dat=dat>>1

if(bit1)

{

ds=0

i++i++

ds=1

i=8

while(i--)

}

else

{

ds=0

i=8while(i--)

ds=1

i++i++

}

}

}

void dskaishi()   //DS18B20开始获取温度并转换

{

dsinit()

delay(1)

dswrite(0xcc)

dswrite(0xbe)

}

uint get_temp()  //读取寄存器中存储的中拿温度数据

{

uchar a,b

dsinit()

delay(1)

dswrite(0xcc)  卖扮搭//跳过ROM

dswrite(0xbe)  //读暂存器

a=dsread()  //读低位    ,有两组数据

b=dsread()  //读高位

temp=b

temp<<=8

temp=temp|a  //两组数据归为一个字节

temp=temp*0.0625

return temp

}

void dsxianshi(uchar temp)

{

uchar bai,xiao,shi,ge

//     uchar tp

// disdata[0]=tvalue/1000     //百位数

//  disdata[1]=tvalue%1000/100 //十位数

//  disdata[2]=tvalue%100/10   //个位数

//  disdata[3]=tvalue%10       //小数位缺败

//

P2=0xf7

bai=temp/1000

P0=duan[bai]

delay(5)

P0=0x00

P2=0xfb

shi=temp%1000/100

P0=duan[shi]

delay(5)

P0=0x00

P2=0xfd

ge=temp%100/10

P0=duan[ge]

delay(5)

P0=0x00

P2=0xfd

P0=0x80

delay(5)

P0=0x00

P2=0xfe

xiao=temp%10

P0=duan[xiao]

delay(5)

P0=0x00

P2=0xfe

P0=0X39

delay(5)

P0=0x00

}

void main()

{

while(1)

{

dsxianshi(temp)

}

}

程序还要自己整合,毕竟自己编的才有成就差谨歼感,我给你提点思路,液晶显示程序和温度控制程序都看懂的虚冲情况下,你可以在定时中断中扫描温度,并判断是否达到阀值,设置一个Bit型的flag,然后在主程序中一直调用步进电子子程序,同样,步进电机中的正转反转由上面提到的flag进行判断。有什么晌兆问题继续追问就行

#include <reg52.h>

#include <math.h> //Keil library

#include <stdio.h> //Keil library

#include <INTRINS.H>

#define uchar unsigned char

#define uint unsigned int

#define display1 0xfe //数码管1从左至右

#define display2 0xfd //数码管2从左至右

#define display3 0xfb //数码管3从左至右

#define display4 0xf7 //数码管4从左至右

#define display5 0xef //数码管5从左至右

#define display6 0xdf //数码管6从左至右

#define display7 0xbf //数码管7从左至右

#define display8 0x7f //数码管8从左至右

sbit led=P1^5

sbit DQ=P3^6 //根据实实际情况设定

sbit setth=P1^0//设定 th

sbit up=P1^1/睁晌/加

sbit down=P3^2//减

sbit beep= P3^3

uchar tempint,f,bb,tempth,temptl,th,tl,beepflag //温度整数部分和小数部分

int tempdf,c

code unsigned char ledmap[]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,0xbf}

code unsigned char ledmap1[]={0x40,0x79,0x24,0x30,

0x19,0x12,0x02,0x78,0x00,0x10}

//7段卖辩数码管0~9数字的共阳显示代码和负号位代码(最后一位)

void set_ds18b20() //初始化DS18B20子程序

void get_temperature() //获得温度子程序

void read_ds18b20() //读DS18B20子程序

void write_ds18b20(uchar command) //向DS18B20写1字节子程序

void delayms(uchar count) //延时count毫秒子程序

void disp_temp(tempint,tempdf)//显示温度子程序

//***********************初始化DS18B20子中早缺程序**********************************

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

void set_ds18b20()

{

while(1)

{

uchar delay,flag

flag=0

DQ=1

delay=1

while(--delay)

DQ=0 //数据线置低电平

delay=250

while(--delay) //低电平保持500us

DQ=1 //数据线置高电平

delay=30

while(--delay) //高电平保持60us

while(DQ==0) //判断DS18B20是否发出低电平信号

{

delay=210 //DS18B20响应,延时420us

while(--delay)

if(DQ) //DS18B20发出高电平初始化成功,返回

{

flag=1 //DS18B20初始化成功标志

//初始化成功LED标志

break

}

}

if(flag) //初始化成功,再延时480us,时序要求

{

delay=240

while(--delay)

break

}

}

}

//***********************获得温度子程序***************************************

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

void get_temperature()//温度转换、获得温度子程序

{

set_ds18b20() //初始化DS18B20

write_ds18b20(0xcc) //发跳过ROM匹配命令

write_ds18b20(0x44) //发温度转换命令

// delayms(750)

disp_temp(tempint,tempdf) //显示温度,等待AD转换

set_ds18b20()

write_ds18b20(0xcc) //发跳过ROM匹配命令

write_ds18b20(0xbe) //发出读温度命令

read_ds18b20() //将读出的温度数据保存到tempint和tempdf处

}

//***********************读DS18B20子程序***************************************

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

void read_ds18b20()

{

uchar delay,i,j,k,temp,temph,templ

j=4 //读2位字节数据

do

{

for(i=8i>0i--) //一个字节分8位读取

{

temp>>=1//读取1位右移1位

DQ=0 //数据线置低电平

delay=1

while(--delay)

DQ=1 //数据线置高电平

delay=4

while(--delay) //延时8us

if(DQ) //读取1位数据

temp|=0x80

delay=25//读取1位数据后延时50us

while(--delay)

}

if(j==4)

templ=temp//读取的第一字节存templ

if(j==3)

temph=temp //读取的第二字节存temph

if(j==2)

tempth=temp //读取的第3字节存tempth TH的值

if(j==1)

temptl=temp //读取的第4字节存tempth TL的值

}while(--j)

f=0

if((temph &0xf8)!=0x00) //若温度为负的处理,对二进制补码的处理

{

f=1 //为负温度f置1

temph=~temph

templ=~templ

k=templ+1

templ=k

if(k>255)

{

temph++

}

}

tempdf=templ &0x0f //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf

c=(tempdf*625)

tempdf=c

templ>>=4 //

temph<<=4//转化成字节温度

tempint=temph|templ//两字节合并为一个字节

if (tempint>th|tempint==th|tempint<tl|tempint==tl)

beepflag=1

else

beepflag=0

}

//***********************写DS18B20子程序***************************************

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

void write_ds18b20(uchar command)

{

uchar delay,i

for(i=8i>0i--) //将一字节数据一位一位写入

{

DQ=0 //数据线置低电平

delay=6 //延时12us

while(--delay)

DQ=command&0x01 //将数据放置在数据线上

delay=25//延时50us

while(--delay)

command=command>>1 //准备发送下一位数据

DQ=1 //发送完一位数据,数据线置高电平

}

}

//***********************显示子程序***************************************

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

void disp_temp( tempint,tempdf)

{

uchar tempinth,tempintl,tempinbai,shifen,baifen,gefen,qianfen

if (bb==1)

{

tempinbai=th/100

tempinth=(th%100)/10

tempintl=th%10//整数取模

gefen=0/1000

shifen=0%1000/100

baifen =0%100/10

qianfen=0%10//小数取模

}

else if(bb==2)

{ tempinbai=tl/100

tempinth=(tl%100)/10

tempintl=tl%10//整数取模

gefen=0/1000

shifen=0%1000/100

baifen =0%100/10

qianfen=0%10//小数取模

}

else

{

tempinbai=tempint/100

tempinth=(tempint%100)/10

tempintl=tempint%10//整数取模

gefen=tempdf/1000

shifen=tempdf%1000/100

baifen =tempdf%100/10

qianfen=tempdf%10//小数取模

}

if (f==0)

{

P0=display1//符号位

P2=ledmap[0]

}

else

{

P0=display1//符号位

P2=ledmap[10]

}

delayms(2)

P0=display2

P2=ledmap[tempinbai] //开百位

delayms(2)

P0=display3

P2=ledmap[tempinth]//开十位

delayms(2)

P0=display4

P2=ledmap1[tempintl]//开个位

delayms(2)

P0=display5

P2=ledmap[gefen]//开个分位

delayms(2)

P0=display6

P2=ledmap[shifen] //开十分位

delayms(2)

P0=display7

P2=ledmap[baifen] //开百分位

delayms(2)

P0=display8

P2=ledmap[qianfen]//开千分位

}

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

//* 蜂鸣器响一声 */

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

void beep_st()

{

if (beepflag==1)

{ beep=0

delayms(1000)

beep=1

}

else

beep=1

}

//***********************延时count ms子程序***************************************

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

void delayms(uchar count) //延时count ms子程序

{

uchar i,j

do

{

for(i=5i>0i--)

for(j=98j>0j--)

}while(--count)

}

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

void keyscan() //键盘扫描

{

if(setth==0)

{

delayms(1)

}

if(setth==0)

{

bb++

while(!setth)//循环在此 非0=1

}

if(bb==1)

{

if(up==0)

{

delayms(1)

}

if(up==0)

{

disp_temp(th,tempdf)

if(th<125)

{th++}

while(!up)//非0=1

{

disp_temp(th,tempdf)

}

}

if(down==0)

{

delayms(1)

}

if(down==0)

{

disp_temp(th,tempdf)

if(th!=0) //不等于0为真执行

{

th--

while(!down) // down为(非0=1)循环执行

{

disp_temp(th,tempdf)

}

}

}

}

if(bb==2)

{

if(up==0)

{

delayms(1)

}

if(up==0)

{

disp_temp(tl,tempdf)

if(tl<125)

{tl++}

while(!up)//非0=1

{

disp_temp(th,tempdf)

}

}

if(down==0)

{

delayms(1)

}

if(down==0)

{

disp_temp(th,tempdf)

if(tl!=0) //不等于0为真执行

{

tl--

while(!down) // down为(非0=1)循环执行

{

disp_temp(tl,tempdf)

}

}

}

}

if(bb==3)

{bb=0

set_ds18b20() //初始化DS18B20

write_ds18b20(0xcc) //发跳过ROM匹配命令

write_ds18b20(0x4e) //发温度转换命令

write_ds18b20(th) //写TH 3

write_ds18b20(tl)

// write_ds18b20(0x7f)

set_ds18b20() //初始化DS18B20

write_ds18b20(0xcc) //发跳过ROM匹配命令

write_ds18b20(0x48)

}

}

void main()

{ set_ds18b20()

write_ds18b20(0xcc) //发跳过ROM匹配命令

write_ds18b20(0xbe) //发出读温度命令

read_ds18b20() //将读出的数据

th=tempth //将TH读到单片机

tl=temptl

SP=0x60//设置堆栈指针

bb=0

beepflag=0

while(1)

{

keyscan()

get_temperature() //获得温度

disp_temp(tempint,tempdf)//显示温度

beep_st()

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12413193.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存