?? wannianli.c
字號:
/********************************************************************************************
//3208點陣屏電子鐘
//應用程序 C
//杜洋
//V3.0 2007-5-29
//MCS-51 12MHZ C語言
//接口說明: DS1302、DS18B20
//源自:http://www.doyoung.net
修改日志:
V2.0 NO.1-20051215 完成LED驅動、顯示切換、時鐘溫度讀取
V2.1 NO.2-20051216 完成整點報時、填加注釋信息
V2.2 NO.3-20051220 完成了調時、按鍵音等所以的功能(沒有鬧鐘)
V2.3 NO.3-20051221 增加了十位為0時的消隱功能
V3.0 NO.4-20070529 增加鬧鐘功能并進一步完善系統(1,完成菜單界面)
NO.5-20070530 增加鬧鐘項目,完成基本程序,開始測試功能
NO.6-20070602 修改了鬧鐘小時值=59的一處失誤
NO.7-20070617 修改了整點報時處的一處錯誤,該錯誤使報時不準
NO.8-20070617 將MODE最大值由7改為6,設置時7是沒有用的,編程的失誤
NO.9-20070703 修改了手動停止鬧鐘會再響的一處BUG
*********************************************************************************************/
/**********************************************************************************************/
#include <reg51.h>//定義頭文件 MCS-51單片機
/**********************************************************************************************/
//------------------------------定義縮寫字符
#define uchar unsigned char
#define uint unsigned int
//------------------------------定義揚聲器接口,低電平使能
sbit Bell_Out = P1 ^ 5;//揚聲器驅動
//------------------------------定義DS18B20音
sbit DQ = P1 ^ 6;//ds1820data(單總線)
//------------------------------定義DS1302時鐘接口
sbit clock_clk = P3 ^ 5;//ds1302_clk(時鐘線)
sbit clock_dat = P3 ^ 6;//ds1302_dat(數據線)
sbit clock_Rst = P3 ^ 7;//ds1302_Rst(復位線)
//-----------------------------定義數據口
#define Led_13 P0 //第1、3屏數據口
#define Led_24 P2 //第2、4屏數據口
#define Led_E P1 //74HC154的BCD列驅動(P1.0~P1.4)
sbit Led_EA = P1 ^ 4;//顯示列驅動器(74HC154)使能
//-----------------------------獨立鍵盤定義
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;//定義標志位
bit BEEP_bit;//鬧鐘開關標志
uchar bn;//掃描映射全局變量
static uchar timecount = 0;//定義靜態軟件計數器變量
//------------------------------------函數聲明(按字母順序排列)
uchar DL (uchar);
//-----------------------------定義顯示緩沖寄存器(32個字節全局變量)
uchar Ledplay [35];//
/**********************************************************************************************/
uchar code no[][10]={//-定義字符數據表單(二維數組)
//-----------------------------------數字字符表
{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},//“年”(在調時時表示年)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},//“時”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次數在版本信息第一列用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[]={//-開機畫面,顯示“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){//--延時函數 2uS/次
for (;num>0;num--);
}
/**********************************************************************************************/
void DelayM(unsigned int a){//-延時函數 1MS/次
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一個 ; 表示空語句,CPU空轉。
} //i 從0加到125,CPU大概就耗時1毫秒
}
/******************************************************************************/
void Init_DS18B20(void)//初始化ds1820
{
unsigned char x=0;
DQ = 1; //DQ復位
Delay(8); //稍做延時
DQ = 0; //單片機將DQ拉低
Delay(80); //精確延時 大于 480us
DQ = 1; //拉高總線
Delay(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
Delay(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void)//讀一個字節
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/******************************************************************************/
void WriteOneChar(unsigned char dat)//寫一個字節
{
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); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
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){//寫一個字節
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;//定義變量用于發聲的長度設置
Led_EA = 1;//關列顯示驅動,防止屏幕出現亂碼
for(a=2500;a>0;a--){//第一個聲音的長度
Bell_Out = ~Bell_Out;//取反揚聲器驅動口,以產生音頻
Delay(10);//音調設置延時
}
for(a=100;a>0;a--){//同上
Bell_Out = ~Bell_Out; //
Delay(6);//音調設置延時
}
Bell_Out = 1;
}
/**********************************************************************************************/
void Beep(void){//BELL-揚聲器--整點報時
uchar a;//定義變量用于發聲的長度設置
Led_EA = 1;//關列顯示驅動,防止屏幕出現亂碼
for(a=60;a>0;a--){//第一個聲音的長度
Bell_Out = ~Bell_Out;//取反揚聲器驅動口,以產生音頻
Delay(100);//音調設置延時
}
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 -揚聲器--確定設置
uchar a;//定義變量用于發聲的長度設置
Led_EA = 1;//關列顯示驅動,防止屏幕出現亂碼
for(a=250;a>0;a--){//第一個聲音的長度
Bell_Out = ~Bell_Out;//取反揚聲器驅動口,以產生音頻
Delay(20);//音調設置延時
}
for(a=100;a>0;a--){//同上
Bell_Out = ~Bell_Out;
Delay(80);//
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -