找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4109|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机,lcd12864显示温度,时间程序

[复制链接]
跳转到指定楼层
楼主
ID:140056 发表于 2016-9-21 17:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
#define MAIN_Fosc  11059200UL
sbit lcdpsb=P1^4;
sbit lcdrs=P1^5;
sbit lcdrw=P1^6;
sbit lcden=P1^7;
sbit dsrw=P1^0;
sbit dsds=P1^1;
sbit dscs=P1^2;
sbit dsas=P1^3;
sbit dsirq=P3^3;
sbit ds=P3^7;
uchar code dis0[]={"温度"};
uchar code dis1[]={"日期20  --  --  "};
uchar code dis2[]={"时间  :   :   "};
uchar code dis3[]={"0123456789"};
char year,month,day,shi,fen,miao;
void delay_ms(uint ms)
{
     uint i;
  do
  {
       i = MAIN_Fosc / 96000;
    while(--i);
     }
  while(--ms);
}
void delay_us(uchar us)
{
while(us--);
}
bit ds_init()//单总线初始化时序
{
bit i;
ds=1;
_nop_();
ds=0;
delay_us(75);
ds=1;
delay_us(4);
i=ds;
delay_us(20);
ds=1;
_nop_();
return (i);
}
void write_byte(uchar dat)//DS18B20写时序
{
uchar i;
for(i=0;i<8;i++)
{
  ds= 0;
  _nop_();
  ds= dat & 0x01;
  delay_us(10);//76.95us
  ds= 1;
  _nop_();
  dat>>=1;
}
}
uchar read_byte()//DS18B20读时序
{
uchar i, j, dat;
for(i=0;i<8;i++)
{
  ds= 0;
  _nop_();//产生读时序
  ds= 1;
  _nop_();//释放总线
  j=ds;
  delay_us(10);//76.95us
  ds=1;
  _nop_();
  dat=(j<<7)|(dat>>1);
}
return (dat);
}
void delay(int ms)//延时
{
    while(ms--)
{
      uchar i;
   for(i=0;i<250;i++)  
    {
     _nop_();      
  _nop_();
  _nop_();
  _nop_();
    }
}
}
bit lcd_busy()//检查LCD忙状态
{                          
    bit result;
lcdrs = 0;
    lcdrw= 1;
    lcden = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    lcden = 0;
    return(result);
}
void write_lcdcom(uchar com)//写LCD指令
{

while(lcd_busy());
lcdrs=0;
lcdrw=0;
lcden=0;
_nop_();
_nop_();
P0=com;
    delayNOP();
    lcden=1;
    delayNOP();
    lcden= 0;
}
void write_lcddat(uchar dat)//写LCD显示
{
while(lcd_busy());
lcdrs=1;
lcdrw=0;
lcden=0;
P0=dat;
    delayNOP();
    lcden=1;
    delayNOP();
    lcden=0;
}
void write_lcdpos(uchar x,uchar y)//设定LCD显示位置,x为行,y为列
{
uchar pos;
if(x==0)
  x=0x80;
else if(x==1)
  x=0x90;
else if(x==2)
  x=0x88;
else if(x==3)
  x=0x98;
pos=x+y;
write_lcdcom(pos);
}
void write_sfm(uchar add,char dat)//2为时,4为分,6为秒
{
char shi,ge;
shi=dat/10;
ge=dat%10;
write_lcdpos(1,add);
write_lcddat(dis3[shi]);
write_lcddat(dis3[ge]);
}
void write_nyr(uchar add,char dat)//3为年,5为月,7为日
{
char shi,ge;
shi=dat/10;
ge=dat%10;
write_lcdpos(0,add);
write_lcddat(dis3[shi]);
write_lcddat(dis3[ge]);
}
void write_ds(uchar add,uchar dat)//写DS12C887函数
{
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P2=add;
dsas=0;
dsrw=0;
P2=dat;
dsrw=1;
dsas=1;
dscs=1;
}
uchar read_ds(uchar add) //读DS12C887数据
{
uchar ds_date;
dsas=1;
dsds=1;
dsrw=1;
dscs=0;
P2=add;
dsas=0;
dsds=0;
P2=0xff;
ds_date=P2;
dsds=1;
dsas=1;
dscs=1;
return ds_date;
}
void set_time() //初始化DS12C887数据
{
write_ds(0,0);
write_ds(1,0);
write_ds(2,0);
write_ds(3,0);
write_ds(4,0);
write_ds(5,0);
write_ds(6,0);
write_ds(7,0);
write_ds(8,0);
write_ds(9,0);
}
void lcd_init()//LCD和DS12C887初始化
{
uchar i;
lcdpsb=1;
write_lcdcom(0x34);
delay(5);
write_lcdcom(0x30);
delay(5);
write_lcdcom(0x0c);
delay(5);
write_lcdcom(0x01);
delay(5);
i=0;
write_lcdpos(2,0);
for(;dis0[i]!='\0';i++)
  write_lcddat(dis0[i]);
i=0;
write_lcdpos(0,0);
for(;dis1[i]!='\0';i++)
  write_lcddat(dis1[i]);
i=0;
write_lcdpos(1,0);
for(;dis2[i]!='\0';i++)
  write_lcddat(dis2[i]);
}
void main()
{
uint i;
uchar L, M;
/* ds_init();//初始化DS18B20
write_byte(0xcc);//发送跳跃ROM指令
write_byte(0x4e);//写暂存器指令
write_byte(0x7f);
write_byte(0xf7);
write_byte(0x1f);//配置工作在9位模式下
ds_init();//初始化DS18B20
write_byte(0xcc);//发送跳跃ROM指令
write_byte(0x48);*/
delay(10);
lcd_init();
while(1)
{
  year=read_ds(9);
  month=read_ds(8);
  day=read_ds(7);
  shi=read_ds(4);
  fen=read_ds(2);
  miao=read_ds(0);
  write_nyr(3,year);
  write_nyr(5,month);
  write_nyr(7,day);
  write_sfm(2,shi);
  write_sfm(4,fen);
  write_sfm(6,miao);
  ds_init();//初始化DS18B20
  write_byte(0xcc);//发送跳跃ROM指令
  write_byte(0x44);//发送温度转换指令
  ds_init();//初始化DS18B20
  write_byte(0xcc);//发送跳跃ROM指令
  write_byte(0xbe);//读取DS18B20暂存器值
  L = read_byte();
  M = read_byte();
  i = M;
  i <<= 8;
  i |= L;      
  i = i * 0.0625 * 10 + 0.5;
  write_lcdpos(2,2);
  write_lcddat(dis3[i/100]);
  write_lcddat(dis3[i%100/10]);
  write_lcddat('.');
  write_lcddat(dis3[i%10]);
}
}

评分

参与人数 1黑币 +60 收起 理由
admin + 60 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:194435 发表于 2017-4-28 03:58 | 只看该作者
老哥,这个程序有完整的吗?解压包什么的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表