




main.c程式
#include<stc15f2k60s2.h>
#include "ds18b20.h"
#include <ds1302.h>
#define uchar unsigned char //定義無符號字符型別uchar
#define uint unsigned int //定義無符號整型型別uint
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};
uchar yi,er,san,si,wu,liu,qi,ba; //定義字符型變數yi,er,san,si,wu,liu,qi,ba,當作數碼管顯示控制變數
extern unsigned char shijian[];
uchar s7=5,s6=0,s4=0,wendu=0,LED_kai=0;
uchar naozhong[3]={0,0,0};
uint miao=0,tt=0;
bit fla=0;
void delayms(int ms); //延時函式
void allinit(); //初始化函式
void keyscan(); //獨立按鍵函式
void display1(uchar yi,uchar er); //第一、二段數碼管函式
void display2(uchar san,uchar si); //第三、四段數碼管函式
void display3(uchar wu,uchar liu); //第五、六段數碼管函式
void display4(uchar qi,uchar ba); //第七、八段數碼管函式
void Timer0Init(void); //5毫秒@11.0592MHz
void main()//主函式
{
allinit(); //初始化函式
DS_init();
Timer0Init();
while(1)
{
DS_get();
if(wendu==0)
{
if(s7==5)
{
yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10; //顯示時鐘頁面
}
else if(s7==1)
{
if(shijian[0]%2==0){yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;} //時鐘時選中頁面
else {yi=11;er=11;}
}
else if(s7==2)
{
if(shijian[0]%2==0){yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;} //時鐘分選中頁面
else {si=11;wu=11;}
}
else if(s7==3)
{
if(shijian[0]%2==0){yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;} //時鐘秒選中頁面
else {qi=11;ba=11;}
}
if(s6==5)
{
yi=naozhong[2]/10;er=naozhong[2]%10;san=10;si=naozhong[1]/10;wu=naozhong[1]%10;liu=10;qi=naozhong[0]/10;ba=naozhong[0]%10;; //顯示鬧鐘頁面
}
else if(s6==1)
{
if(shijian[0]%2==0){yi=naozhong[2]/10;er=naozhong[2]%10;san=10;si=naozhong[1]/10;wu=naozhong[1]%10;liu=10;qi=naozhong[0]/10;ba=naozhong[0]%10;} //鬧鐘時選中頁面
else {yi=11;er=11;}
}
else if(s6==2)
{
if(shijian[0]%2==0){yi=naozhong[2]/10;er=naozhong[2]%10;san=10;si=naozhong[1]/10;wu=naozhong[1]%10;liu=10;qi=naozhong[0]/10;ba=naozhong[0]%10;} //鬧鐘分選中頁面
else {si=11;wu=11;}
}
else if(s6==3)
{
if(shijian[0]%2==0){yi=naozhong[2]/10;er=naozhong[2]%10;san=10;si=naozhong[1]/10;wu=naozhong[1]%10;liu=10;qi=naozhong[0]/10;ba=naozhong[0]%10;} //鬧鐘秒選中頁面
else {qi=11;ba=11;}
}
}
else if(wendu==1)
{
yi=11;er=11;san=11;si=11;wu=11;liu=Tempget()/10;qi=Tempget()%10;ba=12; //溫度顯示頁面
}
if((shijian[0]==naozhong[0])&&(shijian[1]==naozhong[1])&&(shijian[2]==naozhong[2])) //判斷時鐘時分秒是否跟鬧鐘時分秒重合
{
LED_kai=1;tt=0;miao=0; //是的話打開L1燈
}
keyscan(); //獨立按鍵函式
display1(yi,er); //第一、二段數碼管函式
display2(san,si); //第三、四段數碼管函式
display3(wu,liu); //第五、六段數碼管函式
display4(qi,ba); //第七、八段數碼管函式
}
}
void keyscan()//獨立按鍵函式
{
if(P30==0) //判斷P30是否等于0
{
delayms(5); //延時5ms
if(P30==0) //再次判斷P30是否等于0
{
if(LED_kai==0) //非鬧鐘提醒狀態下
{
if(s7==0){s7=5;s6=0;} //按鍵按下切換相應狀態,這里有按鍵按下s6清零,方便顯示時鐘頁面
else if(s7==5){s7=1;} //按鍵按下切換相應狀態,進入時鐘時選中頁面
else if(s7==1){s7=2;} //按鍵按下切換相應狀態,進入時鐘分選中頁面
else if(s7==2){s7=3;} //按鍵按下切換相應狀態,進入時鐘秒選中頁面
else if(s7==3){s7=5;} //按鍵按下切換相應狀態,進入時鐘顯示頁面
}
else if(LED_kai==1) //鬧鐘提醒狀態下,按鍵按下則關L1燈
{
LED_kai=0;P2=0X80;P0=0XFF;
}
}
while(!P30); //如果按鍵不松開,則一直回圈
}
else if(P31==0) //判斷P31是否等于0
{
delayms(5); //延時5ms
if(P31==0) //再次判斷P31是否等于0
{
if(LED_kai==0) //非鬧鐘提醒狀態下
{
if(s6==0){s6=5;s7=0;} //按鍵按下切換相應狀態,這里有按鍵按下s6清零,方便顯示鬧鐘頁面
else if(s6==5){s6=1;} //按鍵按下切換相應狀態,進入鬧鐘時選中頁面
else if(s6==1){s6=2;} //按鍵按下切換相應狀態,進入鬧鐘分選中頁面
else if(s6==2){s6=3;} //按鍵按下切換相應狀態,進入鬧鐘秒選中頁面
else if(s6==3){s6=5;} //按鍵按下切換相應狀態,進入鬧鐘顯示頁面
}
else if(LED_kai==1) //鬧鐘提醒狀態下,按鍵按下則關L1燈
{
LED_kai=0;P2=0X80;P0=0XFF;
}
}
while(!P31); //如果按鍵不松開,則一直回圈
}
else if(P32==0) //判斷P32是否等于0
{
delayms(5); //延時5ms
if(P32==0) //再次判斷P32是否等于0
{
if(LED_kai==0) //非鬧鐘提醒狀態下
{
if(s7==1)
{
if(shijian[2]==23)shijian[2]=23;//判斷時鐘時是否大于等于23,是的話時還是等于23
else shijian[2]++; //否則時鐘時進行加一
DS_init(); //初始化時鐘
}
else if(s7==2)
{
if(shijian[1]==59)shijian[1]=59;//判斷時鐘分是否大于等于59,是的話分還是等于59
else shijian[1]++; //否則時鐘分進行加一
DS_init(); //初始化時鐘
}
else if(s7==3)
{
if(shijian[0]==59)shijian[0]=59;//判斷時鐘秒是否大于等于59,是的話秒還是等于59
else shijian[0]++; //否則時鐘秒進行加一
DS_init(); //初始化時鐘
}
if(s6==1)
{
if(naozhong[2]==23)naozhong[2]=23;//判斷鬧鐘時是否大于等于23,是的話時還是等于23
else naozhong[2]++; //否則鬧鐘時進行加一
}
else if(s6==2)
{
if(naozhong[1]==59)naozhong[1]=59;//判斷鬧鐘分是否大于等于59,是的話分還是等于59
else naozhong[1]++; //否則鬧鐘分進行加一
}
else if(s6==3)
{
if(naozhong[0]==59)naozhong[0]=59;//判斷鬧鐘秒是否大于等于59,是的話秒還是等于59
else naozhong[0]++; //否則鬧鐘秒進行加一
}
}
else if(LED_kai==1) //鬧鐘提醒狀態下,按鍵按下則關L1燈
{
LED_kai=0;P2=0X80;P0=0XFF;
}
}
while(!P32); //如果按鍵不松開,則一直回圈
}
else if(P33==0) //判斷P33是否等于0
{
delayms(5); //延時5ms
if(P33==0) //再次判斷P33是否等于0
{
s4=1; //按鍵按下s4置1
if(s7==5)wendu=1; //判斷是否是在始終顯示狀態下按鍵,是的話顯示溫度頁面
}
}
else if((s4==1)&&(P33==1)) //判斷s4是否等于1且按鍵抬起
{
s4=0; //s4置0,為下次按鍵按下做準備
wendu=0; //溫度不顯示
if(LED_kai==0) //非鬧鐘提醒狀態下
{
if(s7==1)
{
if(shijian[2]==0)shijian[2]=0;//判斷時鐘時是否大于等于0,是的話時還是等于0
else shijian[2]--; //否則時鐘時進行減一
DS_init(); //初始化時鐘
}
else if(s7==2)
{
if(shijian[1]==0)shijian[1]=0;//判斷時鐘分是否大于等于0,是的話分還是等于0
else shijian[1]--; //否則時鐘分進行減一
DS_init(); //初始化時鐘
}
else if(s7==3)
{
if(shijian[0]==0)shijian[0]=0;//判斷時鐘秒是否大于等于0,是的話秒還是等于0
else shijian[0]--; //否則時鐘秒進行減一
DS_init(); //初始化時鐘
}
if(s6==1)
{
if(naozhong[2]==0)naozhong[2]=0;//判斷鬧鐘時是否大于等于0,是的話時還是等于0
else naozhong[2]--; //否則鬧鐘時進行減一
}
else if(s6==2)
{
if(naozhong[1]==0)naozhong[1]=0;//判斷鬧鐘分是否大于等于0,是的話分還是等于0
else naozhong[1]--; //否則鬧鐘分進行減一
}
else if(s6==3)
{
if(naozhong[0]==0)naozhong[0]=0;//判斷鬧鐘秒是否大于等于0,是的話秒還是等于0
else naozhong[0]--; //否則鬧鐘秒進行減一
}
}
else if(LED_kai==1) //鬧鐘提醒狀態下,按鍵按下則關L1燈
{
LED_kai=0;P2=0X80;P0=0XFF;
}
}
}
void Timer0Init(void) //5毫秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設定定時器模式
TL0 = 0x00; //設定定時初值
TH0 = 0x28; //設定定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
EA=1;ET0=1;
}
void time0() interrupt 1 //定時器中斷函式
{
tt++,miao++;
if((tt==40)&&(LED_kai==1))//判斷計時是否到了0.2s并且LED_kai等于1
{
tt=0; //tt置0
if(fla==0){fla=1;P2=0X80;P0=0XFE;} //判斷fla是否等于0,是的話L1開,fla置1
else if(fla==1){fla=0;P2=0X80;P0=0XFF;} //判斷fla是否等于1,是的話L1關,fla置0
}
if(miao==1000) //定義5秒鐘
{
LED_kai=0; //LED_kai標志位置0
miao=0; //秒置0
P2=0X80;P0=0XFF;//關閉LED燈
}
}
void delayms(int ms)//延時函式
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()//初始化函式
{
P2=0XA0;P0=0X00; //關閉蜂鳴器繼電器
P2=0X80;P0=0XFF; //關閉所有LED燈
P2=0XC0;P0=0XFF; //選中所有數碼管段選
P2=0XFF;P0=0XFF; //關閉所有數碼管
}
void display1(uchar yi,uchar er)//第一、二段數碼管函式
{
P2=0XC0;P0=0X01; //選中第一個數碼管位選
P2=0XFF;P0=tab[yi]; //讓第一個數碼管顯示yi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X02; //選中第二個數碼管位選
P2=0XFF;P0=tab[er]; //讓第一個數碼管顯示er指向的值
delayms(1); //延時1ms
}
void display2(uchar san,uchar si)//第三、四段數碼管函式
{
P2=0XC0;P0=0X04; //選中第s三個數碼管位選
P2=0XFF;P0=tab[san]; //讓第一個數碼管顯示san指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X08; //選中第四個數碼管位選
P2=0XFF;P0=tab[si]; //讓第一個數碼管顯示si指向的值
delayms(1); //延時1ms
}
void display3(uchar wu,uchar liu)//第五、六段數碼管函式
{
P2=0XC0;P0=0X10; //選中第五個數碼管位選
P2=0XFF;P0=tab[wu]; //讓第一個數碼管顯示wu指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X20; //選中第六個數碼管位選
P2=0XFF;P0=tab[liu]; //讓第一個數碼管顯示liu指向的值
delayms(1); //延時1ms
}
void display4(uchar qi,uchar ba)//第七、八段數碼管函式
{
P2=0XC0;P0=0X40; //選中第七個數碼管位選
P2=0XFF;P0=tab[qi]; //讓第一個數碼管顯示qi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X80; //選中第八個數碼管位選
P2=0XFF;P0=tab[ba]; //讓第一個數碼管顯示ba指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X80; //選中第八個數碼管位選
P2=0XFF;P0=0XFF; //讓第八個數碼管熄滅
}
ds1302.c程式
#include<stc15f2k60s2.h>
#include <intrins.h>
#include <ds1302.h>
unsigned char shijian[]={50,59,23,0,0,0,0};
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302復位
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
Write_Ds1302_Byte((dat/10<<4)|(dat%10));
RST=0;
}
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00,dat1,dat2;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0;
_nop_();
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
return (temp);
}
void DS_init()
{
unsigned char add,i;
add=0x80;
Write_Ds1302(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_Ds1302(add,shijian[i]);
add=add+2;
}
Write_Ds1302(0x8e,0x80);
}
void DS_get()
{
unsigned char add,i;
add=0x81;
Write_Ds1302(0x8e,0x00);
for(i=0;i<7;i++)
{
shijian[i]=Read_Ds1302(add);
add=add+2;
}
Write_Ds1302(0x8e,0x80);
}
ds18b20.c程式
#include<stc15f2k60s2.h>
#include "ds18b20.h"
sbit DQ = P1^4; //單總線介面
//單總線延時函式
void Delay_OneWire(unsigned int t)
{
while(t--);
}
//通過單總線向DS18B20寫一個位元組
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(50);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(50);
}
//從DS18B20讀取一個位元組
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(50);
}
return dat;
}
//DS18B20設備初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(120);
DQ = 0;
Delay_OneWire(800);
DQ = 1;
Delay_OneWire(100);
initflag = DQ;
Delay_OneWire(50);
return initflag;
}
unsigned char Tempget()
{
unsigned char temp,low,high;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=high<<4;
temp|=(low>>4);
return temp;
}
ds1302.h程式
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302_Byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void DS_init();
void DS_get();
#endif
ds18b20.h程式
#ifndef __DS18B20_H
#define __DS18B20_H
//單總線延時函式
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
unsigned char Tempget();
#endif

第八屆藍橋杯單片機省賽作品演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282371.html
標籤:其他
