?? 3208_v4.01.00.c
字號:
/********************************************************************************************
//3208點陣屏電子鐘
//作者:杜洋
//V4.01.00 2007-5-29
//MCS-51 12MHZ C語言
//接口說明:DS1302、DS18B20
//注意:V4.1適合于V2.0/V3.0的硬件升級到V4.0則請使用V4.1正式版。
//源自:http://www.doyoung.net (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
/*-------------------------------------------------------------------------------------------
V4.0 NO.1-20080123 開始進行V4.0的升級。
NO.2-20080125 完成流動顯示功能及流動速度調整功能。鬧鐘改為6路。
NO.3-20080126 解決了鬧鈴時不能閃爍顯示鬧鈴時間的問題。
NO.4-20080228 繼續進行升級。
NO.5-20080228 完成時間校準功能及顯示模式功能。
NO.6-20080303 修改了切換顯示模式后可能會有一屏的亂碼情況。
NO.7-20081103 修改了初始化黑屏現象。
NO.8-20081103 將oC改小,加入“周”字顯示。
NO.9-20081103 重新優化排版和注釋。
V4.1 NO.1-20081103 驅動改為適合原來V2.0和V3.0版本的硬件電路升級。
NO.2-20081103 加入匯編的數據反轉程序。
NO.3-20081103 修改顯示版本號為V4.1
-------------------------------------------------------------------------------------------*/
/*********************************************************************************************/
//0- 此鬧鐘獨立關閉,1- 此鬧鐘鳴響一次后自動關閉,2- 此鬧鐘常響,3- 此鬧鐘周一~五鳴響周六、日除外
//4- 此鬧鐘周一~六鳴響,5- 此鬧鐘周六、日鳴響,6- 此鬧鐘周日鳴響
/*********************************************************************************************/
/**********************************************************************************************/
#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 DL (uchar);//2和4屏數據反轉(用DL的匯編實現)
uchar MENU,v;//定義標志位
bit BEEP_bit;//鬧鐘開關標志
uchar bn;//掃描映射全局變量
uchar hour_renew;//定義靜態小時更新用數據變量
static uchar timecount = 0;//定義靜態軟件計數器變量
uchar disbuf_flag=1;
uchar left_move_time=0;
uchar ty = 0;//定義溫度寄存器變量
//-----------------------------定義顯示緩沖寄存器(32個字節全局變量)
data uchar Ledplay [32];//data和idata用來解決內存溢出的問題!!!!!!
//-----------------------------定義待顯緩沖寄存器(80個字節全局變量)
idata uchar Ledplay_buf [80];//
/**********************************************************************************************/
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,0xFE,0},//日 10+6
//-----------------------------------特殊字符表
{0x6C,0x6C,0},//“:” 17
{0x18,0x18,0x18,0x18,0},//“-” 18
{0x01,0x0E,0x0A,0},//“oC” 19
{0x24,0x3b,0x2a,0xfe,0x2a,0x22,0},//“年”(在調時時表示年)20
{0x80,0x7E,0x15,0x15,0x95,0xFF,0},//“月”21
{0xFE,0x92,0x92,0x92,0xFE,0},//“日”22
{0xff,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[]={//”顯示“V4.0”
0,0,0,0,0,0,
0x1F,0x20,0x40,0x20,0x1F,0, // -V-
0x18,0x14,0x12,0x7f,0x10,//-4-
0x00,0x40,0x00,// -.-
0x02,0x7f, // -1-
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:”即ALARM,表示鬧鐘設置
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 SPEED[]=//顯示“SPEED”即速度設置字樣
{
0x26,0x49,0x49,0x49,0x32,0,//S
0x7F,0x09,0x09,0x09,0x06,0,//P
0x7F,0x49,0x49,0x49,0x41,0,//E
0x7F,0x49,0x49,0x49,0x41,0,//E
0x7F,0x41,0x41,0x41,0x3E,//D
0x99
};
/**********************************************************************************************/
uchar code LEVEL[]=//顯示"LEVEL"
{
0xFE,0x80,0x80,0x00,//L
0xFE,0x92,0x92,0x82,0x00,//E
0x7E,0x80,0x80,0x7E,0x00,//V
0xFE,0x92,0x92,0x82,0x00,//E
0xFE,0x80,0x80,0,0,//L
0x99
};
/**********************************************************************************************/
uchar code TIMEADJ[]=//顯示"TIMEADJ"即時鐘精度調整
{
0x01,0x01,0x7F,0x01,0x01,0x00,//T
0x7F,0x00,//I
0x7F,0x02,0x04,0x02,0x7F,0x00,//M
0x7F,0x49,0x49,0x41,0x00,//E
0x7E,0x11,0x11,0x7E,0x00,//A
0x7F,0x41,0x41,0x3E,0x00,//D
0x41,0x7F,0x01,//J
0x99
};
/**********************************************************************************************/
uchar code VAL_INC[]=//顯示"VAL+"
{
0x7E,0x80,0x80,0x7E,0x00,//V
0xFC,0x22,0x22,0xFC,0x00,//A
0xFE,0x80,0x80,//L
0x10,0x10,0x7C,0x10,0x10,0,//+
0x99
};
uchar code VAL_DEC[]=//顯示"VAL-"
{
0x7E,0x80,0x80,0x7E,0x00,//V
0xFC,0x22,0x22,0xFC,0x00,//A
0xFE,0x80,0x80,//L
0x10,0x10,0x10,0x10,0x10,0,//-
0x99
};
/**********************************************************************************************/
uchar code DISMODE[]=//顯示"DISMODE"即顯示方式設置
{
0x7F,0x41,0x41,0x3E,0x00,//D
0x7F,0x00,//I
0x26,0x49,0x49,0x32,0x00,//S
0x7F,0x02,0x04,0x02,0x7F,0x00,//M
0x3E,0x41,0x41,0x3E,0x00,//O
0x7F,0x41,0x41,0x3E,0x00,//D
0x7F,0x49,0x49,0x41,//E
0x99
};
/**********************************************************************************************/
uchar code DIS[]=//顯示"DIS."
{
0xFE,0x82,0x82,0x82,0x7C,0x00,
0x82,0xFE,0x82,0x00,
0x4C,0x92,0x92,0x92,0x64,0x00,
0xC0,0xC0,0x00,
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)//讀一個字節(DS18B20驅動)
{
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)//寫一個字節(DS18B20驅動)
{
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)//讀取溫度(DS18B20驅動)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -