





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};//數字0~9,“-”“關”
uchar yi,er,san,si,wu,liu,qi,ba; //定義字符型變數yi,er,san,si,wu,liu,qi,ba,當作數碼管顯示控制變數
extern unsigned char shijian[]; //呼叫DS1302定義的時間陣列
uchar wendu,shezhi=0,jiange=1,s4=0;
uint tt=0;
uchar Save[10],Save_n=0;
bit fla=0,LED_shan=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(); //初始化DS1302
Timer0Init(); //初始化定時器0
while(1)
{
wendu=Tempget(); //獲取溫度
if(shezhi==0) //引數設定頁面
{
yi=11;er=11;san=11;si=11;wu=11;liu=10;qi=jiange/10;ba=jiange%10; //顯示間隔
}
else if(shezhi==1) //時鐘顯示頁面
{
DS_get();
yi=shijian[2]/10;er=shijian[2]%10;
si=shijian[1]/10;wu=shijian[1]%10;
qi=shijian[0]/10;ba=shijian[0]%10;
if(shijian[0]%10%2==0){san=10;liu=10;} //判斷秒是奇數還是偶數,用來讓數碼管三、六位間隔閃爍
else{san=11;liu=11;}
}
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(shezhi==3)shezhi=0; //判斷此時是否在第三個頁面,也就是說采集到的10個資料均已在數碼管上顯示完畢,按鍵后回傳到引數設定頁面
}
while(!P30); //如果按鍵不松開,則一直回圈
}
else if(P31==0) //判斷P31是否等于0
{
delayms(5); //延時5ms
if(P31==0) //再次判斷P31是否等于0
{
if(shezhi==2){LED_shan=0;P2=0X80;P0=0XFF;} //判斷此時是否在第二個頁面,也就是10個引數采集過后,L1燈亮起,按鍵后L1熄滅,數碼管回圈顯示采集到的10個資料
}
while(!P31); //如果按鍵不松開,則一直回圈
}
else if(P32==0) //判斷P32是否等于0
{
delayms(5); //延時5ms
if(P32==0) //再次判斷P32是否等于0
{
if(shezhi==0){shezhi=1;tt=0;} //判斷在設定頁面下按鍵是否按下,按下后進入到時鐘顯示頁面,并開始采集資料
}
while(!P32); //如果按鍵不松開,則一直回圈
}
else if(P33==0) //判斷P33是否等于0
{
delayms(5); //延時5ms
if(P33==0) //再次判斷P33是否等于0
{
if(shezhi==0)
{
if(jiange==1)jiange=5; //判斷間隔是否在1s上,如果是按鍵按下后間隔改為5s
else if(jiange==5)jiange=30; //判斷間隔是否在5s上,如果是按鍵按下后間隔改為30s
else if(jiange==30)jiange=60; //判斷間隔是否在30s上,如果是按鍵按下后間隔改為60s
else if(jiange==60)jiange=1; //判斷間隔是否在60s上,如果是按鍵按下后間隔改為1s
}
}
while(!P33); //如果按鍵不松開,則一直回圈
}
}
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++;
if((tt==jiange*200)&&(shezhi==1))
{
tt=0;
Save[Save_n]=wendu;
Save_n++;
if(Save_n==10)
{
shezhi=2;LED_shan=1;Save_n=0;
yi=10;er=0;san=0;si=11;wu=11;liu=11;qi=Save[0]/10;ba=Save[0]%10;
}
}
if((tt==200)&&(shezhi==2))
{
tt=0;
if(LED_shan==1)
{
if(fla==0){fla=1;P2=0X80;P0=0XFE;}
else if(fla==1){fla=0;P2=0X80;P0=0XFF;}
}
else if(LED_shan==0)
{
yi=10;er=Save_n/10;san=Save_n%10;si=11;wu=11;liu=11;qi=Save[Save_n]/10;ba=Save[Save_n]%10;
Save_n++;
if(Save_n==10)
{
Save_n=0;shezhi=3;
}
}
}
}
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>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302復位
unsigned char shijian[]={50,59,23,0,0,0,0};
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 low,high,temp;
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/279655.html
標籤:其他
