欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
1602電子時鐘帶溫度顯示單片機源碼
[打印本頁]
作者:
sbyt
時間:
2016-12-5 14:51
標題:
1602電子時鐘帶溫度顯示單片機源碼
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delay(unsigned int x)//延時公用程序
{
unsigned char i;
while(x--)
{
for(i=0;i<125;i++);
}
}
/********************DS1302部分程序*************************/
sbit sclk=P3^1;
sbit rst=P3^0;
sbit io=P3^2; //DS1302三個管腳定義
unsigned char time[7]={16,2,12,5,14,28,00};//年周月日時分秒 有符號
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//DS1302寫時間寄存器地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//讀
void write_ds1302_byte(uchar dat) //DS1302寫字節(jié)函數(shù)
{
uchar i;
for(i=0;i<8;i++)
{
sclk=0; //下降沿數(shù)據(jù)有效
io=dat&0x01;
dat=dat>>1;
sclk=1;
}
}
void write_ds1302(uchar add,uchar dat)
{
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat); //發(fā)送地址后立即發(fā)送數(shù)據(jù),沒有停頓
rst=0;
_nop_();
sclk=1;
io=1;
}
uchar read_ds1302(uchar add)
{
uchar i,dat=0;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add); //發(fā)送地址后DS1302立即送出數(shù)據(jù)
for(i=0;i<8;i++)
{
dat=dat>>1;
sclk=0;
if(io)
dat=dat|0x80;
sclk=1;
}
rst=0;
_nop_();
sclk=0;
_nop_();
sclk=1;
io=1;
return dat;
}
void ds1302_init()
{
uchar i,j;
for(i=0;i<7;i++)
{
j=time[i]/10;
time[i]=time[i]%10;
time[i]=time[i]+j*16; //轉(zhuǎn)換為BCD碼
}
write_ds1302(0x8e,0x00);//去除寫保護
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time[i]);
}
write_ds1302(0x8e,0x80);//加寫保護
}
void ds1302_set_time(uchar add,uchar dat) //設置DS1302時間
{
uchar i;
i=dat/10;
dat%=10;
dat=dat+i*16; //轉(zhuǎn)換十進制為BCD碼
write_ds1302(0x8e,0x00);
write_ds1302(add,dat);
write_ds1302(0x8e,0x80);
}
void read_time() //讀時間
{
uchar i;
for(i=0;i<8;i++)
{
time[i]=read_ds1302(read_add[i]);
time[i]=time[i]/16*10+time[i]%16;//轉(zhuǎn)換BCD碼為十進制
}
}
/***********************DS18B20程序********************************/
sbit DQ=P3^6; //DS18B20數(shù)據(jù)端
unsigned int temperature=0;//溫度
unsigned char fuhao=0;//溫度的正負符號
void delay_18B20(unsigned int i)
{
while(i--);
}
/**********ds18b20初始化函數(shù)**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay_18B20(2); //稍做延時
DQ = 0; //單片機將DQ拉低
delay_18B20(60); //精確延時 大于 480us
DQ = 1; //拉高總線
delay_18B20(2);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay_18B20(15);
}
/***********ds18b20讀一個字節(jié)**************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat |=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20寫一個字節(jié)****************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(2);
DQ = 1;
dat>>=1;
}
}
void ReadTemperature(void)
{unsigned char readdata[2]={0,0};
fuhao=0;
temperature=0;
delay_18B20(40); // this message is very important
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換
delay_18B20(40); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
delay_18B20(40);
readdata[0]=ReadOneChar(); //讀取溫度值低位
readdata[1]=ReadOneChar(); //讀取溫度值高位
if (readdata[1]>127)
{readdata[0]^=0xff;//求補碼
readdata[1]^=0xff;
fuhao=1;//符號為“-”
}
temperature =readdata[1]*256+readdata[0] ;
temperature =temperature*0.625+0.5 ;//放大了10倍
}
/**********************LCD程序******************************/
#define LCD_DATA P1
sbit LCD_RS = P0^0;
sbit LCD_RW = P0^1;
sbit LCD_EN = P0^2;
unsigned char disbuff0[16]={'D',':',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',};//LCD第一行顯示日期
unsigned char disbuff1[16]={'T',':',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',};//LCD第二行顯示溫度
void Delay20ms() ;
void LCD_WriteDat(unsigned char lcd_dat);
void LCD_WriteCmd(unsigned char lcd_cmd);
unsigned char LCD_ReadStatus(void);
void LCD_Goto(unsigned char x,unsigned char y);
void LCD_Display(unsigned char row,unsigned char *str);
void Delay20ms() //粗略延時;
{
unsigned int tmp = 50000;
while(tmp--);
}
void LCD_Init(void)
{
Delay20ms();
/*************************************************
功能設置: DB5=1;DB6...=0;
DB4=1:8位接口; 0:4位接口;
DB3=1:雙行顯示;0:單行顯示;
DB3=1:5×10點陣;0:5×7點陣;
*************************************************/
LCD_WriteCmd(0x38); //8位機接口、雙行顯示、5×7字符點陣;
/*************************************************
顯示控制:DB3=1;DB4...=0;
DB2=1:開啟顯示;0:關閉LCD顯示;
DB1=1:顯示光標;0:光標隱藏;
DB0=1:光標閃爍;0:光標閃爍關閉;
*************************************************/
LCD_WriteCmd(0x0c); //顯示開啟、光標不顯示也不閃爍;
/*************************************************
清屏指令:DB0=1;DB1...=0;
*************************************************/
LCD_WriteCmd(0x01); //清屏;
/****************************************************************
訪問模式:DB2=1;DB3...=0;
DB1=1:對內(nèi)部Ram讀寫后AC自增,否則自減;
DB0=1:與DB1設置有關,對DD RAM寫時同時整屏移動1位;
*****************************************************************/
LCD_WriteCmd(0x06); //光標右移一位、整屏不移動;
LCD_Goto(0,0);
}
void LCD_WriteDat(unsigned char lcd_dat)
{
unsigned char tmp;
tmp = LCD_ReadStatus(); //讀狀態(tài);
while((tmp & 0x80)) //是否忙 ?
{
tmp = LCD_ReadStatus();
}
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = lcd_dat;
_nop_();
LCD_EN = 0;
_nop_();
_nop_();
LCD_EN = 1;
}
void LCD_WriteCmd(unsigned char lcd_cmd)
{
unsigned char tmp;
tmp = LCD_ReadStatus();
while((tmp & 0x80))
{
tmp = LCD_ReadStatus();
}
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = lcd_cmd;
_nop_();
LCD_EN = 0;
_nop_();
_nop_();
LCD_EN = 1;
}
unsigned char LCD_ReadStatus(void)
{
unsigned char tmp;
#if 0
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
tmp = LCD_DATA;
LCD_EN = 0;
#endif
LCD_DATA = 0xff;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 0;
_nop_();
_nop_();
LCD_EN = 1;
tmp = LCD_DATA;
return tmp;
}
void LCD_Goto(unsigned char x,unsigned char y)
{
unsigned char tmp;
if(y) //若是第二行;
{
tmp = 0xc0 + x;
LCD_WriteCmd(tmp);
}
else
{
tmp = 0x80 + x;
LCD_WriteCmd(tmp);
}
}
void LCD_Display(unsigned char row,unsigned char *str)
{
if(row)
{
LCD_Goto(0,1);
}
else
{
LCD_Goto(0,0);
}
while(*str != '\0')
{
LCD_WriteDat(*str++);
}
}
/*************************按鍵處理程序********************************/
uchar hour=0;uchar minute=0;uchar year=0;uchar month=0;uchar date=0;//時間設定
uchar alarm_hour=0;uchar alarm_minute=0;//鬧鐘設定時間
bit at_flag;//鬧鐘開關標志
void key()
{uchar key1=0;uchar key2=0;
key1=P0;key1=key1>>3;
delay(75);
key2=P0;key2=key2>>3;
if (key1==key2 && key1!=0x1f)
{switch (key1)
{case 0x1e://鬧鐘分設置鍵
{while(1)
{disbuff0[11]='_';disbuff0[12]='_';//顯示時
delay(75);LCD_Display(0,disbuff0);//LCD第一行顯示
disbuff0[11]=alarm_hour/10+'0';disbuff0[12]=alarm_hour%10+'0';//顯示時
delay(75);LCD_Display(0,disbuff0);//LCD第一行顯示
key1=0;key1=P0;key1=key1>>3;
if (key1==0x1b)//加
{if (alarm_hour<23)
{alarm_hour++;}
else
{alarm_hour=0;}
}
if (key1==0x17)//確定
{break;}
}
}
case 0x1d://鬧鐘分設置鍵
{while(1)
{disbuff0[14]='_';disbuff0[15]='_';//顯示時
delay(75);LCD_Display(0,disbuff0);//LCD第一行顯示
disbuff0[14]=alarm_minute/10+'0';disbuff0[15]=alarm_minute%10+'0';//顯示時
delay(75);LCD_Display(0,disbuff0);//LCD第一行顯示
key1=0;key1=P0;key1=key1>>3;
if (key1==0x1b)//加
{if (alarm_minute<59)
{alarm_minute++;}
else
{alarm_minute=0;}
}
if (key1==0x17)//確定
{break;}
}
}
case 0x0f://鬧鐘開關鍵
{at_flag=!at_flag;
}
default : break;
}
}
}
/****************蜂鳴器程序**********************/
sbit speaker=P3^7;
void timer0() interrupt 1 //這里輸出波形
{TH0=254;//頻率為1600hz時計時器初值
TL0=200;
speaker=!speaker;
}
/********************主程序********************/
void main()
{
ds1302_init();//初始化1302
LCD_Init();//初始化LCD
/*計時器0設置*/
TMOD=0x11;//定時器1、2工作于方式1
TH0=254;//頻率為1600hz時計時器初值
TL0=200;
ET0=1;
EA=0;//關閉總中斷
speaker=0;
//顯示welcome to BJTU
disbuff0[0]=' ';disbuff0[1]=' ';disbuff0[2]='W';disbuff0[3]='e';disbuff0[4]='l';disbuff0[5]='c';disbuff0[6]='o';disbuff0[7]='m';
disbuff0[8]='e';disbuff0[9]=' ';disbuff0[10]=' ';disbuff0[11]='t';disbuff0[12]='o';disbuff0[13]=' ';disbuff0[14]=' ';disbuff0[15]=' ';
disbuff1[0]=' ';disbuff1[1]=' ';disbuff1[6]='Y';disbuff1[7]='O';disbuff1[8]='N';disbuff1[9]='K';disbuff1[10]='0';
LCD_Display(0,disbuff0);//LCD第一行顯示
LCD_Display(1,disbuff1);//LCD第二行顯示
delay(5000);
disbuff0[0]='D';disbuff0[1]=':';disbuff0[2]=' ';disbuff0[3]=' ';disbuff0[4]=' ';disbuff0[5]=' ';disbuff0[6]=' ';disbuff0[7]=' ';
disbuff0[8]=' ';disbuff0[11]=' ';disbuff0[12]=' ';
disbuff1[0]='T';disbuff1[1]=':';disbuff1[7]=' ';disbuff1[8]=' ';disbuff1[9]=' ';disbuff1[10]=' ';
while(1)
{read_time();//獲取時間
year=time[0];//計算年
month=time[2];//計算月
date=time[3];//計算日
hour=time[4];//計算時
minute=time[5];//計算分
disbuff0[2]=year/10+'0';disbuff0[3]=year%10+'0';//顯示年
disbuff0[4]='-';disbuff0[5]= month/10+'0';disbuff0[6]= month%10+'0';//顯示月
disbuff0[7]='-';disbuff0[8]= date/10+'0';disbuff0[9]= date%10+'0';//顯示日
disbuff0[10]=' ';disbuff0[11]=hour/10+'0';disbuff0[12]=hour%10+'0';//顯示時
disbuff0[13]=':';disbuff0[14]=minute/10+'0';disbuff0[15]=minute%10+'0';//顯示分
ReadTemperature();//獲取溫度
if (fuhao)
{disbuff1[2]='-';}
else
{disbuff1[2]='+';}
disbuff1[3]=((temperature/1000)%10)+'0';disbuff1[4]=((temperature/100)%10)+'0';disbuff1[5]=((temperature/10)%10)+'0';
disbuff1[6]='.';disbuff1[7]=((temperature)%10)+'0';disbuff1[8]='C';
if (at_flag)//顯示鬧鐘開關
{disbuff1[10]='A';disbuff1[11]='_';disbuff1[12]='O';disbuff1[13]='N';disbuff1[14]=' ';}
else
{disbuff1[10]='A';disbuff1[11]='_';disbuff1[12]='O';disbuff1[13]='F';disbuff1[14]='F';}
key();//按鍵處理程序
if (alarm_minute==minute && alarm_hour==hour && at_flag)
{EA=1;TR0=1;}
else
{EA=0;TR0=0;speaker=0;}
LCD_Display(0,disbuff0);//LCD第一行顯示
LCD_Display(1,disbuff1);//LCD第二行顯示
}
}
復制代碼
作者:
13611554920
時間:
2018-8-21 21:47
我改了接口在學習板上做了 時間光標不閃 按鍵我看不懂接哪幾個管腳
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1