日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51单片机带闹钟c语言程序,51单片机定时闹钟程序(带按键)

發(fā)布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机带闹钟c语言程序,51单片机定时闹钟程序(带按键) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

電路圖很簡單,數碼管是用2片573 接到p2口,通過p0.0 和P0.1鎖存控制,詳見單片機開發(fā)板上面的電路:http://www.51hei.com/f/51hei-5.pdf??, 大家可以按里面的圖接,只需要端口要改為本程序中的即可.可通過按鍵實現設置定時的時間.小時分秒設置等等.

//包含頭文件及宏定義//

#include

#include

#define uchar unsigned char

#define uint? unsigned int

/

繼電器響應動作指示燈//

sbit light=P1^0;

sbit int0_ok=P3^2;

sbit int1_ok=P3^3;

/數碼管的段位鎖存

sbit duan=P0^0;

sbit wei=P0^1;

uchar bit1,bit2,bit3,bit4,bit5,bit6;///小時 分鐘 秒鐘顯示碼

uchar fen=0;// 分鐘緩存

uchar miao=0;//秒緩存

uchar shi=0;//小時緩存

uchar key_temp;/按鍵暫存

//uchar key_old;

uchar key_count;//按鍵計數

uchar key_back;/按鍵備份

uchar key_data;//按鍵數值

uchar key_con;

uchar key_ok;

uchar int0_function=0;///功能0,做調節(jié)始終

uchar int1_function=0;///功能1,做運行停止用

uchar time;定時常數

uchar t2time;

#define KEYDELAY 25??? /*首鍵延遲次數*/

#define KEYLOOP 10??? /*連續(xù)鍵間隔次數,需小于KEYDELAY*/

void shanshuo(uchar aa,uchar ii);

void init();

void sign(uchar i);

毫秒級的延時

void delayms(uint i)?? //誤差 0us

{

uint c;

unsigned char a,b;

for(c=i;c>0;c--)

for(b=142;b>0;b--)

for(a=2;a>0;a--);

}

/數碼管的段位碼///

uchar code tableduan[]={??? //共陽極數碼管段碼

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8, 0x80,0x90,//0-9

//0x88,0x83,0xc6,0xa1,0x86,0x8E//A-F

0xbf//-

};

uchar code tablewei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//位碼

uchar code welcom[]={0xbf,0xbf,0xc0,0x8c,0x86,0xc8,0xbf,0xbf};//--OPEN-- 1

uchar code on[]={0xbf,0xbf,0xbf,0xc0,0xc8,0xbf,0xbf,0xbf};//---on---?????? 2

uchar code off[]={0xbf,0xbf,0xc0,0x8e,0x8e,0xbf,0xbf,0xbf};//--off---????? 3

uchar code closed[]={0xbf,0xc6,0xc7,0xc0,0x92,0x86,0xf8,0xbf};//-closed-?? 4

/數碼管顯示程序///

void display(uchar duan1,uchar wei1)

{

P2=0xff;

duan=0;

wei=0;

P2=tableduan[duan1];

duan=1;

duan=0;

P2=tablewei[wei1];

wei=1;

wei=0;

delayms(1);

}

/數碼管顯示程序///

//數碼管顯示位計算/

void jisuan()

{

bit1=shi/10;

bit2=shi%10;

bit3=fen/10;

bit4=fen%10;

bit5=miao/10;

bit6=miao%10;

/*

display(bit1,0);

display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);*/

}

//數碼管顯示位計算/

//單擊按鍵鍵值表

uchar key_data_jisuan(uchar dat)

{

uchar key;

switch(dat)

{

case 0xfb:key=1;break;

case 0xf7:key=2;break;

case 0xef:key=3;break;

case 0xdf:key=4;break;

case 0xbf:key=5;break;

case 0x7f:key=6;break;

default:key=0;break;

}

return key;

}

//長按按鍵鍵值表

/*uchar key_data_con_jisuan(uchar dat)

{

uchar key;

switch(dat)

{

case 0xef:key=5;break;

case 0xdf:key=6;break;

default:key=0;break;

}

return key;

}

*/

/鍵盤掃描//

void key_scan()

{

P3=0xff;

if((P3&0xff)!=0xff)

{

delayms(10);

key_temp=P3;

if(key_temp==key_back)

{

delayms(10);

key_count++;

if (key_count==KEYDELAY)??????????????? //連續(xù)鍵,不要則把此if屏蔽

{

key_ok=0;

key_data=key_data_jisuan(key_temp);??? //鍵*

key_count=KEYDELAY-KEYLOOP;

}

}

else

{

key_count=0;

key_back=key_temp;

}

//key_ok=1;

}

else

{

if(key_count)

{

key_count=0;

key_data=key_data_jisuan(key_temp);

}

key_temp=0;

key_ok=1;

}

}

/定時器0的初始化///

void InitTimer0(void)

{

TMOD = 0x01;

TH0 = 0x3C;

TL0 = 0x0B0;

ET0 = 1;

//TR0 = 1;

//EA = 1;

}

void InitTimer1(void)

{

TMOD = 0x10;

TH1 = 0x3C;

TL1 = 0x0B0;

EA = 1;

// ET1 = 1;

// TR1 = 1;

}

主函數開始///

void main()

