亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
電子鐘單片機(jī)設(shè)計(jì) 原理圖及源碼與仿真
[打印本頁(yè)]
作者:
小敗qi
時(shí)間:
2017-2-7 22:11
標(biāo)題:
電子鐘單片機(jī)設(shè)計(jì) 原理圖及源碼與仿真
基于at89c52的lcd602顯示的電子時(shí)鐘
0.png
(30.83 KB, 下載次數(shù): 57)
下載附件
2017-2-8 02:05 上傳
原理圖中有四個(gè)按鈕:K1, K2, K3, K4
K1: 當(dāng)鬧鐘響起時(shí),按下觸發(fā)外部中斷1,停止鬧鐘
注意:上電時(shí)按一下K1
K2: 進(jìn)入設(shè)置模式
首先進(jìn)入設(shè)置鬧鐘的時(shí),分,秒模式
K3: 通過(guò)不斷按下K3,可以設(shè)置光標(biāo)到鬧鐘的時(shí),分, 秒,和正常時(shí)間的年,月,日,時(shí),分,秒
K4:增加光標(biāo)所在位置的年,月,日,時(shí),分,秒
(鬧鐘只有時(shí),分,秒)
0.png
(58.73 KB, 下載次數(shù): 59)
下載附件
2017-2-8 02:05 上傳
附件為電子鐘的所有源碼
原理圖及源碼.tar
(511 KB, 下載次數(shù): 71)
2017-2-7 22:10 上傳
點(diǎn)擊文件名下載附件
原理圖及源碼
下載積分: 黑幣 -5
單片機(jī)源程序:
#include <reg51.h>
#include <intrins.h>
unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"};
unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5}; //星期月參變數(shù)
unsigned char data dis_buf1[16]; //lcd上排顯示緩沖區(qū)
unsigned char data dis_buf2[16]; //lcd下排顯示緩沖區(qū)
unsigned char data year,month,date,week;//年、月、日、星期
unsigned char data armhour,armmin,armsec;//鬧鐘時(shí)、分、秒
unsigned char data hour,min,sec,sec100; //時(shí)、分、秒、百分之一秒
unsigned char data flag,vkey,skey;//設(shè)置狀態(tài)計(jì)數(shù)標(biāo)志、按鍵先前值、按鍵當(dāng)前值
bit alarm; //標(biāo)識(shí)是否啟用鬧鐘,1--啟用,0--關(guān)閉
sbit rs = P2^0; //LCD數(shù)據(jù)/命令選擇端(H/L)
sbit rw = P2^1; //LCD讀/寫(xiě)選擇端(H/L)
sbit ep = P2^2; //LCD使能控制
sbit PRE = P1^0; //調(diào)整鍵(AN3)
sbit SET = P1^1; //調(diào)整鍵(AN4)
sbit SPK = P1^2;
void delayms(unsigned char ms); //延時(shí)程序
bit lcd_busy(); //測(cè)試LCD忙碌狀態(tài)程序
void lcd_wcmd(char cmd); //寫(xiě)入指令到LCD程序
void lcd_wdat(char dat); //寫(xiě)入數(shù)據(jù)到LCD程序
void lcd_pos(char pos); //LCD數(shù)據(jù)指針位置程序
void lcd_init(); //LCD初始化設(shè)定程序
void pro_timedate(); //時(shí)間日期處理程序
void pro_display(); //顯示處理程序
void pro_key(); //按鍵處理程序
void time_alarm(); //定時(shí)報(bào)警功能(鬧鐘)
unsigned char scan_key(); //按鍵掃描程序
unsigned char week_proc(); //星期自動(dòng)計(jì)算與顯示函數(shù)
bit leap_year(); //判斷是否為閏年
void lcd_sef_chr(); //LCD自定義字符程序
void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s);
//更新顯示緩沖區(qū)函數(shù)
// 延時(shí)程序
void delay(unsigned char ms)
{ while(ms--)
{ unsigned char i;
for(i = 0; i< 250; i++)
{
_nop_(); //執(zhí)行一條_nop_()指令為一個(gè)機(jī)器周期
_nop_();
_nop_();
_nop_();
}
}
}
//測(cè)試LCD忙碌狀態(tài)
bit lcd_busy()
{
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result =(bit)(P0&0x80); //LCD的D0--D7中,D7=1為忙碌,D7=0為空閑
ep = 0;
return result;
}
//寫(xiě)入指令到LCD
void lcd_wcmd(char cmd)
{
while(lcd_busy()); //當(dāng)lcd_busy為1時(shí),再次檢測(cè)LCD忙碌狀態(tài),lcd-busy為0時(shí),開(kāi)始寫(xiě)指令
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
//寫(xiě)入數(shù)據(jù)到LCD
void lcd_wdat(char dat)
{
while(lcd_busy()); //當(dāng)lcd_busy為1時(shí),再次檢測(cè)LCD忙碌狀態(tài),lcd-busy為0時(shí),開(kāi)始寫(xiě)數(shù)據(jù)
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
//LCD數(shù)據(jù)指針位置程序
void lcd_pos(char pos)
{
lcd_wcmd(pos|0x80); //數(shù)據(jù)指針=80+地址碼(00H~27H,40H~67H)
}
//設(shè)定二個(gè)自定義字符,(注意:LCD1602中自定義字符的地址為0x00--0x07,即可定義8個(gè)字符)
//這里我們?cè)O(shè)定把一個(gè)自定義字符放在0x00位置(000),另一個(gè)放在0x01位子(001)
void lcd_sef_chr()
{ //第一個(gè)自定義字符
lcd_wcmd(0x40); //"01 000 000" 第1行地址 (D7D6為地址設(shè)定命令形式D5D4D3為字符存放位置(0--7),D2D1D0為字符行地址(0--7))
lcd_wdat(0x1f); //"XXX 11111" 第1行數(shù)據(jù)(D7D6D5為XXX,表示為任意數(shù)(一般用000),D4D3D2D1D0為字符行數(shù)據(jù)(1-點(diǎn)亮,0-熄滅)
lcd_wcmd(0x41); //"01 000 001" 第2行地址
lcd_wdat(0x11); //"XXX 10001" 第2行數(shù)據(jù)
lcd_wcmd(0x42); //"01 000 010" 第3行地址
lcd_wdat(0x15); //"XXX 10101" 第3行數(shù)據(jù)
lcd_wcmd(0x43); //"01 000 011" 第4行地址
lcd_wdat(0x11); //"XXX 10001" 第4行數(shù)據(jù)
lcd_wcmd(0x44); //"01 000 100" 第5行地址
lcd_wdat(0x1f); //"XXX 11111" 第5行數(shù)據(jù)
lcd_wcmd(0x45); //"01 000 101" 第6行地址
lcd_wdat(0x0a); //"XXX 01010" 第6行數(shù)據(jù)
lcd_wcmd(0x46); //"01 000 110" 第7行地址
lcd_wdat(0x1f); //"XXX 11111" 第7行數(shù)據(jù)
lcd_wcmd(0x47); //"01 000 111" 第8行地址
lcd_wdat(0x00); //"XXX 00000" 第8行數(shù)據(jù)
//第二個(gè)自定義字符
lcd_wcmd(0x48); //"01 001 000" 第1行地址
lcd_wdat(0x01); //"XXX 00001" 第1行數(shù)據(jù)
lcd_wcmd(0x49); //"01 001 001" 第2行地址
lcd_wdat(0x1b); //"XXX 11011" 第2行數(shù)據(jù)
lcd_wcmd(0x4a); //"01 001 010" 第3行地址
lcd_wdat(0x1d); //"XXX 11101" 第3行數(shù)據(jù)
lcd_wcmd(0x4b); //"01 001 011" 第4行地址
lcd_wdat(0x19); //"XXX 11001" 第4行數(shù)據(jù)
lcd_wcmd(0x4c); //"01 001 100" 第5行地址
lcd_wdat(0x1d); //"XXX 11101" 第5行數(shù)據(jù)
lcd_wcmd(0x4d); //"01 001 101" 第6行地址
lcd_wdat(0x1b); //"XXX 11011" 第6行數(shù)據(jù)
lcd_wcmd(0x4e); //"01 001 110" 第7行地址
lcd_wdat(0x01); //"XXX 00001" 第7行數(shù)據(jù)
lcd_wcmd(0x4f); //"01 001 111" 第8行地址
lcd_wdat(0x00); //"XXX 00000" 第8行數(shù)據(jù)
}
//LCD初始化設(shè)定
void lcd_init()
{
lcd_wcmd(0x38); //設(shè)置LCD為16X2顯示,5X7點(diǎn)陣,八位數(shù)據(jù)借口
delay(1);
lcd_wcmd(0x0c); //LCD開(kāi)顯示及光標(biāo)設(shè)置(光標(biāo)不閃爍,不顯示"-")
delay(1);
lcd_wcmd(0x06); //LCD顯示光標(biāo)移動(dòng)設(shè)置(光標(biāo)地址指針加1,整屏顯示不移動(dòng))
delay(1);
lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
delay(1);
}
//閏年的計(jì)算
bit leap_year()
{
bit leap;
if((year%4==0&&year%100!=0)||year%400==0)//閏年的條件
leap=1;
else
leap=0;
return leap;
}
//星期的自動(dòng)運(yùn)算和處理
unsigned char week_proc()
{
unsigned char num_leap;
unsigned char c;
num_leap=year/4-year/100+year/400;//自00年起到y(tǒng)ear所經(jīng)歷的閏年數(shù)
if( leap_year()&& month<=2 ) //既是閏年且是1月和2月
c=5;
else
c=6;
week=(year+para_month[month]+date+num_leap+c)%7;//計(jì)算對(duì)應(yīng)的星期
return week;
}
//更新顯示緩沖區(qū)
void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s)
{
dis_buf1[0]=t1; //
dis_buf1[1]=0x20; //空格
dis_buf1[2]=50; //'2'
dis_buf1[3]=48; //'0'
dis_buf1[4]=year/10+48;
dis_buf1[5]=year%10+48;
dis_buf1[6]=0x2d;
dis_buf1[7]=month/10+48;
dis_buf1[8]=month%10+48;
dis_buf1[9]=0x2d; //'-'
dis_buf1[10]=date/10+48;
dis_buf1[11]=date%10+48;
dis_buf1[12]=0x20;
dis_buf1[13]=dis_week[4*week];
dis_buf1[14]=dis_week[4*week+1];
dis_buf1[15]=dis_week[4*week+2];
dis_buf2[0]=t2[0];
dis_buf2[1]=t2[1];
dis_buf2[2]=t2[2];
dis_buf2[3]=t2[3];
dis_buf2[4]=t2[4];
dis_buf2[5]=t2[5];
dis_buf2[6]=t2[6]; //空格
if (alarm)
dis_buf2[7]=0x01; //alarm=1,顯示鬧鐘啟用標(biāo)致(第二個(gè)自定義字符)
else
dis_buf2[7]=0x20; //alarm=0,不顯示鬧鐘啟用標(biāo)致
dis_buf2[8]=dis_h/10+48;
dis_buf2[9]=dis_h%10+48;
dis_buf2[10]=0x3a; //':'
dis_buf2[11]=dis_m/10+48;
dis_buf2[12]=dis_m%10+48;
dis_buf2[13]=0x3a;
dis_buf2[14]=dis_s/10+48;
dis_buf2[15]=dis_s%10+48;
}
//時(shí)間和日期處理程序
void pro_timedate()
{
sec++;
if(sec > 59)
{
sec = 0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)
{
hour=0;
date++;
if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
if (date>31)
{
date=1;
month++;
} //大月31天
if (month==4||month==6||month==9||month==11)
if (date>30)
{
date=1;
month++;
} //小月30天
if (month==2)
{
if( leap_year()) //閏年的條件
{
if (date>29)
{
date=1;
month++;
}
} //閏年2月為29天
else
{
if (date>28)
{
date=1;
month++;
}
} //平年2月為28天
}
if (month>12)
{
month=1;
year++;
}
if (year>99)
year=0;
}
}
}
week_proc();
if (sec==armsec && min==armmin && hour==armhour)
{
if (alarm)
TR1=1; //鬧鐘啟用時(shí),報(bào)警時(shí)間到,啟動(dòng)Timer1
}
}
//顯示處理程序
void pro_display()
{
unsigned char i;
lcd_pos(0x00);
for (i=0;i<=15;i++)
{
lcd_wdat(dis_buf1[i]);
}
lcd_pos(0x40);
for (i=0;i<=15;i++)
{
lcd_wdat(dis_buf2[i]);
}
}
//Timer0中斷處理程序,秒的產(chǎn)生
void timer0() interrupt 1
{
TH0=0xD8;
TL0=0xF0;
sec100++;
if(sec100 >= 100) //1秒時(shí)間 (100*10ms=1000ms=1s)
{
sec100 = 0;
pro_timedate();//調(diào)用時(shí)間和日期處理程序
}
if (sec&0x01) //"gaohua"閃一秒,停一秒
update_disbuf(0x00," ",hour,min,sec); //0x00表示顯示00位置的自定義字符
else
update_disbuf(0x00,"gaohua",hour,min,sec);
pro_display(); //調(diào)用顯示處理函數(shù)
}
//按鍵掃描程序
unsigned char scan_key()
{
skey=0x00; //給變量vkey置初值
skey|=PRE; //讀取PRE鍵的狀態(tài)
skey=skey<<1; //將PRE鍵的狀態(tài)存于skey的B1位
skey|=SET; //讀取SET鍵的狀態(tài),并存于skey的B0位
return skey; //返回skey的鍵值(即PRE,SET的狀態(tài))
}
//外部中斷INT0中斷處理程序
void int0() interrupt 0
{
TR0=0; //禁止Timer0
IE=0; //禁止中斷
lcd_wcmd(0x0e); //顯示光標(biāo)"_",整個(gè)光標(biāo)不閃爍
alarm=1;
update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新顯示數(shù)據(jù),0x50表示要顯示"P"
pro_display(); //調(diào)用顯示處理程序
lcd_pos(0x47); //使光標(biāo)位于第一個(gè)調(diào)整項(xiàng)下
flag=0;
vkey=0x03;
while(flag^0x0a)
{
skey = scan_key(); //掃描按鍵狀態(tài)
if (skey^vkey) //若skey與vkey相同,跳出循環(huán),相異執(zhí)行循環(huán)體
{
delay(10); //去按鍵抖動(dòng)
skey = scan_key(); //轉(zhuǎn)回掃描按鍵狀態(tài)
if (skey^vkey) //若skey與vkey相同,跳出循環(huán),相異執(zhí)行循環(huán)體
{
vkey=skey; //將skey的值付給vkey
if (skey==0x01) //PRE鍵按下
{
flag++; //調(diào)整標(biāo)志位加1
switch (flag) //將光標(biāo)置于相應(yīng)調(diào)整位置
{
case 1: lcd_pos(0x49);break; //光標(biāo)置小時(shí)報(bào)警設(shè)置位置
case 2: lcd_pos(0x4c);break; //光標(biāo)置分鐘報(bào)警設(shè)置位置
case 3: lcd_pos(0x4f);break; //光標(biāo)置秒時(shí)報(bào)警設(shè)置位置
case 4: update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x05);break; //光標(biāo)置年調(diào)整位置
case 5: lcd_pos(0x08);break; //光標(biāo)置月調(diào)整位置
case 6: lcd_pos(0x0b);break; //光標(biāo)置日調(diào)整位置
case 7: lcd_pos(0x49);break; //光標(biāo)置時(shí)調(diào)整位置
case 8: lcd_pos(0x4c);break; //光標(biāo)置分調(diào)整位置
case 9: lcd_pos(0x4f);break; //光標(biāo)置秒調(diào)整位置
default:break;
}
}
if (skey==0x02) //SET鍵按下
{
pro_key(); //轉(zhuǎn)設(shè)置按鍵處理程序
}
}
}
}
lcd_wcmd(0x0c); //設(shè)置LCD開(kāi)顯示及光標(biāo)不閃爍,不顯示"-"
lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
IE=0x8f; //CPU開(kāi)中斷,INT0,INT1,開(kāi)中斷
TR0=1; //Timer0啟動(dòng)
}
//主程序,初始化及初值設(shè)定
void main()
{
lcd_init(); //初始化LCD
lcd_sef_chr(); //寫(xiě)入自定義字符號(hào)
hour=0;
min=0;
sec=0; //開(kāi)機(jī)時(shí)的時(shí),分,秒顯示
armhour=6;
armmin=30;
armsec=0; //開(kāi)機(jī)時(shí)的時(shí),分,秒報(bào)警初值
year= 16;
month=6;
date=1; //開(kāi)機(jī)時(shí)的年,月,日,星期顯示
week_proc();
alarm=1; //初始開(kāi)機(jī),啟用鬧鐘
IE = 0x8f; //CPU開(kāi)中斷,INT0,INT1,Timer0,Timer1開(kāi)中斷
IP = 0x04; //設(shè)置INT0為中斷最高優(yōu)先級(jí)
IT0=0;
IT1=0; //外部INT0,INT1設(shè)置為電平觸發(fā)方式(注意,觸發(fā)不要選邊沿方式,易誤動(dòng))
TMOD = 0x11; //Timer0,Timer1工作于模式1, 16位定時(shí)方式
TH0 = 0xdc;
TL0 = 0x00; //Timer0置10ms定時(shí)初值
TH1 = 0xff;
TL1 = 0x00; //Timer1置初值
TR0 = 1; //Timer0啟動(dòng)
TR1 = 0;
while(1);
}
//設(shè)置按鍵處理程序
void pro_key()
{
switch (flag)
{
case 0:alarm=!alarm; //啟用或關(guān)閉鬧鐘(alarm=1:啟用,alarm=0:關(guān)閉)
update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新顯示數(shù)據(jù)
pro_display(); //調(diào)用顯示處理
lcd_pos(0x47);break; //光標(biāo)回到原調(diào)整位置
case 1:armhour++;
if (armhour>23) armhour=0;
update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新顯示數(shù)據(jù)
pro_display(); //調(diào)用顯示處理
lcd_pos(0x49);break; //光標(biāo)回到原調(diào)整位置
case 2:armmin++;
if (armmin>59)
armmin=0;
update_disbuf(0x50,"alarm:",armhour,armmin,armsec);
pro_display();
lcd_pos(0x4c);
break;
case 3:
armsec++;
if (armsec>59)
armsec=0;
update_disbuf(0x50,"alarm:",armhour,armmin,armsec);
pro_display();
lcd_pos(0x4f);
break;
case 4:
year++;
if (year> 99)
year= 0;
week_proc(); //星期自動(dòng)運(yùn)算
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x05);
break;
case 5:
month++;
if (month>12)
month=1;
week_proc(); //星期自動(dòng)運(yùn)算
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x08);
break;
case 6:
date++;
if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
if (date>31) date=1; //大月31天
if (month==4||month==6||month==9||month==11)
if (date>30) date=1; //小月30天
if (month==2)
{if(leap_year()) //閏年的條件
{if (date>29) date=1;} //閏年2月為29天
else
{if (date>28) date=1;}} //平年2月為28天
week_proc(); //星期自動(dòng)運(yùn)算
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x0b);
break;
case 7:
hour++;
if (hour>23)
hour=0;
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x49);break;
case 8:
min++;
if (min>59)
min=0;
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x4c);
break;
case 9:sec++;
if (sec>59)
sec=0;
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x4f);
break;
default:
break ;
}
}
//Timer1中斷處理程序,產(chǎn)生報(bào)警的聲音
void timer1() interrupt 3
{
TH1=0xff;
TL1=0x00;
SPK=~SPK;
}
//外部中斷INT1中斷處理程序,停止報(bào)警聲音
void int1() interrupt 2
{
if(TR1)
TR1=0;
SPK = 0;
}
復(fù)制代碼
作者:
FourLeaf
時(shí)間:
2018-12-6 22:05
這個(gè)實(shí)物是 LCD不顯示也不亮
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1