亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
51單片機(jī)通過18b20在數(shù)碼管顯示溫度和時(shí)間程序,按鍵設(shè)置鬧鐘
[打印本頁(yè)]
作者:
巴扎嘿
時(shí)間:
2022-1-26 11:40
標(biāo)題:
51單片機(jī)通過18b20在數(shù)碼管顯示溫度和時(shí)間程序,按鍵設(shè)置鬧鐘
#include "reg52.h"
unsigned int hour = 2, min = 2, sec = 3; //設(shè)置時(shí)間初值
unsigned int ahour = 0, amin = 0, asec = 0; //設(shè)置鬧鐘初值
sbit k1 = P3^1; //修改時(shí)間
sbit k2 = P3^0; //設(shè)置鬧鐘
sbit k3 = P3^2; //加1
sbit k4 = P3^3; //減1
sbit DSPORT=P3^7;
sbit beep=P1^5;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned int keyvalue = 0;
unsigned int settype = 0; //0是初始狀態(tài)正常顯示,1是修改秒,2是修改分,3是修改時(shí)
unsigned int alarmvalue = 0; //0是初始狀態(tài),1是修改秒,2是修改分,3是修改時(shí)
unsigned char Show[8] = {0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
unsigned char code TableCC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
int b = 0;
float tp=0;
int temp=0;
int c1=0;c2=0;
void delay(unsigned char i)
{
while(i--);
}
void delay_us(unsigned char t)
{
while(--t);
}
void delay_ms(unsigned int t) //t最大為255
{
while(t--)
{
delay_us(245);
delay_us(245);
}
}
unsigned char Ds18b20Init() //Ds18b20Init初始化
{
unsigned int i;
DSPORT=0; //將總線拉低480us~960us
i=70;
while(i--);//延時(shí)642us
DSPORT=1; //然后拉高總線,如果DS18B20做出反應(yīng)會(huì)將在15us~60us后總線拉低
i=0;
while(DSPORT) //等待DS18B20拉低總線
{
i++;
if(i>5000)//等待>5MS
return 0;//初始化失敗
}
return 1;//初始化成功
}
void Ds18b20WriteByte(unsigned char dat) //Ds18b20WriteByte 向18B20寫入一個(gè)字節(jié)
{
unsigned int i,j;
for(j=0;j<8;j++)
{
DSPORT=0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us
i++;
DSPORT=dat&0x01; //然后寫入一個(gè)數(shù)據(jù),從最低位開始
i=6;
while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60us
DSPORT=1; //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個(gè)數(shù)值
dat>>=1;
}
}
unsigned char Ds18b20ReadByte() //向18B20讀取一個(gè)字節(jié)
{
unsigned char byte,bi;
unsigned int i,j;
for(j=8;j>0;j--)
{
DSPORT=0;//先將總線拉低1us
i++;
DSPORT=1;//然后釋放總線
i++;
i++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定
bi=DSPORT; //讀取數(shù)據(jù),從最低位開始讀取
/*將byte左移一位,然后與上右移7位后的bi,注意移動(dòng)之后移掉那位補(bǔ)0。*/
byte=(byte>>1)|(bi<<7);
i=4; //讀取完之后等待48us再接著讀取下一個(gè)數(shù)
while(i--);
}
return byte;
}
void Ds18b20ChangTemp() //讓18B20轉(zhuǎn)換溫度
{
Ds18b20Init();
delay_ms(1);
Ds18b20WriteByte(0xcc); //跳過ROM操作命令
Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
}
void Ds18b20ReadTempCom() //讓18B20 讀取溫度
{
Ds18b20Init();
delay_ms(1);
Ds18b20WriteByte(0xcc); //跳過ROM操作命令
Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
}
int Ds18b20ReadTemp() //讀取溫度返回?cái)?shù)值
{
int temp=0;
unsigned char tmh,tml;
Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
tml=Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié)
tmh=Ds18b20ReadByte(); //再讀高字節(jié)
temp=tmh;
temp<<=8;
temp|=tml;
return temp;
}
void wendu_shuji()
{
temp=Ds18b20ReadTemp();
tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
temp=tp*0.0625*100+0.5;
c1 = temp % 10000 / 1000;
c2 = temp % 1000 / 100;
Show[7]=TableCC[c1];
Show[6]=TableCC[c2];
}
void Timer0_Init() //定時(shí)器初始化
{
TMOD |= 0x01; //選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。
TH0 =(65536 - 50000)/256; //給定時(shí)器賦初值
TL0 =(65536 - 50000)%256;
TR0=1;//打開定時(shí)器
ET0=1;//打開定時(shí)器0中斷允許
EA=1;//打開總中斷
}
void TimeTim() //時(shí)鐘正常走
{
if(settype == 0 && alarmvalue == 0) //當(dāng)不在鬧鐘狀態(tài)也不在修改時(shí)間狀態(tài)的時(shí)候時(shí)間正常走
{
if(b>=20)
{
b=0;
sec++;
if(sec == 60)
{
sec = 0;
min++;
if(min == 60)
{
min = 0;
hour++;
if(hour == 24)
{
hour = 0;
}
}
}
}
}
}
void bsp_CheckAlarm(void) //檢查時(shí)間是否到了鬧鐘時(shí)間
{
unsigned char a=0;
if((hour == ahour) && (min == amin) && (sec == asec))
{
while(1)
{
beep=~beep;
delay_us(100);
if(k1 == 0)//K1按鍵被按下
{
delay(1000);
if(k1 == 0)
{
beep=0;
a=1;
}
while(!k1);//等待按鍵釋放
}
if(a == 1)
{
break;
}
}
}
}
void bsp_KeyScan(void) //掃描鍵盤那個(gè)鍵被按下
{
if(k1 == 0)//K1按鍵被按下
{
delay(1000);
if(k1==0)
{
keyvalue = 1;
}
while(!k1);//等待按鍵釋放
}
if(k2 == 0)
{
delay(1000);
if(k2==0)
{
keyvalue = 2;
}
while(!k2);
}
if(k3 == 0)
{
delay(1000);
if(k3==0)
{
keyvalue = 3;
}
while(!k3);
}
if(k4 == 0)
{
delay(1000);
if(k4==0)
{
keyvalue = 4;
}
while(!k4);
}
}
void timeadd() //時(shí)間加1
{
if(settype == 1)
{
if(sec < 59)
{
sec++;
}
else
{
sec = 0;
}
}
else if(settype == 2)
{
if(min < 59)
{
min++;
}
else
{
min = 0;
}
}
else if(settype == 3)
{
if(hour < 23)
{
hour++;
}
else
{
hour = 0;
}
}
if(alarmvalue == 1) //設(shè)置鬧鐘加1
{
if(asec < 59)
{
asec++;
}
else
{
asec = 0;
}
}
else if(alarmvalue == 2)
{
if(amin < 59)
{
amin++;
}
else
{
amin = 0;
}
}
else if(alarmvalue == 3)
{
if(ahour < 23)
{
ahour++;
}
else
{
ahour = 0;
}
}
}
void timedec() //時(shí)間減一
{
if(settype == 1)
{
if(sec > 0)
{
sec--;
}
else
{
sec = 59;
}
}
else if(settype == 2)
{
if(min > 0)
{
min--;
}
else
{
min = 59;
}
}
else if(settype == 3)
{
if(hour > 0)
{
hour--;
}
else
{
hour = 23;
}
}
if(alarmvalue == 1) //設(shè)置鬧鐘減1
{
if(asec > 0)
{
asec--;
}
else
{
asec = 59;
}
}
else if(alarmvalue == 2)
{
if(amin > 0)
{
amin--;
}
else
{
amin = 59;
}
}
else if(alarmvalue == 3)
{
if(ahour > 0)
{
ahour--;
}
else
{
ahour = 23;
}
}
}
void bsp_KeyProc(unsigned char keyv)
{
if(keyv == 1)
{
settype++;
if(settype == 4)
{
settype = 0;
}
keyvalue = 0; //鍵值要清0!!!
}
if(keyv == 2)
{
alarmvalue++;
if(alarmvalue == 4)
{
alarmvalue = 0;
}
keyvalue = 0;
}
if(keyv == 3)
{
timeadd();
keyvalue = 0;
}
if(keyv == 4)
{
timedec();
keyvalue = 0;
}
}
void SetValueShow(void)
{
if(alarmvalue == 0) //當(dāng)不在鬧鐘狀態(tài)時(shí)數(shù)碼管顯示正常的時(shí)間
{
Show[5] = TableCC[hour/10];
if(settype == 3)
Show[4] = TableCC[hour%10] | 0x80;
else
Show[4] = TableCC[hour%10];
Show[3] = TableCC[min/10];
if(settype == 2)
Show[2] = TableCC[min%10] | 0x80;
else
Show[2] = TableCC[min%10];
Show[1] = TableCC[sec/10];
if(settype == 1)
Show[0] = TableCC[sec%10] | 0x80;
else
Show[0] = TableCC[sec%10];
}
//在鬧鐘狀態(tài)數(shù)碼管顯示鬧鐘設(shè)置的時(shí)間
else
{
Show[5] = TableCC[ahour/10];
if(alarmvalue == 3)
Show[4] = TableCC[ahour%10] | 0x80;
else
Show[4] = TableCC[ahour%10];
Show[3] = TableCC[amin/10];
if(alarmvalue == 2)
Show[2] = TableCC[amin%10] | 0x80;
else
Show[2] = TableCC[amin%10];
Show[1] = TableCC[asec/10];
if(alarmvalue == 1)
Show[0] = TableCC[asec%10] | 0x80;
else
Show[0] = TableCC[asec%10];
}
}
void DigDisplay()
{
int i;
for(i=0;i<8;i++)
{
switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
P0=Show[i];//發(fā)送段碼
delay(100); //間隔一段時(shí)間掃描
P0=0x00;//消隱
}
}
void main()
{
k1=1;
k2=1;
k3=1;
k4=1;
Timer0_Init(); //計(jì)時(shí)器的初始化
while(1)
{
wendu_shuji(); //溫度
TimeTim(); //正常時(shí)間在走
bsp_KeyScan(); //鍵盤掃描看哪個(gè)功能鍵被按下
bsp_KeyProc(keyvalue); //根據(jù)鍵值進(jìn)行相應(yīng)的功能處理
SetValueShow(); //數(shù)碼管上顯示的值
DigDisplay(); //顯示在數(shù)碼管上
bsp_CheckAlarm(); //鬧鐘檢查
}
}
void Timer0(void) interrupt 1 //定時(shí)器的中斷服務(wù)程序
{
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
b++;
}
復(fù)制代碼
Keil代碼下載:
最終.rar
(26.26 KB, 下載次數(shù): 16)
2022-1-26 11:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1