找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4651|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī),lcd12864顯示溫度,時(shí)間程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140056 發(fā)表于 2016-9-21 17:48 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#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[]={"時(shí)間  :   :   "};
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()//單總線初始化時(shí)序
{
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寫(xiě)時(shí)序
{
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讀時(shí)序
{
uchar i, j, dat;
for(i=0;i<8;i++)
{
  ds= 0;
  _nop_();//產(chǎn)生讀時(shí)序
  ds= 1;
  _nop_();//釋放總線
  j=ds;
  delay_us(10);//76.95us
  ds=1;
  _nop_();
  dat=(j<<7)|(dat>>1);
}
return (dat);
}
void delay(int ms)//延時(shí)
{
    while(ms--)
{
      uchar i;
   for(i=0;i<250;i++)  
    {
     _nop_();      
  _nop_();
  _nop_();
  _nop_();
    }
}
}
bit lcd_busy()//檢查L(zhǎng)CD忙狀態(tài)
{                          
    bit result;
lcdrs = 0;
    lcdrw= 1;
    lcden = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    lcden = 0;
    return(result);
}
void write_lcdcom(uchar com)//寫(xiě)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)//寫(xiě)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)//設(shè)定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為時(shí),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)//寫(xiě)DS12C887函數(shù)
{
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數(shù)據(jù)
{
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數(shù)據(jù)
{
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);//發(fā)送跳躍ROM指令
write_byte(0x4e);//寫(xiě)暫存器指令
write_byte(0x7f);
write_byte(0xf7);
write_byte(0x1f);//配置工作在9位模式下
ds_init();//初始化DS18B20
write_byte(0xcc);//發(fā)送跳躍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);//發(fā)送跳躍ROM指令
  write_byte(0x44);//發(fā)送溫度轉(zhuǎn)換指令
  ds_init();//初始化DS18B20
  write_byte(0xcc);//發(fā)送跳躍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]);
}
}

評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:194435 發(fā)表于 2017-4-28 03:58 | 只看該作者
老哥,這個(gè)程序有完整的嗎?解壓包什么的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表