久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
求大神看一下 自己做的萬年歷 最高溫度顯示為16
[打印本頁]
作者:
妖狼族
時間:
2017-12-13 00:36
標(biāo)題:
求大神看一下 自己做的萬年歷 最高溫度顯示為16
/**
程序功能:顯示年月日,時分秒,星期,溫度
*/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit RS=P2^5;//數(shù)據(jù)命令選擇端
sbit RW=P2^6;//讀寫選擇端
sbit E=P2^7;//控制使能端
sbit DQ=P1^0;
sbit RST=P2^4;//片選輸入信號端
sbit IO=P2^3;//串行時鐘輸入端
sbit CLK=P2^2;//串行數(shù)據(jù)輸入輸出端
uchar str1[16];
uchar str2[16];
uchar str3[16];
uchar second,minute,hour,day,month,year,week,yearH=20;
sbit select=P3^2;//選擇調(diào)整部分按鈕
sbit up=P3^1;//加按鈕
sbit down=P3^0;//減按鈕
void jisuan();
void jisuan1();
void display();
void gettemp();
//temp:臨時變量,用于保存要寫入ds1302的內(nèi)容
//count:調(diào)整部分計數(shù),1:年,2:月,3:日,
// 4:時,5:分,6:秒,7:星期,8:退出調(diào)整
//done:調(diào)整標(biāo)志,1:調(diào)整,0:不調(diào)整
//flag:時鐘停止標(biāo)志,1:走,0:停
//up_flag:加按鍵操作標(biāo)志;down_flag:減按鍵操作標(biāo)志
uchar temp=0x00,count=8,flag,done,up_flag,down_flag;
uchar t,flag_t;
void delay(uint x){//毫秒級的延時
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
//////////////////1602操作////////////////////////////
uint checkBusy(){//檢查忙標(biāo)志
uchar temp;
P0=0xff;//I/O口準(zhǔn)備
RS=0;//選擇指令寄存器
RW=1;//選擇讀模式
E=1;//使能LCD
_nop_();_nop_();_nop_();_nop_();//延時
temp=P0&0x80;//取忙標(biāo)志
E=0;//禁止LCD
if(temp!=0x00)return 1;//忙返回1
else return 0;//不忙返回0
}
void writeIR(uchar cmd){//寫指令
while(checkBusy());//檢查忙狀態(tài)
RS=0;//選擇指令模式
RW=0;//選擇寫模式
E=0;//禁止LCD
P0=cmd;//寫入命令字
_nop_();_nop_();_nop_();_nop_();//延時
E=1;//使能LCD
_nop_();_nop_();_nop_();_nop_();//延時
E=0;//禁止LCD
}
void writecom(uchar com)
{
checkBusy();
RS=0;
RW=0;
E=0;
P0=com;
delay(3);
E=1;
delay(3);
E=0;
}
void writeDDR(uchar dat){//寫數(shù)據(jù)
while(checkBusy());//檢查忙狀態(tài)
RS=1;//選擇數(shù)據(jù)模式
RW=0;//選擇寫模式
E=0;//禁止LCD
P0=dat;//寫入數(shù)據(jù)
_nop_();_nop_();_nop_();_nop_();//延時
E=1;//使能LCD
_nop_();_nop_();_nop_();_nop_();//延時
E=0;//禁止LCD
}
void showstr(uchar str[]){
uint i;
i=0;
while(str[i]!='\0'){
writeDDR(str[i]);//顯示字符
i++;
}
}
///////////////////顯示子函數(shù)//////////////////////
/*void display(){
jisuan();
writeIR(0x80);
showstr(str1);
writeIR(0xc0);
showstr(str2);
}*/
/////////////////DS1302操作//////////////////////////
//DS1302:寫入操作(寫一個字節(jié),上升沿操作)
void write_byte(uchar da){
uchar i,temp;
temp=da;//要寫的數(shù)據(jù)送入臨時變量temp
for(i=8;i>0;i--){//將一個字節(jié)的數(shù)據(jù)分8次,一位一位送數(shù)據(jù)線
IO=temp&0x01;//將臨時變量temp的最低位送入IO數(shù)據(jù)線
CLK=0; //時鐘信號拉低
CLK=1;//時鐘信號拉高
temp=temp>>1;//將下次要送的那位數(shù)據(jù)送到臨時變量temp最低位
}
CLK=0;//寫完一字節(jié)數(shù)據(jù)后,拉低時鐘信號
}
//DS1302:讀取操作(讀一個字節(jié),下降沿)
uchar read_byte()
{
uchar i,a;
a=0x00;//a清0,這步也可不做
for(i=0;i<8;i++){//一個字節(jié)的數(shù)據(jù)分8次讀,一位一位從數(shù)據(jù)線讀
a=a>>1;//空出臨時變量a的最高位
if(IO)a=a|0x80;//從數(shù)據(jù)線上讀位數(shù)據(jù)到臨時變量a的最高位
else a=a|0x00;
CLK=1; //時鐘信號拉高
CLK=0; //時鐘信號拉低
}
CLK=0;//讀完一字節(jié)數(shù)據(jù)后,拉低時鐘信號
return a;//將臨時變量a內(nèi)的值返回
}
//DS1302:寫入數(shù)據(jù)(先送地址,再寫數(shù)據(jù))
void write_1302(uchar addr,uchar da){
RST=0; //停止工作
CLK=0; //時鐘信號拉低
RST=1; //重新工作
write_byte(addr); //寫入地址
write_byte(da);//寫入數(shù)據(jù)(da是十六進(jìn)制數(shù)據(jù),BCD碼)
CLK=0;//時鐘信號拉低
RST=0;//停止工作
}
//DS1302:讀取數(shù)據(jù)(先送地址,再讀數(shù)據(jù)),讀出的數(shù)據(jù)是BCD碼
uchar read_1302(uchar addr)
{
uchar temp;
RST=0; //停止工作
CLK=0; //時鐘信號拉低
RST=1;//重新工作
write_byte(addr); //寫入地址
temp=read_byte();//讀取數(shù)據(jù)(16進(jìn)制,BCD碼)
CLK=0;//時鐘信號拉低
RST=0;//停止工作
return temp;
}
uchar toDEC(uchar da){
uchar temp,dat1,dat2;
temp=da;
dat1=temp/16; //提取BCD碼的十位和個位
dat2=temp%16;
temp=dat1*10+dat2; //轉(zhuǎn)換成10進(jìn)制數(shù)
return temp;
}
uchar toBCD(uchar da){
uchar temp;
temp=(da/10)<<4|(da%10);//轉(zhuǎn)換成BCD碼
return temp;
}
void setProtect(bit flag){
if(flag)
write_1302(0x8e,0x80);//打開寫保護(hù)
else
write_1302(0x8e,0x00);//關(guān)閉寫保護(hù)
}
//設(shè)置時間函數(shù)提供參數(shù):控制字,要寫入的10進(jìn)制數(shù)據(jù)
void setTime(uchar addr,uchar da){
setProtect(0);//關(guān)閉寫保護(hù)
write_1302(addr,toBCD(da));//寫入BCD碼到指定寄存器
}
void getTime(){//獲取時鐘芯片的時鐘數(shù)據(jù)
second=read_1302(0x81);//讀秒(BCD碼)
second=toDEC(second&0x7f);//BCD碼轉(zhuǎn)十進(jìn)制
minute=read_1302(0x83);//讀分(BCD碼)
minute=toDEC(minute);//BCD碼轉(zhuǎn)十進(jìn)制
hour=read_1302(0x85);//讀時(BCD碼)
hour=toDEC(hour);//BCD碼轉(zhuǎn)十進(jìn)制
day=read_1302(0x87);//讀日(BCD碼)]
day=toDEC(day);//BCD碼轉(zhuǎn)十進(jìn)制
month=read_1302(0x89);//讀月(BCD碼)
month=toDEC(month);//BCD碼轉(zhuǎn)十進(jìn)制
year=read_1302(0x8d);//讀年(BCD碼)
year=toDEC(year);//BCD碼轉(zhuǎn)十進(jìn)制
week=read_1302(0x8b);//讀星期(BCD碼)
week=toDEC(week);//BCD碼轉(zhuǎn)十進(jìn)制
}
void jisuan(){//計算子程序,計算時間各位的值
uint i;
i=week-1;
if(i==0)i=7;
str1[0]=yearH/10+'0';//提取年的千位
str1[1]=yearH%10+'0';//提取年的百位
str1[2]=year/10+'0';//提取年的十位
str1[3]=year%10+'0';//提取年的個位
str1[4]='-';
str1[5]=month/10+'0';//提取月的十位
str1[6]=month%10+'0';//提取月的個位
str1[7]='-';
str1[8]=day/10+'0';//提取日的十位
str1[9]=day%10+'0';//提取日的個位
str1[10]=' ';
str1[11]=' ';
str1[12]=i+'0';//星期
str2[0]=hour/10+'0';//提取小時的十位
str2[1]=hour%10+'0';//提取小時的個位
str2[2]=':';
str2[3]=minute/10+'0';//提取分鐘的十位
str2[4]=minute%10+'0';//提取分鐘的個位
str2[5]=':';
str2[6]=second/10+'0';//提取秒鐘的十位
str2[7]=second%10+'0';//提取秒鐘的個位
str2[8]=' ';
}
void initial(){//初始化函數(shù)
uchar second=read_1302(0x81);
if(second&0x80){//時鐘停止,則初始化
setTime(0x80,0);
setTime(0x82,20);
setTime(0x84,8);
setTime(0x86,1);
setTime(0x88,6);
setTime(0x8a,5);
setTime(0x8c,12);
}
}
//按鍵部分程序
void Upkey(){//加按鈕
up=1;
if(up==0){ //加按鍵按下
delay(10);
if(up==0){//加按鍵確實按下
switch(count){//根據(jù)選擇的模塊進(jìn)行調(diào)整
case 7://調(diào)整星期
temp=week+1;//秒數(shù)加1
if(week==7) temp=1;//越界處理
up_flag=1;//數(shù)據(jù)調(diào)整后更新標(biāo)志
break;
case 6://調(diào)整秒
temp=second+1;//秒數(shù)加1
if(second==59) temp=0;//越界處理
up_flag=1;//數(shù)據(jù)調(diào)整后更新標(biāo)志
break;
case 5://調(diào)整分
temp=minute+1;//分?jǐn)?shù)加1
if(minute==59) temp=0;//越界處理
up_flag=1;//數(shù)據(jù)調(diào)整后更新標(biāo)志
break;
case 4://調(diào)整時
temp=hour+1;//小時數(shù)加1
if(hour==23) temp=0;//越界處理
up_flag=1;//數(shù)據(jù)調(diào)整后更新標(biāo)志
break;
case 3://調(diào)整日
temp=day+1;//日數(shù)加1
if(day==31) temp=1;//越界處理
up_flag=1;//數(shù)據(jù)調(diào)整后更新標(biāo)志
break;
case 2://調(diào)整月
temp=month+1;//月數(shù)加1
if(month==12) temp=1;//越界處理
up_flag=1;//數(shù)據(jù)調(diào)整后更新標(biāo)志
break;
case 1://調(diào)整年
temp=year+1;//年數(shù)加1
if(year==99){ temp=0;yearH=yearH+1;}//越界處理
up_flag=1;//數(shù)據(jù)調(diào)整后更新標(biāo)志
break;
default:break;
}
while(up==0)display();
}
}
}
void Downkey(){//減按鈕
down=1;
if(down==0){
delay(10);
if(down==0){
switch(count){
case 7://調(diào)整星期
temp=week-1;
if(week==0) temp=7;
down_flag=1;
break;
case 6://調(diào)整秒
temp=second-1;
if(second==0) temp=59;
down_flag=1;
break;
case 5://調(diào)整分
temp=minute-1;
if(minute==0) temp=59;
down_flag=1;
break;
case 4://調(diào)整時
temp=hour-1;
if(hour==0) temp=23;
down_flag=1;
break;
case 3://調(diào)整日
temp=day-1;
if(day==1) temp=31;
down_flag=1;
break;
case 2://調(diào)整月
temp=month-1;
if(month==1) temp=12;
down_flag=1;
break;
case 1://調(diào)整年
temp=year-1;
if(year==0){ temp=99;yearH=yearH-1;}
down_flag=1;
break;
default:break;
}
while(down==0)display();
}
}
}
void Selkey(){//調(diào)整部分選擇按鍵
select=1;
if(select==0){
delay(10);
if(select==0){
count=count+1;
if(count==9) count=1;//調(diào)整部分計數(shù)加1
done=1;//進(jìn)入調(diào)整模式
}
}
while(select==0)display();
}
void keydone(){//按鍵功能執(zhí)行
if(flag==0){//關(guān)閉時鐘,停止計時
setProtect(0);//寫入允許
temp=read_1302(0x81);
write_1302(0x80,temp|0x80);
setProtect(1);//禁止寫入
flag=1;
}
Selkey();//掃描調(diào)整部分選擇按鍵
switch(count){
case 1:do{
Upkey();//掃描加按鈕
Downkey();//掃描減按鈕
if(up_flag==1||down_flag==1){//數(shù)據(jù)更新,重新寫入新的數(shù)據(jù)
setProtect(0);//寫入允許
write_1302(0x8c,toBCD(temp));//寫入新的年數(shù)
setProtect(1);//禁止寫入
up_flag=0;
down_flag=0;
}
getTime();
display();
}while(count==2);
break;
case 2:do{
Upkey();//掃描加按鈕
Downkey();//掃描減按鈕
if(up_flag==1||down_flag==1){//數(shù)據(jù)更新,重新寫入新的數(shù)據(jù)
setProtect(0);//寫入允許
write_1302(0x88,toBCD(temp));//寫入新的月數(shù)
setProtect(1);//禁止寫入
up_flag=0;
down_flag=0;
}
getTime();
display();
}while(count==3);
break;
case 3:do{
Upkey();//掃描加按鈕
Downkey();//掃描減按鈕
if(up_flag==1||down_flag==1){//數(shù)據(jù)更新,重新寫入新的數(shù)據(jù)
setProtect(0);//寫入允許
write_1302(0x86,toBCD(temp));//寫入新的日數(shù)
setProtect(1);//禁止寫入
up_flag=0;
down_flag=0;
}
getTime();
display();
}while(count==4);
break;
case 4:do{//調(diào)整時
Upkey();//掃描加按鈕
Downkey();//掃描減按鈕
if(up_flag==1||down_flag==1){//數(shù)據(jù)更新,重新寫入新的數(shù)據(jù)
setProtect(0);//寫入允許
write_1302(0x84,toBCD(temp));//寫入新的小時數(shù)
setProtect(1);//禁止寫入
up_flag=0;
down_flag=0;
}
getTime();
display();
}while(count==5);
break;
case 5:do{//調(diào)整分
Upkey();//掃描加按鈕
Downkey();//掃描減按鈕
if(up_flag==1||down_flag==1){//數(shù)據(jù)更新,重新寫入新的數(shù)據(jù)
setProtect(0);//寫入允許
write_1302(0x82,toBCD(temp));//寫入新的分?jǐn)?shù)
setProtect(1);//禁止寫入
up_flag=0;
down_flag=0;
}
getTime();
display();
}while(count==6);
break;
case 6:do{//調(diào)整秒
Upkey();//掃描加按鈕
Downkey();//掃描減按鈕
if(up_flag==1||down_flag==1){//數(shù)據(jù)更新,重新寫入新的數(shù)據(jù)
setProtect(0);//寫入允許
write_1302(0x80,toBCD(temp)|0x80);//寫入新的秒數(shù)
setProtect(1);//禁止寫入
up_flag=0;
down_flag=0;
}
getTime();
display();
}while(count==7);
break;
case 7:do{//調(diào)整星期
Upkey();//掃描加按鈕
Downkey();//掃描減按鈕
if(up_flag==1||down_flag==1){//數(shù)據(jù)更新,重新寫入新的數(shù)據(jù)
setProtect(0);//寫入允許
write_1302(0x8a,toBCD(temp));//寫入新的星期數(shù)
setProtect(1);//禁止寫入
up_flag=0;
down_flag=0;
}
getTime();
display();
}while(count==8);
break;
case 8:do{
count=0;
second=read_1302(0x81);
setProtect(0);//寫入允許
write_1302(0x80,second&0x7f);
setProtect(1);//禁止寫入
done=0;
display();
}while(count==9);
break;
default:break;
}
}
////////////////////主函數(shù)////////////////////////
/*void main(){
//1602初始化工作
writeIR(0x01);//清屏,同時光標(biāo)移到左上角
writeIR(0x38);//功能設(shè)置:8位接口,2行,5*7字符
writeIR(0x0c);//控制字符、光標(biāo)及閃爍:顯示器開,光標(biāo)關(guān),光標(biāo)不閃爍
writeIR(0x06);//輸入方式設(shè)置指令:光標(biāo)不動,字符自動右移一格
//writeIR(0x80);//送DDRAM地址設(shè)置指令80H,從第1行第1列開始顯示
//DS1302初始化工作
flag=1;
initial();
up_flag=0;
down_flag=0;
done=0;
while(1){
while(done==1)keydone();
while(done==0){
getTime();
display();
flag=0;
Selkey();
}
}
}*/
/////////////////////////////////////////////////////////////////
void display(){
jisuan();
writeIR(0x80);
showstr(str1);
writeIR(0xc0);
showstr(str2);
writecom(0x80);
showstr(str1);
writecom(0xc0);
showstr(str2);
jisuan1();
writecom(0x00);
showstr(str3);
}
void jisuan1(){//計算子程序,計算時間各位的值
//uint i;
if(flag_t)str3[0]='-';
else str3[0]='+';
str3[1]=t%1000/100+'0';
str3[2]=t%100/10+'0';
str3[3]='.';
str3[4]=t%10+'0';
str3[5]=223;
str3[6]='C';
}
///////////////////DS18B20操作//////////////////////
//延時us級
void delay_us(uchar us){
while(us--);
}
//初始化DS18B20
bit reset(){
bit flag;//初始化標(biāo)志位
DQ=1;//dq復(fù)位,也可以不要
delay_us(1);//稍做延時
DQ=0;//單片機(jī)將dq拉低
delay_us(80);//精確延時大于480us
DQ=1;//拉高總線
delay_us(8);//延時
flag=DQ;//flag=0初始化成功,flag=1則初始化失敗
delay_us(20);
return flag;
}
//DS18B20寫一個字節(jié)
void write_tbyte(uchar dat){
uchar i;
bit onebit;
for(i=0;i<8;i++){//一位一位寫數(shù)據(jù)
onebit=dat&0x01;//提取要寫數(shù)據(jù)的最低位
dat=dat>>1;//數(shù)據(jù)右移,準(zhǔn)備下一次數(shù)據(jù)的提取
if(onebit){//要寫位為1時
DQ=0;//dq拉低時,空操作
_nop_();
_nop_();
DQ=1;//dq拉高時,延時
delay_us(5);
}
else{//要寫位為0時
DQ=0;//dq拉低時,延時
delay_us(8);
DQ=1;//dq拉高時,空操作
_nop_();
_nop_();
}
}
}
//DS18B20讀一個位
bit read_tbit(){
bit dat;
DQ=0;//dq拉低,1us之后釋放總線(即拉高dq)
_nop_();
DQ=1;//dq拉高
_nop_();
_nop_();
dat=DQ;//從總線dq上讀位數(shù)據(jù)
delay_us(10);//延時,確保讀時序的長度60us
return dat;
}
//DS18B20讀一個字節(jié)
uchar read_tbyte(){
uchar value,i,j;
value=0;//value初始化清0,用于保存每次讀取
//1位后的字節(jié)數(shù)據(jù)
for(i=0;i<8;i++){//一位一位讀數(shù)據(jù)(從最低位開始)
j=read_tbit();//讀位數(shù)據(jù)到j(luò)的最低位
value=(j<<7)|(value>>1);//構(gòu)造讀取的數(shù)據(jù)
//構(gòu)造原理:第一步,將剛讀到的位數(shù)據(jù)移到j(luò)的最高位
//第二步,將前一次讀取的數(shù)據(jù)值右移一位
//第三步,將新的j與新的value進(jìn)行或操作,
//得到當(dāng)前新的讀取數(shù)據(jù)
}
return value;
}
uint getTemp(){
uchar a,b;
float f_temp;//定義浮點型溫度數(shù)據(jù)
if(!reset()){//如果初始化成功
write_tbyte(0xcc);//跳過ROM
write_tbyte(0x44);//溫度轉(zhuǎn)換
}
if(!reset()){//如果初始化成功
write_tbyte(0xcc);//跳過ROM
write_tbyte(0xbe);//讀暫存器
a=read_tbyte();//讀取溫度低8位
b=read_tbyte();//讀取溫度高8位
}
flag_t=0;
t=b;//把溫度數(shù)據(jù)的高8位賦給整型溫度數(shù)據(jù)temp的低8位
t<<=8;//把以上8位數(shù)據(jù)從temp的低8位移到高8位
t=t|a;//兩字節(jié)合并得到整型變量
if(t>0x0fff){
flag_t=1;
t=~t+1;
}
f_temp=t*0.0625;//得到真實的浮點型溫度數(shù)據(jù)
t=f_temp*10+0.5;//將浮點型溫度數(shù)據(jù)放大十倍,并加0.5(加0.5是用于四舍五入)
//然后將處理后的浮點型溫度數(shù)據(jù)強(qiáng)制取整,賦給整型溫度數(shù)據(jù)
//這個賦值語句的目的將小數(shù)點后第一位也轉(zhuǎn)換為可顯示數(shù)字
return t;
}
void main(){
//1602初始化工作
writeIR(0x01);//清屏,同時光標(biāo)移到左上角
writeIR(0x38);//功能設(shè)置:8位接口,2行,5*7字符
writeIR(0x0c);//控制字符、光標(biāo)及閃爍:顯示器開,光標(biāo)關(guān),光標(biāo)不閃爍
writeIR(0x06);//輸入方式設(shè)置指令:光標(biāo)不動,字符自動右移一格
//writeIR(0x80);//送DDRAM地址設(shè)置指令80H,從第1行第1列開始顯示
//DS1302初始化工作
flag=1;
initial();
up_flag=0;
down_flag=0;
done=0;
while(1){
while(done==1)keydone();
while(done==0){
getTime();
gettemp();
display();
flag=0;
Selkey();
}
}
}
這是我的程序 但是最高的溫度就是16° 超過16的部分都重新來
作者:
OJSF
時間:
2017-12-13 09:44
666666.做的可以 太長了吧
作者:
qwerasdfzxcvpl
時間:
2017-12-13 11:09
看了看,還可以
作者:
renqian4436
時間:
2017-12-14 09:15
自我感覺你缺少的是溫度檢測那一部分的代碼設(shè)計和實體部件的設(shè)置
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
中文字幕第十一页
|
第一区在线观看免费国语入口
|
欧美一区免费在线观看
|
午夜亚洲
|
国产高清一区二区
|
久久亚洲一区
|
欧美日韩在线高清
|
国产精品激情小视频
|
狠狠操狠狠
|
亚洲精品久久久一区二区三区
|
日韩免费一级
|
免费中文字幕
|
免费成人高清在线视频
|
国产伦精品一区二区三区高清
|
日本成人中文字幕
|
欧美日韩亚洲国产
|
看一级黄色毛片
|
国产精品夜夜夜一区二区三区尤
|
国产999精品久久久久久
|
国产成人高清视频
|
日韩中文字幕免费在线观看
|
91婷婷韩国欧美一区二区
|
91成人免费
|
亚洲欧美日韩成人在线
|
久久久久久国产
|
色性av
|
av国产精品
|
高清国产一区二区
|
亚洲欧美视频一区二区
|
99在线免费视频
|
国产资源在线观看
|
激情网站在线
|
www久久
|
人人人人爽
|
午夜一区二区三区在线观看
|
欧美一级片在线观看
|
欧洲精品视频一区
|
黄一级
|
99re66在线观看精品热
|
中文字幕亚洲视频
|
国产精品免费大片
|