问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求单片机ds1302+1602电子钟c语言编程。谢谢。

发布网友 发布时间:2022-05-07 21:28

我来回答

2个回答

热心网友 时间:2023-11-14 08:02

//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay­5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}

void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}

/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //“&” 是逻辑与“|” 是逻辑或if(dat & 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}

wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序

}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}

给你参考一下,这样才能提高哦追问程序运行不出来,有错误==|

热心网友 时间:2023-12-06 09:00

//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay­5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}

void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}

/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //“&” 是逻辑与“|” 是逻辑或if(dat & 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}

wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序

}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}

给你参考一下,这样才能提高哦追问程序运行不出来,有错误==|

热心网友 时间:2023-11-14 08:02

电子钟貌似没有,但类似的demo好像有

热心网友 时间:2023-12-06 09:00

电子钟貌似没有,但类似的demo好像有

热心网友 时间:2023-11-14 08:02

//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay­5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}

void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}

/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //“&” 是逻辑与“|” 是逻辑或if(dat & 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}

wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序

}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}

给你参考一下,这样才能提高哦追问程序运行不出来,有错误==|

热心网友 时间:2023-11-14 08:02

电子钟貌似没有,但类似的demo好像有

热心网友 时间:2023-11-14 08:02

//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay­5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}

void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}

/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //“&” 是逻辑与“|” 是逻辑或if(dat & 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}

wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序

}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}

给你参考一下,这样才能提高哦追问程序运行不出来,有错误==|

热心网友 时间:2023-11-14 08:02

电子钟貌似没有,但类似的demo好像有

热心网友 时间:2023-12-06 09:00

//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay­5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}

void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}

/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //“&” 是逻辑与“|” 是逻辑或if(dat & 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}

wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序

}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}

给你参考一下,这样才能提高哦追问程序运行不出来,有错误==|

热心网友 时间:2023-12-06 09:00

电子钟貌似没有,但类似的demo好像有

热心网友 时间:2023-11-14 08:02

//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay­5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}

void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}

/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //“&” 是逻辑与“|” 是逻辑或if(dat & 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}

wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序

}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}

给你参考一下,这样才能提高哦追问程序运行不出来,有错误==|

热心网友 时间:2023-11-14 08:02

//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay­5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}

void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}

/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //“&” 是逻辑与“|” 是逻辑或if(dat & 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}

wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序

}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}

给你参考一下,这样才能提高哦追问程序运行不出来,有错误==|

热心网友 时间:2023-11-14 08:02

电子钟貌似没有,但类似的demo好像有

热心网友 时间:2023-11-14 08:02

//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay­5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}

void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}

/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //“&” 是逻辑与“|” 是逻辑或if(dat & 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}

wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序

}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}

给你参考一下,这样才能提高哦追问程序运行不出来,有错误==|

热心网友 时间:2023-11-14 08:02

//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay­5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}

void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}

/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //“&” 是逻辑与“|” 是逻辑或if(dat & 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}

wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序

}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}

给你参考一下,这样才能提高哦追问程序运行不出来,有错误==|

热心网友 时间:2023-11-14 08:02

电子钟貌似没有,但类似的demo好像有

热心网友 时间:2023-11-14 08:02

电子钟貌似没有,但类似的demo好像有

热心网友 时间:2023-11-14 08:02

//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay­5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;

RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}

void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}

/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //“&” 是逻辑与“|” 是逻辑或if(dat & 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}

wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序

}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}

给你参考一下,这样才能提高哦追问程序运行不出来,有错误==|

热心网友 时间:2023-11-14 08:03

电子钟貌似没有,但类似的demo好像有

热心网友 时间:2023-11-14 08:02

电子钟貌似没有,但类似的demo好像有
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
急求高人解答 ···管理类的问题 ···!!!急急急···我会在线等... ...如果基层管理幅度为8,高层管理人员管理幅度为3,则该公司中层管理人员... ...发生化学变化的实质是( )A.分子间隔发生变化B.物质状态发生改变C... 下列变化不能说明发生了化学变化的是( )A.变化时有电子的得失或共用电... 下列描述正确的是( )A.固态物质的分子间无间隔B.液态物质的分子不断运动... 原来微信打开这个功能,能够看到马路上的街景,涨知识了! ...百度帐号被人在异地登录了,问题是没有任何人知道我的密码啊?而且也... 医疗事故纠纷和医疗损害纠纷的区别是什么 医疗纠纷与医疗事故的定义是什么? 医疗事故纠纷是指什么的 谁能简单的说一下 由AT89C52 DS12C887 DS18B20 1602 构成的电子钟的工作原理 1602电子钟的设计 考拉旗下的贷款产品是全都可以借还是只能借其中的某一个呢? 考拉是什么东西?怎么用? 考拉海购全额兑换款真实吗? 越南考拉香烟那有的卖 U盘win7 32位安装系统 VB.NET的几种延时方法 win7系统32位旗舰版怎样u盘安装 奶茶加盟店,除了加盟费,其他的还有什么费用? 加盟店除了加盟费还有什么其他费用??? 加盟和氏修脚堂除了加盟费还有其他费用吗? 加盟杨国福除了加盟费用还有什么费用啊?加盟后有保障吗? 加盟麻辣烫品牌除了加盟费外,为什么还要收取管理费? 轮胎在使用中应该注意什么?多久更换一次轮胎是正确的? 奶昔是什么东西,它的作用是什么 钳工实训周记,谁会写? 奶昔是什么东西做的 求硕士翻译学方向的论文开题报告范文 梦见大便虫 如何用ARDUINO UNO+1602+DS1302做电子时钟 哪位大神能给改下程序,用1602做个电子时钟,显示时分秒年月日的?感激不尽~ 为什么用1602A显示屏不会显示? 用1602调电子钟时为什么会显示出I4:I4:01 基于单片机的电子时钟里,用的1602的显示再接单片机P0口时还需要加上拉电阻吗?急!!!!!!!! 怎样给小餐厅取名 单片机1602只显示一排小方块 求教郭天祥单片机视频第10课用1602写数字钟程序 “你知道世界上最大的动物”用英语怎么说? 化妆品、护肤品使用都有讲究,水乳和隔离防晒霜的正确使用顺序是什么? 水乳霜龙血膏防晒霜气垫隔顺序离霜 水乳霜精华气垫隔离喷雾怎么用? 荣耀畅玩7X每次打开华为输入法都是默认的英文,有啥办法改成默认中文输入吧? 水,乳液,眼霜,防晒霜,隔离霜,顺序是什么呢? 水乳霜精华隔离防晒搅拌在一起能用吗 爽肤水,乳液,防晒霜,隔离霜涂抹的先后顺序 华为荣耀畅玩4c怎么切换默认的输入法 华为荣耀七手机怎么换那个输入法 她说累死了,怎么回复她 累死我了怎么回复女生