導航:首頁 > 操作系統 > 單片機給24秒錶增加警示功能

單片機給24秒錶增加警示功能

發布時間:2025-03-02 20:48:08

單片機led數碼管實驗

單片機led數碼管 秒錶模擬實例,很簡單的,可以參考一下,

#include<reg52.h> //秒錶程序

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar ,shi;

uint a1,a2;

sbit D1=P3^0;

sbit D2=P3^1;

sbit D3=P3^2;

sbit D4=P3^3;

sbit key=P3^5;

sbit key1=P3^7;

bit j ;

uint y ;

void main()

{

TMOD=0x01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

EA=1;

ET0=1;

TR0=1;

=0;

shi=0;

while(1)

{

if(key==0)

{

j=0;

}

if(key1==0)

{

j=1; a2=0;

}

}

}

void timer0()interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

a1++;

y++;

if(a1==100)

{

a1=0;

if(j==1) a2++;

if(a2>=10000) a2=0;

}

D1 = 1; D2 = 1; D3 = 1; D4 = 1;

if(y==1)

{

P1=table[a2%10000/1000];

D4=0;

}

if(y==2)

{

P1=table[a2%1000/100];

D3=0;

}

if(y==3)

{

P1=table[a2%100/10];

D2=0;

}

if(y==4)

{

P1=table[a2%10];

D1=0;

y=0;

}

}

㈡ 單片機編程製作電子秒錶能顯示分(0-99),秒(0-59)

你好
樓主。
很幸運的看到你的問題。
但是又很遺憾到現在還沒有人回答你的問題。也可能你現在已經在別的地方找到了答案,那就得恭喜你啦。
對於你的問題我愛莫能助!
可能是你問的問題有些專業了。或者別人沒有遇到或者接觸過你的問題,所以幫不了你。建議你去問題的相關論壇去求助,那裡的人通常比較多,也比較熱心,可能能快點幫你解決問題。
希望我的回答也能夠幫到你!
祝你好運。
快過年了,
最後祝您全家幸福健康快樂每一天!

㈢ 51單片機 秒錶設計

// 51單片機 秒錶,顯示時間為0000—9999秒,啟動、停止,(停止後再次啟動復位)

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar ,shi;

uint a1,a2;

sbit D1=P3^0;

sbit D2=P3^1;

sbit D3=P3^2;

sbit D4=P3^3;

sbit key=P3^5;

sbit key1=P3^7;

bit j ;

uint y ;

void main()

{

TMOD=0x01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

EA=1;

ET0=1;

TR0=1;

=0;

shi=0;

while(1)

{

if(key==0)

{

j=0;

}

if(key1==0)

{

j=1; a2=0;

}

}

}

void timer0()interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

a1++;

y++;

if(a1==100)

{

a1=0;

if(j==1) a2++;

if(a2>=10000) a2=0;

}

D1 = 1; D2 = 1; D3 = 1; D4 = 1;

if(y==1)

{

P1=table[a2%10000/1000];

D4=0;

}

if(y==2)

{

P1=table[a2%1000/100];

D3=0;

}

if(y==3)

{

P1=table[a2%100/10];

D2=0;

}

if(y==4)

{

P1=table[a2%10];

D1=0;

y=0;

}

}

㈣ 跪求單片機c51一個多功能時鍾設計。要鬧鍾。調整時間、秒錶、就行了。急求。。。C語言編寫

//給你發一個數碼管輸出的可調節時鍾的程序,<DS1302.H>在最後
#include <at89x52.h>
#include <DS1302.h>
//定義共陽極字型碼0123456789-
unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char time[]={0,0,0,0,0,0,0,0};//用來儲存時間
unsigned char date[]={0,0,0,0,0,0,0,0};//用來儲存日期
SYSTEMTIME time1; //在ds1302.h文件中已經定義了一個名字為SYSTEMTIME的結構體,在這里我們定義一個變數名
//為time的SYSTEMTIME結構體
void delay(unsigned char i) //延時子程序
{
unsigned char j;
while((i--)!=0)
{
for(j=123;j>0;j--);
}
}
unsigned char button_time(n,x,y) //時鍾調整子程序
unsigned char n,x,y;
{
if(P1_7==0)
{
delay(50);
if(P1_7==0)
{
n++;
if(n==x)
n=0;
while(P1_7==0);
}
}

if(P1_5==0)
{
delay(50);
if(P1_5==0)
{
if(n==0)
n=y;
else
n--;
while(P1_5==0);
}
}
return n;
}