{

uchar ss;

InitTimer0();

// InitTimer1();

while(1)

{

key_scan();

if(key_data==1)

{

key_data=0;

int0_function++;

if(int0_function==5)

{

int1_function=0;

ss=0;

int0_function=1;

}

}

if(key_data==2)

{

key_data=0;

int1_function++;

if(int1_function>=3)int1_function=1;

}

if(int0_function==0)

{

sign(1);

}

小時設定///

if(int0_function==1)

{

TR0 = 0;

EA = 0;

// ET1 = 1;

// TR1 = 1;

light=1;

// shanshuo(0,1);

if(key_data==3)

{

key_data=0;

shi++;if(shi==24)shi=0;

}

if(key_data==4)

{

key_data=0;

shi--;if(shi==0)shi=23;

}

jisuan();

shanshuo(0,1);

for(ss=10;ss>0;ss--)

{

display(bit1,0);

display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);

}

for(ss=10;ss>0;ss--)

{

// display(bit1,0);

// display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);

}

}

/分鐘設定/

if(int0_function==2)

{

TR0 = 0;

EA = 0;

// ET1 = 1;

// TR1 = 1;

light=1;

if(key_data==3)

{

key_data=0;

fen++;if(fen==60)fen=0;

}

if(key_data==4)

{

key_data=0;

fen--;if(fen==0)fen=59;

}

jisuan();

// shanshuo(0,2);

for(ss=10;ss>0;ss--)

{

display(bit1,0);

display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);

}

for(ss=10;ss>0;ss--)

{

display(bit1,0);

display(bit2,1);

display(10,2);

// display(bit3,3);

// display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);

}

}

//秒數設定

if(int0_function==3)

{

TR0 = 0;

EA = 0;

// ET1 = 1;

// TR1 = 1;

light=1;

if(key_data==3)

{

key_data=0;

miao++;if(miao==60)miao=0;

}

if(key_data==4)

{

key_data=0;

miao--;if(miao==0)miao=59;

}

jisuan();

// shanshuo(0,3);

for(ss=10;ss>0;ss--)

{

display(bit1,0);

display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);

}

for(ss=10;ss>0;ss--)

{

display(bit1,0);

display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

// display(bit5,6);

// display(bit6,7);

}

}

if(int0_function==4)

{

display(bit1,0);

display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);

}

//if(int0_function==6)

//{

// sign(6);

//}

///計時開始/

if(int1_function==1)

{

TR0 = 1;

EA = 1;

int0_function=4;

// ET1 = 0;

// TR1 = 0;

if((shi==0)&&(fen==0)&&(miao==0))

{

light=0;

}

jisuan();

shanshuo(0,0);

}

計時結束,關掉定時器和繼電器/

if(int1_function==2)

{

TR0 = 0;

EA = 0;

// ET1 = 1;

// TR1 = 1;

light=1;

int0_function=0;

int1_function=0;

jisuan();

sign(4);

}

// jisuan();

//shanshuo(0,0);

}

}

/定時器0的中斷服務///

void Timer0Interrupt(void) interrupt 1

{

TH0 = 0x3C;

TL0 = 0x0B0;

//add your code here!

time++;

if(time==20)

{

time=0;

if(miao>0)miao--;

if((miao==0)&&(fen>0)){miao=59;fen--;}

if((fen==0)&&(shi>0)){fen=59;shi--;}

}

}

void Timer1Interrupt(void) interrupt 3

{

TH1 = 0x3C;

TL1 = 0x0B0;

//add your code here!

t2time++;

if(t2time==20)t2time=0;

}

void shanshuo(uchar aa,uchar i)///如果i=1 是小時閃爍 ,如果i=2 是 分鐘閃爍,如果i=3 是秒鐘閃爍

{

//uchar i;//閃爍頻率

if(aa==4|aa==0)

{

for(i;i>0;i--)

{

display(bit1,0);

display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);

}

}

if(aa==1)

{

for(i;i>0;i--)

{

// display(bit1,0);

// display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);

}

}

if(aa==2)

{

for(i;i>0;i--)

{

display(bit1,0);

display(bit2,1);

display(10,2);

// display(bit3,3);

// display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);

}

}

if(aa==3)

{

for(i;i>0;i--)

{

display(bit1,0);

display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

// display(bit5,6);

// display(bit6,7);

}

}

for(i;i>0;i--)

{

display(bit1,0);

display(bit2,1);

display(10,2);

display(bit3,3);

display(bit4,4);

display(10,5);

display(bit5,6);

display(bit6,7);

}

}

/閃爍程序/

void sign(uchar i )// 1, 顯示open,顯示on 3,顯示off 4,顯示 closed

{

uchar bb;

if(i==0)

{

P2=0x00;

P0=0x03;

}

if(i==1)

{

for(bb=0;bb<8;bb++)

{

P2=0xff;

duan=0;

wei=0;

P2=welcom[bb];

duan=1;

//delayms(1);

duan=0;

P2=tablewei[bb];

wei=1;

//delayms(1);

wei=0;

delayms(1);

}

}

if(i==2)

{

for(bb=0;bb<8;bb++)

{

P2=0xff;

duan=0;

wei=0;

P2=on[bb];

duan=1;

//delayms(1);

duan=0;

P2=tablewei[bb];

wei=1;

//delayms(1);

wei=0;

delayms(1);

}

}

if(i==3)

{

for(bb=0;bb<8;bb++)

{

P2=0xff;

duan=0;

wei=0;

P2=off[bb];

duan=1;

//delayms(1);

duan=0;

P2=tablewei[bb];

wei=1;

//delayms(1);

wei=0;

delayms(1);

}

}

if(i==4|i==0)

{

for(bb=0;bb<8;bb++)

{

P2=0xff;

duan=0;

wei=0;

P2=closed[bb];

duan=1;

//delayms(1);

duan=0;

P2=tablewei[bb];

wei=1;

//delayms(1);

wei=0;

delayms(1);

}

}

}

總結

以上是生活随笔為你收集整理的51单片机带闹钟c语言程序,51单片机定时闹钟程序(带按键)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。