萬年歷實物圖單片機溫濕度單片機語音(電子萬年歷表)
單片機萬年歷中的問題(附圖)
排阻,外部上拉用的,提高單片機驅動能力,一般P0口做驅動才需要上拉,它內部沒有上拉電阻
求個用單片機c語言實現的萬年歷
/*============================================================
使用1602液晶顯示DS1302+S51時鐘+溫度顯示
==============================================================
//更新歷史:增添溫度顯示,調整時閃動。
// 增添零下溫度顯示
SMC1602A(16*2)模擬口線接線方式
連接線圖:
---------------------------------------------------
|LCM-----51 | LCM-----51 | LCM------51 |
---------------------------------------------|
|DB0-----P1、0 | DB4-----P1、4 | RS-------P2、0 |
|DB1-----P1、1 | DB5-----P1、5 | RW-------P2、1 |
|DB2-----P1、2 | DB6-----P1、6 | E--------P2、2 |
|DB3-----P1、3 | DB7-----P1、7 | VLCD接1K電阻到GND|
---------------------------------------------------
DS1302 接線圖
Vcc2 CLK I/O /RST
| | | |
--------------
| 8 7 6 5|
| DS1302 |
| |
| 1 2 3 4|
--------------
| | | |
VCC1 GND
1 腳接+5V 2,3腳32768HZ晶振 4腳接地 5腳接S51的P02 6腳接S51的P01 7接S51的P00
8腳接後備電源,可以接老計算機主板上的3、6V電池,也可Yi經過二級管隔離接一個大容量電解電容
電壓在2、5V以上即可維持
按鍵說明:1、 共三個鍵,低電平有效
2、 P04 和 P05 同時按:初始化
3、 P06 端口按鍵:選擇要調整的項目
4、 P05 端口按鍵:增添;P04端口按鍵:減少
[註:AT89S51使用12M晶振]
=============================================================*/
/*#include <AT89x51、h>*/
#include <REGX51、H>
#include <string。h>
#include<intrins。h>
#define LCM_RS P2_0 //定義引腳
#define LCM_RW P2_1
#define LCM_E P2_2
#define LCM_Data P0
#define Busy 0x80 //用於檢測LCM狀態字中的Busy標識
#define uchar unsigned char
uchar id,timecount;
bit flag,sflag; //flag是時鐘冒號閃爍標志,sflag是溫度負號顯示標志
void Disp_line1(void); //顯示屏幕第1行
void Disp_line2(void); //顯示屏幕第2行
void id_case1_key();
//*********** DS1302 時間顯示定義部分
sbit T_CLK=P1^0;
sbit T_IO =P1^1;
sbit T_RST=P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void Set(uchar,uchar); //依據選擇調整相應項目
void RTInputByte(uchar); /* 輸入 1Byte */
uchar RTOutputByte(void); /* 輸出 1Byte */
void W1302(uchar, uchar); // 向DS1302寫入一個字節
uchar R1302(uchar); // 從DS1302讀出一個字節
void Set1302(unsigned char * ); // 設置時間
bit sec,min,hour,year,mon,day,weekk; //閃爍標志位
//初始化後設置為:04年12月2日星期4 0點0分0秒
unsigned char inittime⓻={0x00,0x00,0x00,0x02,0x12,0x04,0x04};
// 秒 分鐘 小時 日 月 年 星期
//***** 18B20溫度顯示定義部分
sbit DQ=P3^3; //18B20 接P07口
typedef unsigned char byte;
typedef unsigned int word;
Read_Temperature(char,char);
void mychar(void);
void adjust_res(char res); //res 分別等於 0x1f, 0x3f, 0x5f 溫度讀數分辨率分別對應
// 0。5, 0。25, 0。125
//******* 1602LCD驅動 **********************************************************
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
unsigned char code week[]={"Week。"};
void main(void)
{
Delay400Ms(); //啟動等待,等LCM講入工作狀態
LCMInit(); //LCM初始化
Delay5Ms(); //延時片刻(可不要)
mychar(); //顯示自定義字符
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
TR0=1;
ET0=1;
W1302(0x90,0xa5);//打開充電二級管 一個二級管串聯一個2K電阻
W1302(0x8e,0x80);//寫保護,禁止寫操作
adjust_res(0x1f); //調整18B20的分辨率 0x1f:0。5; 0x3f:0。25; 0x5f:0。125
while(1)
{
if ((P1_4|P1_5)==0) //初始化
{
Delay5Ms();
if ((P1_4|P1_5)==0) Set1302(inittime);
}
if (P1_6==0) // 設置和選擇項目鍵
{
Delay5Ms();
if(P1_6==0){id++;if(id>7) id=0;}
while(P1_6==0);
}
switch(id)
{
case 0:
sec=0;
Disp_line1(); Disp_line2();
break;
case 1://年
year=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 2://月
year=0;mon=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 3://日
mon=0;day=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 4://星期
day=0;weekk=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 5://小時
weekk=0;hour=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 6://分鐘
hour=0;min=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 7://秒
min=0;sec=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
}
}
}
//中斷入口,冒號閃爍
void t0(void) interrupt 1 using 0
{
TH0=(65535-50000)/256; //50ms定時
TL0=(65535-50000)%256;
timecount++;
if(timecount>9)
{
timecount=0;
flag=~flag;
}
}
//id為1時的下一級選擇
void id_case1_key()
{
if (P1_5==0) //增添
{
Delay5Ms();
if(P1_5==0) Set(id,0);
if(id!=7) while(P1_5==0);
}
if (P1_4==0) //減少
{
Delay5Ms();
if(P1_4==0) Set(id,1);
if(id!=7) while(P1_4==0);
}
}
//依據選擇調整相應項目並寫入DS1302
void Set(uchar sel,uchar sel_1)
{
signed char address,item;
signed char max,mini;
if(sel==7) {address=0x80; max=0;mini=0;} //秒
if(sel==6) {address=0x82; max=59;mini=0;} //分鐘
if(sel==5) {address=0x84; max=23;mini=0;} //小時
if(sel==3) {address=0x86; max=31;mini=1;} //日
if(sel==2) {address=0x88; max=12;mini=1;} //月
if(sel==1) {address=0x8c; max=99;mini=0;} //年
if(sel==4) {address=0x8a; max=7; mini=1;} //星期
item=R1302(address+1)/16*10+R1302(address+1)%16;
if (sel_1==0) item++; else item--;
if(item>max) item=mini;
if(item<mini) item=max;
W1302(0x8e,0x00);//允許寫操作
W1302(address,item/10*16+item%10);
W1302(0x8e,0x80);//寫保護,禁止寫操作
}
//屏幕顯示第1行 時間和溫度
void Disp_line1(void)
{
Read_Temperature(10,0); //溫度顯示
//冒號閃爍
if(flag==0)
{DisplayOneChar(3,0,0x3a); DisplayOneChar(6,0,0x3a);}
else
{DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20);}
if(sec==1) //秒閃爍標志位
{
if(flag==1)
{
DisplayOneChar(7,0,R1302(0x81)/16+0x30); //顯示秒
DisplayOneChar(8,0,R1302(0x81)%16+0x30);
}
else
{
DisplayOneChar(7,0,0x20); //顯示秒
DisplayOneChar(8,0,0x20);
}
}
else
{
DisplayOneChar(7,0,R1302(0x81)/16+0x30); //顯示秒
DisplayOneChar(8,0,R1302(0x81)%16+0x30);
}
if(min==1) //分鐘閃爍標志位
{
if(flag==1)
{
DisplayOneChar(4,0,R1302(0x83)/16+0x30); //顯示分鐘
DisplayOneChar(5,0,R1302(0x83)%16+0x30);
}
else
{
DisplayOneChar(4,0,0x20); //顯示分鐘
DisplayOneChar(5,0,0x20);
}
}
else
{
DisplayOneChar(4,0,R1302(0x83)/16+0x30); //顯示分鐘
DisplayOneChar(5,0,R1302(0x83)%16+0x30);
}
if(hour==1) //小時閃爍標志位
{
if(flag==1)
{
DisplayOneChar(1,0,R1302(0x85)/16+0x30);//顯示小時
DisplayOneChar(2,0,R1302(0x85)%16+0x30);
}
else
{
DisplayOneChar(1,0,0x20); //顯示小時
DisplayOneChar(2,0,0x20);
}
}
else
{
DisplayOneChar(1,0,R1302(0x85)/16+0x30);//顯示小時
DisplayOneChar(2,0,R1302(0x85)%16+0x30);
}
}
// 屏幕顯示第2行 日期和星期
void Disp_line2(void)
{
DisplayOneChar(3,1,0x2f); //顯示固定字符
DisplayOneChar(6,1,0x2f);
DisplayListChar(10,1,week);
if(year==1) //年閃爍標志位
{
if(flag==1)
{
DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//顯示年
DisplayOneChar(2,1,R1302(0x8d)%16+0x30);
}
else
{
DisplayOneChar(1,1,0x20); //顯示年
DisplayOneChar(2,1,0x20);
}
}
else
{
DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//顯示年
DisplayOneChar(2,1,R1302(0x8d)%16+0x30);
}
if(mon==1) //月閃爍標志位
{
if(flag==1)
{
DisplayOneChar(4,1,R1302(0x89)/16+0x30);//顯示月
DisplayOneChar(5,1,R1302(0x89)%16+0x30);
}
else
{
DisplayOneChar(4,1,0x20); //顯示月
DisplayOneChar(5,1,0x20);
}
}
else
{
DisplayOneChar(4,1,R1302(0x89)/16+0x30);//顯示月
DisplayOneChar(5,1,R1302(0x89)%16+0x30);
}
if(day==1) //日閃爍標志位
{
if(flag==1)
{
DisplayOneChar(7,1,R1302(0x87)/16+0x30);//顯示日
DisplayOneChar(8,1,R1302(0x87)%16+0x30);
}
else
{
DisplayOneChar(7,1,0x20); //顯示日
DisplayOneChar(8,1,0x20);
}
}
else
{
DisplayOneChar(7,1,R1302(0x87)/16+0x30);//顯示日
DisplayOneChar(8,1,R1302(0x87)%16+0x30);
}
if(weekk==1) //星期閃爍標志位
{
if(flag==1)
{
DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//顯示星期
}
else
{
DisplayOneChar(15,1,0x20); //顯示星期
}
}
else
{
DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//顯示星期
}
}
//********* LCM1602驅動流程 ***************
//寫數據
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高能在這後加小的延時
LCM_E = 0; //延時
LCM_E = 1;
}
//寫指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽視忙檢測
{
if (BuysC) ReadStatusLCM(); //依據需要檢測忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
//讀狀態
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //檢測忙信號
return(LCM_Data);
}
//LCM初始化
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
WriteCommandLCM(0x08,1); //關閉顯示
WriteCommandLCM(0x01,1); //顯示清屏
WriteCommandLCM(0x06,1); // 顯示光標移動設置
WriteCommandLCM(0x0C,1); // 顯示開及光標設置
}
//按指定位置顯示一個字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大於15,Y不能大於1
if (Y) X |= 0x40; //當要顯示第2行時地址碼+0x40;
X |= 0x80; //算出指令碼
WriteCommandLCM(X, 0); //這裡不檢測忙信號,發送地址碼
WriteDataLCM(DData);
}
//按指定位置顯示一串字符 ***原來的遇見空格0x20就不顯示***
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength,j;
ListLength = strlen(DData);
Y &= 0x1;
X &= 0xF; //限制X不能大於15,Y不能大於1
if (X <= 0xF) //X坐標應小於0xF
{
for(j=0;j<ListLength;j++)
{
DisplayOneChar(X, Y, DData[j]); //顯示單個字符
X++;
}
}
}
//5ms延時
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延時
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
51單片機萬年歷制作C語言的,要有完整的流程和電路圖,流程中最好有詳細。。。
我可以幫助你,哈哈
需要就聯系我
基於51單片機制作萬年歷,用數碼管,定時器,不用時鐘芯片,不用液晶,怎 。。。
基於51單片機制作萬年歷,用兩個8位一體的共陰數碼管,顯示日期和時間。數碼管位選用兩片74HC138,便於動態掃描顯示,又節省引腳。用3個按鍵調時,K1為選擇調時狀態,K2為加1鍵,K3為減1鍵。
仿真圖如下:
基於51單片機,DS1302,1602實現萬年歷(年月日時分秒)及鬧鐘功能的C流程。。。
【八】電子表、萬年歷系列
⓵單片機公交車環境監測及時間顯示系統
功能描述:
1。按鍵調時間
2。帶備用電池(斷電繼續走時)
3。監測噪聲和溫濕度並實時顯示
4。超過報警值蜂鳴器會響
☆已作出的實物優酷視頻演示地址:
http://v。youku。com/v_show/id_XMT三OTMxMDUwMA==。html
⓶單片機語音報時電子表
功能描述:
1。按鍵調試設置鬧鐘
2。帶備用電池(斷電繼續走時)
3。整點語音報時
☆已作出的實物優酷視頻演示地址:
http://v。youku。com/v_show/id_XMT三OTMwMjM0OA==。html
⓷單片機紅外遙控電子表語音報時語音播報溫濕度
功能描述:
1。紅外遙控調時間設定鬧鐘
2。帶備用電池(斷電繼續走時)
3。整點語音報時語音播報溫濕度
4。按鍵遙控語音報時語音播報溫濕度
☆已作出的實物優酷視頻演示地址:
http://v。youku。com/v_show/id_XMT三OTMxMTUyOA==。html
⓸單片機紅外遙控電子表語音報時格林威治時間雙顯示
功能描述:
1。紅外遙控調時間設定鬧鐘
2。帶備用電池(斷電繼續走時)
3。整點語音報時語音播報溫濕度
4。按鍵遙控語音報時語音播報溫濕度
☆已作出的實物優酷視頻演示地址:
http://v。youku。com/v_show/id_XMT三OTMxMTUyOA==。html
⓹單片機多功能萬年歷電子表系統節日提醒溫濕度顯示
功能描述:
1。按鍵調時間,設置鬧鐘
2。帶備用電池(斷電繼續走時)
3。陽歷、陰歷節日提醒;可顯示上午、中午、晚上、午夜、深夜等時間段
4。溫濕度實時顯示(可替換其他傳感器數據顯示)
5。功能擴展:語音播報萬年歷、溫濕度等。(此項功能為擴展功能,需要需補差價)
☆已作出的實物優酷視頻演示地址:
http://v。youku。com/v_show/id_XMTU0MjI4OTExNg==。html
【二十】GPS授時定位系統系列
⓵GPS自動授時系統 語音報時/播報溫濕度
實現功能:
1、可設置授時模式為自動授時和手動更新
2、可脫離GPS數據利用本地時鐘芯片準確走時
3、可設置靜音模式、整點報時和自動語音播報溫濕度及其混合模式等四種語音工作模式
4、可以切換顯示本地時間和溫濕度數據和GPS衛星時間數據和定位數據
5、經過剖析GPS數據,利用算法縮短瞭解析時間在秒級時間內就能取得到GPS時間數據(多數情況下,完成定位需要幾分鐘以上)
6、(亮點)利用算法自動計算星期參數和陰歷參數,流程內部算法輸入任何陽歷日期數據即可得到準確的星期數據和陰歷數據
7、利用12864串口工作模式,節省瞭8個IO
8、可依據需求進行功能定制
☆已作出的實物優酷視頻演示地址:
http://v。youku。com/v_show/id_XMjUzMzcyNTkyOA==。html
基於51單片機的多功能萬年歷設計,要求不使用如ds1302的時鐘芯片,與用時。。。
哪應該使用單片機內部的定時器來設計啊,不 過,斷電後要重新設置而已,並且,時鐘未必那麼準備而已。