unsigned char button_date(n,x,y) //日期調整子程序
unsigned char n,x,y;
{
if(P1_7==0)
{
delay(50);
if(P1_7==0)
{
n++;
if(n==x)
n=1;
while(P1_7==0);
}
}

if(P1_5==0)
{
delay(50);
if(P1_5==0)
{
if(n==1)
n=y;
else
n--;
while(P1_5==0);
}
}
return n;
}

void display(second10,second1,minute10,minute1,hour10,hour1) //顯示子程序
unsigned char second10,second1,minute10,minute1,hour10,hour1;
{
P2=0xfe;
P0=dispcode[second10];//顯示秒的十位
delay(1);

P2=0xfd;
P0=dispcode[second1]; //顯示秒的個位
delay(1);

P2=0xfb;
P0=dispcode[10]; //顯示"-"
delay(1);

P2=0xf7;
P0=dispcode[minute10];//顯示分的十位
delay(1);

P2=0xef;
P0=dispcode[minute1]; //顯示分的個位
delay(1);

P2=0xdf;
P0=dispcode[10]; //顯示"-"
delay(1);

P2=0xbf;
P0=dispcode[hour10]; //顯示時的十位
delay(1);

P2=0x7f;
P0=dispcode[hour1]; //顯示時的個位
delay(1);
}

void main()
{
unsigned char flag;
Initial_DS1302(); //初始化DS1302這個時鍾晶元,
while(1)
{
DS1302_GetTime(&time1); //讀取時間參數
time[5]=(time1.Second)%10; //把秒的個位數據存入time[5]
time[4]=(time1.Second)/10; //把秒的十位數據存入time[4]
time[3]=(time1.Minute)%10; //把分的個位數據存入time[3]
time[2]=(time1.Minute)/10; //把分的十位數據存入time[2]
time[1]=(time1.Hour)%10; //把時的個位數據存入time[1]
time[0]=(time1.Hour)/10; //把時的十位數據存入time[0]
date[5]=(time1.Day)%10;
date[4]=(time1.Day)/10;
date[3]=(time1.Month)%10;
date[2]=(time1.Month)/10;
date[1]=(time1.Year)%10;
date[0]=(time1.Year)/10;

if(P1_4==0) //如果按下Time Start鍵一下,時鍾開始正常顯示時間,再按一下,顯示日期
{
delay(50);
if(P1_4==0)
{
flag++;
if(flag>1)
{
flag=0;
}
}
while(P1_4==0);
}
if(P1_6==0) //如果按下Time Set鍵一下,開始顯示日期,再按一下進入日期跟時鍾的調節模式
{
delay(50);
if(P1_6==0)
{
flag++;
if(flag>7)
{
flag=0;
}
}
while(P1_6==0);
}

switch(flag)
{
case 0:display(time[0],time[1],time[2],time[3],time[4],time[5]); //調用子函數display,把存入數組time的數據給顯示出來
break;

case 1:display(date[0],date[1],date[2],date[3],date[4],date[5]); //調用子函數display,把存入數組date的數據給顯示出來
break;

case 2:time1.Year=button_date(time1.Year,100,99); //調整年
DS1302_SetTime(0x8c,time1.Year);
display(date[0],date[1],10,10,10,10);
break;

case 3:time1.Month=button_date(time1.Month,13,12); //調整月
DS1302_SetTime(0x88,time1.Month);
display(10,10,date[2],date[3],10,10);
break;

case 4:time1.Day=button_date(time1.Day,32,31); //調整日
DS1302_SetTime(0x86,time1.Day);
display(10,10,10,10,date[4],date[5]);
break;

case 5:time1.Hour=button_time(time1.Hour,24,23); //調整時
DS1302_SetTime(0x84,time1.Hour);
display(time[0],time[1],10,10,10,10);
break;

case 6:time1.Minute=button_time(time1.Minute,60,59); //調整分
DS1302_SetTime(0x82,time1.Minute);
display(10,10,time[2],time[3],10,10);
break;

case 7:time1.Second=button_time(time1.Second,60,59); //調整秒
DS1302_SetTime(0x80,time1.Second);
display(10,10,10,10,time[4],time[5]);
break;
}
}
}
//DS1302.H

