?? wannianli.c
字號(hào):
/********************************************************************************************
//3208點(diǎn)陣屏電子鐘
//應(yīng)用程序 C
//杜洋
//V3.0 2007-5-29
//MCS-51 12MHZ C語(yǔ)言
//接口說(shuō)明: DS1302、DS18B20
//源自:http://www.doyoung.net
修改日志:
V2.0 NO.1-20051215 完成LED驅(qū)動(dòng)、顯示切換、時(shí)鐘溫度讀取
V2.1 NO.2-20051216 完成整點(diǎn)報(bào)時(shí)、填加注釋信息
V2.2 NO.3-20051220 完成了調(diào)時(shí)、按鍵音等所以的功能(沒(méi)有鬧鐘)
V2.3 NO.3-20051221 增加了十位為0時(shí)的消隱功能
V3.0 NO.4-20070529 增加鬧鐘功能并進(jìn)一步完善系統(tǒng)(1,完成菜單界面)
NO.5-20070530 增加鬧鐘項(xiàng)目,完成基本程序,開始測(cè)試功能
NO.6-20070602 修改了鬧鐘小時(shí)值=59的一處失誤
NO.7-20070617 修改了整點(diǎn)報(bào)時(shí)處的一處錯(cuò)誤,該錯(cuò)誤使報(bào)時(shí)不準(zhǔn)
NO.8-20070617 將MODE最大值由7改為6,設(shè)置時(shí)7是沒(méi)有用的,編程的失誤
NO.9-20070703 修改了手動(dòng)停止鬧鐘會(huì)再響的一處BUG
*********************************************************************************************/
/**********************************************************************************************/
#include <reg51.h>//定義頭文件 MCS-51單片機(jī)
/**********************************************************************************************/
//------------------------------定義縮寫字符
#define uchar unsigned char
#define uint unsigned int
//------------------------------定義揚(yáng)聲器接口,低電平使能
sbit Bell_Out = P1 ^ 5;//揚(yáng)聲器驅(qū)動(dòng)
//------------------------------定義DS18B20音
sbit DQ = P1 ^ 6;//ds1820data(單總線)
//------------------------------定義DS1302時(shí)鐘接口
sbit clock_clk = P3 ^ 5;//ds1302_clk(時(shí)鐘線)
sbit clock_dat = P3 ^ 6;//ds1302_dat(數(shù)據(jù)線)
sbit clock_Rst = P3 ^ 7;//ds1302_Rst(復(fù)位線)
//-----------------------------定義數(shù)據(jù)口
#define Led_13 P0 //第1、3屏數(shù)據(jù)口
#define Led_24 P2 //第2、4屏數(shù)據(jù)口
#define Led_E P1 //74HC154的BCD列驅(qū)動(dòng)(P1.0~P1.4)
sbit Led_EA = P1 ^ 4;//顯示列驅(qū)動(dòng)器(74HC154)使能
//-----------------------------獨(dú)立鍵盤定義
sbit Add_Key = P3 ^ 1;//前位加1鍵
sbit Add2_Key = P3 ^ 0;//后位加1鍵
sbit OK_Key = P3 ^ 2;//確定鍵
sbit int_Key = P3 ^ 3;//中斷入口
//-----------------------------定義累加器A中的各位
sbit a0 = ACC ^ 0;
sbit a1 = ACC ^ 1;
sbit a2 = ACC ^ 2;
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;
//------------------------------------定義全局變量
uchar MENU,v;//定義標(biāo)志位
bit BEEP_bit;//鬧鐘開關(guān)標(biāo)志
uchar bn;//掃描映射全局變量
static uchar timecount = 0;//定義靜態(tài)軟件計(jì)數(shù)器變量
//------------------------------------函數(shù)聲明(按字母順序排列)
uchar DL (uchar);
//-----------------------------定義顯示緩沖寄存器(32個(gè)字節(jié)全局變量)
uchar Ledplay [35];//
/**********************************************************************************************/
uchar code no[][10]={//-定義字符數(shù)據(jù)表單(二維數(shù)組)
//-----------------------------------數(shù)字字符表
{0x7E,0xFF,0x81,0x81,0xFF,0x7E,0},//0
{0x82,0xFF,0xFF,0x80,0}, //1
{0xC6,0xE7,0xB1,0x99,0x8F,0x86,0},//2
{0x42,0xC3,0x89,0x89,0xFF,0x76,0},//3
{0x30,0x28,0xA6,0xFF,0xFF,0xA0,0},//4
{0x4F,0xCF,0x89,0x89,0xF9,0x71,0},//5
{0x7E,0xFF,0x89,0x8B,0xFB,0x70,0},//6
{0x03,0x03,0xF9,0xFF,0x07,0},//7
{0x76,0xFF,0x89,0x89,0xFF,0x76,0},//8
{0x0E,0xDF,0xD1,0x91,0xFF,0x7E,0},//9
//-----------------------------------星期字符表
{0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0},//一10
{0x40,0x44,0x44,0x44,0x44,0x44,0x44,0x40,0},//二
{0x82,0x92,0x92,0x92,0x92,0x92,0x82,0x80,0},//三
{0xFE,0xA2,0x9E,0x82,0x9E,0xA2,0xFE,0},//四
{0x80,0x89,0xFF,0x89,0x89,0x89,0xF9,0x80,0},//五
{0x88,0x68,0x38,0x0E,0x38,0x68,0x88,0},//六
{0xFE,0x92,0x92,0x92,0x92,0xFE,0},//日 10+6
//-----------------------------------特殊字符表
{0x6C,0x6C,0},//“:” 17
{0x18,0x18,0x18,0x18,0},//“-” 18
{0x06,0x06,0x78,0xFC,0x84,0x84,0x84,0x80,0},//“oC” 19
{0x24,0x3b,0x2a,0xfe,0x2a,0x22,0},//“年”(在調(diào)時(shí)時(shí)表示年)20
{0x80,0x7E,0x15,0x15,0x95,0xFF,0},//“月”21
{0xFE,0x92,0x92,0x92,0x92,0xFE,0},//“日”22
{0x80,0x7f,0x75,0x5f,0x75,0xFF,0},//“周”23
{0x7c,0x54,0x7c,0x04,0x94,0xFF,0x04,0},//“時(shí)”24
{0x08,0x94,0x52,0x30,0x93,0xF4,0x08,0},//“分”25
};
/**********************************************************************************************/
uchar code Mode[]={//”-顯示“Mode”
0x7F,0x02,0x0C,0x02,0x7F,0, // -M-
0x3E,0x41,0x41,0x41,0x3E,0, // -O-
0x7F,0x41,0x41,0x41,0x3E,0, // -D-
0x7F,0x49,0x49,0x49,0x41,0, // -E-
0x99};
/**********************************************************************************************/
uchar code Time[]={//”-顯示“Time”
0x01,0x01,0x7F,0x01,0x01,0, // -T-
0x41,0x7F,0x41,0x00, // -I-
0x7F,0x02,0x0C,0x02,0x7F,0, // -M-
0x7F,0x49,0x49,0x49,0x41, // -E-
0x99};
/**********************************************************************************************/
uchar code T[]={//”-顯示“T”
0x01,0x01,0x7F,0x01,0x01,0, // -T-
0x14,0, // -:-
0x99};
/**********************************************************************************************/
uchar code Pp[]={//”--顯示“P”
0x7F,0x09,0x09,0x06,0, // -P-
0x14,0, // -:-
0x99};
/**********************************************************************************************/
uchar code POINT[]={//”-顯示“POINT”
0x7F,0x09,0x09,0x09,0x06,0, // -P-
0x3E,0x41,0x41,0x41,0x3E,0, // -O-
0x41,0x7F,0x41,0x00, // -I-
0x7F,0x04,0x08,0x10,0x7F,0, // -N-
0x01,0x01,0x7F,0x01,0x01, // -T-
0x99};
/**********************************************************************************************/
uchar code V30[]={//”顯示“V30”
4,0,0,0,0,0, //更新的BUG次數(shù)在版本信息第一列用8421表示
0x1F,0x20,0x40,0x20,0x1F,0, // -V-
0x21,0x41,0x49,0x4D,0x33,// -3-
0x00,0x60,0x60,0x00,// -.-
0x3E,0x51,0x49,0x45,0x3E, // -0-
0x99
};
/**********************************************************************************************/
uchar code ALARM[]={//”-顯示“ALARM”
0xFc,0x22,0x22,0xfc,0,//“A”24
0xFe,0x80,0x80,0,//“L”24
0xFc,0x22,0x22,0xfc,0,//“A”24
0xFe,0x12,0x32,0xcc,0,//“R”25
0xFe,0x04,0x08,0x04,0xFe,0,//“M”25
0x99
};
/**********************************************************************************************/
uchar code A[]={//”--顯示“A:”
0x7C,0x12,0x11,0x12,0x7C,0, // -A-
0x14,0, // -:-
0x99
};
/**********************************************************************************************/
uchar code Aoff[]={//-顯示“A:off””
0x7C,0x12,0x11,0x12,0x7C,0, // -A-
0x14,0, // -:-
0x3E,0x41,0x41,0x41,0x3E,0, // -O-
0x7F,0x09,0x09,0x09,0x01,0, // -F-
0x7F,0x09,0x09,0x09,0x01, // -F-
0x99
};
/**********************************************************************************************/
uchar code Aon[]={//”顯示“A:on”
0x7C,0x12,0x11,0x12,0x7C,0, // -A-
0x14,0, // -:-
0x3E,0x41,0x41,0x41,0x3E,0, // -O-
0x7F,0x04,0x08,0x10,0x7F,// -N-
0x99
};
/**********************************************************************************************/
uchar code ONOFF[]={//顯示“ON/OFF“
0x3E,0x41,0x41,0x41,0x3E, // -O-
0x7F,0x04,0x08,0x10,0x7F,0, // -N-
0x36,0x49,0x56,0x20,0x50,0, // -&-
0x3E,0x41,0x41,0x41,0x3E, // -O-
0x7F,0x09,0x09,0x09,0x01, // -F-
0x7F,0x09,0x09,0x09,0x01, // -F-
0x99
};
/**********************************************************************************************/
uchar code DoYoung[]={//-開機(jī)畫面,顯示“DoYoung”
0xfe,0x82,0x82,0x7c,0,//D
0x78,0x84,0x78,0,//o
0x02,0x0c,0xF0,0x0c,0x02,//Y
0x78,0x84,0x78,0,//o
0x7c,0x80,0x80,0x7c,0,//u
0xf8,0x04,0x04,0xf8,0,//n
0x98,0xa4,0xa4,0x78,//g
0x99
};
/**********************************************************************************************/
void key_off (void){//-等待所有鍵放開(通用)
while(OK_Key == 0 || int_Key == 0 || Add_Key == 0 || Add2_Key == 0);//等待鍵放開
}
/**********************************************************************************************/
void Delay(int num){//--延時(shí)函數(shù) 2uS/次
for (;num>0;num--);
}
/**********************************************************************************************/
void DelayM(unsigned int a){//-延時(shí)函數(shù) 1MS/次
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一個(gè) ; 表示空語(yǔ)句,CPU空轉(zhuǎn)。
} //i 從0加到125,CPU大概就耗時(shí)1毫秒
}
/******************************************************************************/
void Init_DS18B20(void)//初始化ds1820
{
unsigned char x=0;
DQ = 1; //DQ復(fù)位
Delay(8); //稍做延時(shí)
DQ = 0; //單片機(jī)將DQ拉低
Delay(80); //精確延時(shí) 大于 480us
DQ = 1; //拉高總線
Delay(14);
x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
Delay(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void)//讀一個(gè)字節(jié)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號(hào)
dat>>=1;
DQ = 1; // 給脈沖信號(hào)
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/******************************************************************************/
void WriteOneChar(unsigned char dat)//寫一個(gè)字節(jié)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
/******************************************************************************/
unsigned int ReadTemperature(void)//讀取溫度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作
WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
Init_DS18B20();
WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
WriteOneChar(0xBE); //讀取溫度寄存器
a=ReadOneChar(); //讀低8位
b=ReadOneChar(); //讀高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍輸出并四舍五入
return(t);
}
/******************************************************************************/
uchar printTemperature(void){//寫一個(gè)字節(jié)
unsigned int i=0;
unsigned char a=0,b=0,c=0;
i=ReadTemperature();//讀溫度并送顯
a=i/100;
b=i/10-a*10;
i = a*10 + b;
return i;
}
/**********************************************************************************************/
void Beeplll(void){//BELL 鬧鐘聲音
uint a;//定義變量用于發(fā)聲的長(zhǎng)度設(shè)置
Led_EA = 1;//關(guān)列顯示驅(qū)動(dòng),防止屏幕出現(xiàn)亂碼
for(a=2500;a>0;a--){//第一個(gè)聲音的長(zhǎng)度
Bell_Out = ~Bell_Out;//取反揚(yáng)聲器驅(qū)動(dòng)口,以產(chǎn)生音頻
Delay(10);//音調(diào)設(shè)置延時(shí)
}
for(a=100;a>0;a--){//同上
Bell_Out = ~Bell_Out; //
Delay(6);//音調(diào)設(shè)置延時(shí)
}
Bell_Out = 1;
}
/**********************************************************************************************/
void Beep(void){//BELL-揚(yáng)聲器--整點(diǎn)報(bào)時(shí)
uchar a;//定義變量用于發(fā)聲的長(zhǎng)度設(shè)置
Led_EA = 1;//關(guān)列顯示驅(qū)動(dòng),防止屏幕出現(xiàn)亂碼
for(a=60;a>0;a--){//第一個(gè)聲音的長(zhǎng)度
Bell_Out = ~Bell_Out;//取反揚(yáng)聲器驅(qū)動(dòng)口,以產(chǎn)生音頻
Delay(100);//音調(diào)設(shè)置延時(shí)
}
for(a=100;a>0;a--){//同上
Bell_Out = ~Bell_Out;
Delay(80);//
}
for(a=100;a>0;a--){//同上
Bell_Out = ~Bell_Out;
Delay(30);//
}
}
/**********************************************************************************************/
void Beep_set(void){//BELL -揚(yáng)聲器--確定設(shè)置
uchar a;//定義變量用于發(fā)聲的長(zhǎng)度設(shè)置
Led_EA = 1;//關(guān)列顯示驅(qū)動(dòng),防止屏幕出現(xiàn)亂碼
for(a=250;a>0;a--){//第一個(gè)聲音的長(zhǎng)度
Bell_Out = ~Bell_Out;//取反揚(yáng)聲器驅(qū)動(dòng)口,以產(chǎn)生音頻
Delay(20);//音調(diào)設(shè)置延時(shí)
}
for(a=100;a>0;a--){//同上
Bell_Out = ~Bell_Out;
Delay(80);//
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -