欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機用按鍵切換時間和溫度
[打印本頁]
作者:
Zzffhh
時間:
2020-6-29 17:06
標題:
51單片機用按鍵切換時間和溫度
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽LED段碼表
uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//含小數點共陽段碼 0-9
char displayData[4];
uint shi,fen=9,miao=9,T50ms,tt;//時,分,秒,50ms
uchar bai,sh,ge,a,b,t;
sbit a0=P2^0;//連接P2.0
sbit a1=P2^1;//連接P2.1
sbit a2=P2^2;//連接P2.2
sbit a3=P2^3;//連接P2.3
sbit DQ=P3^7;//連接P3.7
/*void delay(uchar n)//延時5微秒函數
{
do{
_nop_();
_nop_();
_nop_();
n--;
}
while(n);
}*/
void delay(uint n)
{
while(n--);
}
void init() //初始化子程序
{
TMOD=0x01;//定時器T0為方式1
TH0=(65536-50000)/256;//采用方式1,并設置定時器初值,50ms
TL0=(65536-50000)%256;
ET0=1;//啟動T0中斷允許
EA=1;//總中斷允許
TR0=1;//啟動T0
EX0=1;//允許外部中斷0中斷
//PX0=1;//外部中斷0高優先級中斷
//PT0=1;//定時器T0中斷高優先級中斷
}
void scan()//掃描
{
displayData[0] = tab[miao%10];
displayData[1] = tab[(miao/10)%10];
displayData[2] = tab[fen%10]|0x80;
displayData[3] = tab[(fen/10)%10];
}
void display() //顯示位數
{
char i;
for(i=0;i<=3;i++)
{
switch(i)
{
case 0:a0=0;a1=0;a2=0;a3=1;break;//顯示第0位
case 1:a0=0;a1=0;a2=1;a3=0;break;//顯示第1位
case 2:a0=0;a1=1;a2=0;a3=0;break;//顯示第2位
case 3:a0=1;a1=0;a2=0;a3=0;break;//顯示第3位
}
if(i==2){
P0=(displayData[i]&0x7f);//加小數點
}else
P0=displayData[i];//發送數據
delay(200); //間隔一段時間掃描
P0=0xff;//高電位清零
}
}
int_DS18b20()//對18b20初始化函數
{
uchar x=0;
DQ = 1; //DQ復位
delay(8);
DQ=0; //釋放DQ
delay(80); //DS18B20收到信號后延時
DQ=1; //讀取DQ
delay(10);
x=DQ;
delay(20);
return x;
}
void write_byte(uchar dat)//寫時序
{
uchar i=0;
for(i=8;i>0;i--){
DQ=0;
DQ=dat&0x01;//寫1,在15微秒內拉低
delay(5);//寫0,拉低60微秒
DQ=1;
dat>>=1;//右移1位,原數值除以2
}
delay(4);
}
read_byte()//讀時序
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--){
DQ=0;//拉低ds18b20單總線
dat>>=1;
DQ=1;//15微秒內拉釋放總線,等待ds18b20的存在脈沖
if(DQ)
dat|=0x80;
delay(4);
}
return (dat);
}
void int_()
{
while(int_DS18b20());
write_byte(0xcc);//發Skip ROM命令,由于只有一只DS18B20就不需要讀取ROM編碼以及匹配ROM編碼
write_byte(0x44);//啟動溫度轉換
}
void ReadTemperature()//讀取溫度的函數
{
uchar a=0;
unsigned b=0;
unsigned t=0;
int_();
delay(5);//延時,必要
int_DS18b20();
write_byte(0xCC);//跳過讀寫序列號
write_byte(0xBE);//讀溫度寄存器
delay(5);
a=read_byte();//讀取溫度
b=read_byte();
t=b<<4;//取高八位的后三位
t+=(a&0xf0)>>4;//低八位的高四位加上高八位中后三位的值
tt=a&0x0f;//小數位
sh=((b*256+a)>>4);//實際溫度
ge=tt*0.0625*10;
}
void wenduxianshi()//溫度顯示的函數
{
a0=1;
P0=tab[sh/10];//百
delay(100);
a0=0;
a1=1;
P0=tab[sh%10]+0x80;//十位,+0x80可以顯示小數點后一位
delay(100);
a1=0;
a2=1;
P0=tab[ge%10];//個位
delay(100);
a2=0;
a3=1;
P0=0xc6;// C
delay(100);
a3=0;
}
void main()//主函數
{
init();//初始化程序
while(1){
scan();//掃描
display();//顯示
}
}
void timer0() interrupt 1//timer0中斷服務子程序定是時間為50ms
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
T50ms++;
if(T50ms==20)//仿分鐘
{
T50ms=0;
miao++;
if(miao>=60)
{
miao=miao-60;
fen++;
if(fen>=60)
{
fen=fen-60;
shi++;
}
}
}
}
void k4q8() interrupt 0//外部中斷0
{
uint count=0;
while(1)
{
count++;
ReadTemperature();
wenduxianshi();
wenduxianshi();
if(k2=0)//隔一段時間返回時鐘
{
miao=miao+4;
break;
}
}
}
這段程序的效果是 按下按鍵由時間模塊切換到溫度模塊 4秒后自動切回時間模塊。怎么修改能變成通過點擊按鍵來回切換
作者:
man1234567
時間:
2020-6-30 07:47
居然沒看出按鍵接在哪個端口
作者:
wulin
時間:
2020-6-30 07:59
用按鍵切換時間和溫度
無標題.jpg
(144.46 KB, 下載次數: 61)
下載附件
2020-6-30 07:57 上傳
無標題1.jpg
(144.22 KB, 下載次數: 58)
下載附件
2020-6-30 07:57 上傳
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽LED段碼表
uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//含小數點共陽段碼 0-9
uchar displayData[4];
uint shi,fen=9,miao=9,T5ms,tt;//時,分,秒,50ms
uchar bai,sh,ge;
bit biaozhi=0;
//sbit a0=P2^0;//連接P2.0
//sbit a1=P2^1;//連接P2.1
//sbit a2=P2^2;//連接P2.2
//sbit a3=P2^3;//連接P2.3
sbit DQ=P3^7;//連接P3.7
void delay(uint n)
{
while(n--);
}
void init() //初始化子程序
{
TMOD=0x01;//定時器T0為方式1
TH0=(65536-5000)/256;//采用方式1,并設置定時器初值,5ms
TL0=(65536-5000)%256;
TF0=0;//中斷請求清0
TR0=1;//啟動T0
IT0=1;//下降沿觸發
EA=1;//總中斷允許
EX0=1;//允許外部中斷0中斷
//PX0=1;//外部中斷0高優先級中斷
//PT0=1;//定時器T0中斷高優先級中斷
}
void display()//顯示
{
static uchar i=0;
if(biaozhi==0)
{
displayData[0] = tab[fen/10%10];
displayData[1] = tab[fen%10]&0x7f;
displayData[2] = tab[miao/10%10];
displayData[3] = tab[miao%10];
}
else
{
displayData[0] = tab[sh/10%10];
displayData[1] = tab[sh%10]&0x7f;
displayData[2] = tab[ge%10];
displayData[3] = 0xc6;
}
P2&=0xf0;
P0=displayData[i];
P2|=0x01<<i;
i++;i%=4;
}
int_DS18b20()//對18b20初始化函數
{
uchar x=0;
DQ = 1; //DQ復位
delay(8);
DQ=0; //釋放DQ
delay(80); //DS18B20收到信號后延時
DQ=1; //讀取DQ
delay(10);
x=DQ;
delay(20);
return x;
}
void write_byte(uchar dat)//寫時序
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;//寫1,在15微秒內拉低
delay(5);//寫0,拉低60微秒
DQ=1;
dat>>=1;//右移1位,原數值除以2
}
delay(4);
}
uchar read_byte()//讀時序
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;//拉低ds18b20單總線
dat>>=1;
DQ=1;//15微秒內拉釋放總線,等待ds18b20的存在脈沖
if(DQ)
dat|=0x80;
delay(4);
}
return (dat);
}
void ReadTemperature()//讀取溫度的函數
{
static uchar i=0;
uchar a=0,b=0;
uint t=0;
switch(i)
{
case 0: int_DS18b20();
write_byte(0xcc);//發Skip ROM命令,由于只有一只DS18B20就不需要讀取ROM編碼以及匹配ROM編碼
write_byte(0x44);//啟動溫度轉換
break;
case 1: break;//利用定時循環周期替代5ms延時
case 2: int_DS18b20();
write_byte(0xCC);//跳過讀寫序列號
write_byte(0xBE);//讀溫度寄存器
break;
case 3: break;//利用定時循環周期替代5ms延時
case 4: a=read_byte();//讀取溫度低8位
b=read_byte(); //讀取溫度高8位
t=b<<8|a;
sh=t>>4;//取整數
ge=(a&0x0f)*0.625;//取1位小數
break;
}
i++;i%=5;
}
void main()//主函數
{
init();//初始化程序
while(1)
{
if(TF0)//查詢定時器中斷請求位
{
TF0=0;
TH0=(65536-5000)/256;//5ms
TL0=(65536-5000)%256;
T5ms++;
if(T5ms==200)//1s
{
T5ms=0;
miao++;
if(miao>=60)
{
miao=0;
fen++;
if(fen>=60)
fen=0;
}
}
ReadTemperature();//讀溫度
display();//顯示
}
}
}
void k4q8() interrupt 0//外部中斷0
{
biaozhi=~biaozhi;
}
復制代碼
作者:
樂兒翅
時間:
2020-7-28 10:21
你要設bai置一個標志變量,如flag,在進入按鍵程du序后,flag++;然后zhi加個控制判斷語句if(flag>3)flag=0;這樣,在顯示模dao塊中再加入開關語句;switch(flag){ case 0:...顯示時間.. case 1:...顯示日期。。. case 2:...顯示溫度。。。 }
作者:
lxbhcy
時間:
2020-7-28 11:21
設定一個變量,,初始為0,進入時間顯示的函數,,按一下 加1, 進行溫度的函數,,再按清零,,
作者:
lxbhcy
時間:
2020-7-28 11:22
用判斷執行,
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1