#ifndef _REAL_TIMER_DS1302_2003_7_21_
#define _REAL_TIMER_DS1302_2003_7_21_
#include <at89x52.h>
sbit DS1302_CLK = P1^0; //實時時鍾時鍾線引腳
sbit DS1302_IO = P1^1; //實時時鍾數據線引腳
sbit DS1302_RST = P1^2; //實時時鍾復位線引腳
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

typedef struct __SYSTEMTIME__
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[9];
unsigned char TimeString[9];
}SYSTEMTIME; //定義的時間類型

#define AM(X) X
#define PM(X) (X+12) // 轉成24小時制
#define DS1302_SECOND 0x80 //秒寄存器
#define DS1302_MINUTE 0x82 //分寄存器
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_RAM(X) (0xC0+(X)*2) //用於計算 DS1302_RAM 地址的宏

void DS1302InputByte(unsigned char d) //實時時鍾寫入一位元組(內部函數)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; //相當於匯編中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0; //發一個高跳變到低的脈沖
ACC = ACC >> 1;
}
}

unsigned char DS1302OutputByte(void) //實時時鍾讀取一位元組(內部函數)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相當於匯編中的 RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0; //發一個高跳變到低的脈沖
}
return(ACC);
}

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要寫的數據
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 寫1Byte數據
DS1302_CLK = 1;
DS1302_RST = 0; //RST 0->1->0,CLK 0->1
}

unsigned char Read1302(unsigned char ucAddr) //讀取DS1302某地址的數據
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1; //enable
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 讀1Byte數據
DS1302_CLK = 1; //RST 0->1->0,CLK 0->1
DS1302_RST = 0;
return(ucData);
}

void DS1302_SetProtect(bit flag) //是否防寫
{
if(flag)
Write1302(0x8E,0x10); //WP=1,不能寫入
else
Write1302(0x8E,0x00);//WP=0,可以寫入
}

void DS1302_SetTime(unsigned char Address, unsigned char Value) // 設置時間函數
{
DS1302_SetProtect(0);
Write1302(Address, ((Value/10)<<4 | (Value%10))); //高4位為十位,低4位為個位
}

void DS1302_GetTime(SYSTEMTIME *Time)
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//轉換成10進制的秒
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F);
}
/*
void DateToStr(SYSTEMTIME *Time)
{
Time->DateString[0] = Time->Year/10 + '0'; //數字類型轉化為字元類型
Time->DateString[1] = Time->Year%10 + '0';
Time->DateString[2] = '-';
Time->DateString[3] = Time->Month/10 + '0';
Time->DateString[4] = Time->Month%10 + '0';
Time->DateString[5] = '-';
Time->DateString[6] = Time->Day/10 + '0';
Time->DateString[7] = Time->Day%10 + '0';
Time->DateString[8] = '\0';
}

void TimeToStr(SYSTEMTIME *Time)
{
Time->TimeString[0] = Time->Hour/10 + '0'; //數字類型轉化為字元類型
Time->TimeString[1] = Time->Hour%10 + '0';
Time->TimeString[2] = ':';
Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';
Time->DateString[8] = '\0';
}
*/
void Initial_DS1302(void)
{
unsigned char Second=Read1302(DS1302_SECOND);
if(Second&0x80) //如果第七為1(表明沒有啟動), 則啟動時鍾
DS1302_SetTime(DS1302_SECOND,0);
}

/********************************************************************************
void BurstWrite1302(unsigned char *pWClock) //往DS1302寫入時鍾數據(多位元組方式)
{
unsigned char i;
Write1302(0x8e,0x00); // 控制命令,WP=0,寫操作?
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(0xbe); // 0xbe:時鍾多位元組寫命令
for (i = 8; i>0; i--) //8Byte = 7Byte 時鍾數據 + 1Byte 控制
{
DS1302InputByte(*pWClock); // 寫1Byte數據
pWClock++;
}
DS1302_CLK = 1;
DS1302_RST = 0;
}

void BurstRead1302(unsigned char *pRClock) //讀取DS1302時鍾數據(時鍾多位元組方式)
{
unsigned char i;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(0xbf); // 0xbf:時鍾多位元組讀命令
for (i=8; i>0; i--)
{
*pRClock = DS1302OutputByte(); // 讀1Byte數據
pRClock++;
}
DS1302_CLK = 1;
DS1302_RST = 0;
}

void DS1302_TimeStop(bit flag) // 是否將時鍾停止
{
unsigned char Data;
Data=Read1302(DS1302_SECOND);
DS1302_SetProtect(0);
if(flag)
Write1302(DS1302_SECOND, Data|0x80);//停止
else
Write1302(DS1302_SECOND, Data&0x7F);不停止
}
********************************************************************************/
#endif

㈤ 51單片機能DIY哪些小東西

51單片機能DIY:
1.
多功能時鍾,秒錶,報警器,計數器,紅外門禁檢測,密碼門;
2.
計算器,能想到的東西都可以啊,還有溫濕度等付感器相關的;
3.
或者電壓表,電流表,測電阻的,測電容電感的,無線通信類的東西,或者電源逆變之類的;
4.
還有機械控制電機之類的。

㈥ 51單片機秒錶設計,高手請進

基於89C51單片機的電子秒錶設計,需要藉助外部晶振和復位電路,搭配兩個數碼管與兩個按鍵。系統通過按鍵控制秒錶的啟動和停止,以及設定倒計時時間(例如10秒、20秒或60秒),啟動倒計時功能。用戶可以通過按鍵選擇這兩種功能之一。程序代碼主要分為兩部分,分別對應秒錶計時和倒計時功能。秒錶計時部分,當按下啟動按鈕時,程序進入計時循環,每10毫秒更新一次顯示,直到再次按下停止按鈕。倒計時功能則在設定時間內遞減,同樣通過按鍵切換。程序中還包含一個延時子函數,用於確保顯示的穩定性和准確性。

具體實現細節如下:在主程序中,首先設置P3和P0口為高電平,清除F0和F1標志位。通過檢測P3.6和P3.7引腳的狀態,分別控制秒錶計時和倒計時功能的啟動。秒錶計時部分,循環更新時間並顯示在數碼管上,倒計時部分則遞減預設時間並顯示。在每個循環中,通過延時子函數確保操作的准確性。

延時子函數用於處理程序中的時間延遲,確保數碼管的顯示效果。程序中還包含一個數表,用於將十進制數轉換為BCD碼,進而顯示在數碼管上。通過不斷調整和優化,可以實現更穩定和准確的電子秒錶設計。

整個設計的核心在於程序代碼的編寫和調試,確保按鍵操作的響應性,以及顯示的准確性和穩定性。通過合理設置晶振頻率和延時時間,可以實現精確的時間測量和顯示功能。

在實際應用中,可以根據需求進一步優化程序,例如增加更多的功能或改進用戶界面。此外,還可以通過外部擴展提高系統的穩定性和可靠性,例如使用更高質量的晶振和更好的復位電路。

總之,基於89C51單片機的電子秒錶設計是一個功能強大且實用的項目,適用於多種應用場景,從簡單的計時到復雜的倒計時功能,都能輕松實現。

閱讀全文

與單片機給24秒錶增加警示功能相關的資料

熱點內容
加密貨幣泡沫的危害 瀏覽:461
雲視訊注冊狀態伺服器錯誤801 瀏覽:852
python中刪除csv 瀏覽:591
oracle創建表空間命令 瀏覽:14
十塊錢五分鍾的解壓人偶 瀏覽:934
學android看什麼書 瀏覽:376
網路加密了手機上怎樣顯示 瀏覽:805
文章被以什麼形式存放在伺服器中 瀏覽:708
炮兵命令 瀏覽:116
網商園app怎麼樣啊 瀏覽:325
app字體大小怎麼設置在哪 瀏覽:432
華為app選擇網路模式哪裡找 瀏覽:321
策劃優化伺服器是什麼 瀏覽:238
聯想的組織伺服器怎麼連接 瀏覽:218
程序員千里貴州頭條 瀏覽:672
阿里雲伺服器199一年 瀏覽:688
支點app裡面有幣怎麼辦 瀏覽:65
程序員ps 瀏覽:720
滴滴app順風車怎麼更換車輛信息 瀏覽:22
胡萊三國怎麼更換伺服器 瀏覽:816