第一篇:中華萬年歷
第一,要做一個你自己真正想用、會用的東西。你自己的產品,自己都不用,成功的可能性就很小;第二,如果你真想學技術,就要做一個你周邊朋友或同學都愿意用的東西;第三,如果你真想創業,做一個是人都會用的東西。這是我覺得每一位做產品的人都會經歷的三個階段。我自己也是這么走過來的,我大一時,因為經常翹課,做了一個自己想用的課程表,自己天天用,后來我把這個軟件推薦給同學。再后來我們把中華萬年歷,做成了一個上億人能用的東西。
最后,我還是感謝老朋友常亮,跟他認識已經5年多了。同時我的創業伙伴們大學時在一起的,今天還在一起,可能接下來10年還會在一起。我覺得這個圈子很小,大家要珍惜這樣的機會,去建立接下來5年甚至10年自己的創業伙伴,在未來的路上,大家且行且珍惜,謝謝!
第二篇:EDA萬年歷課程設計報告
《EDA技術及其應用》
實 訓 報 告
班 級 姓 名 學 號 指導教師
目 錄
一 設計要求......................................2
1.0 設計目的及意義.................................2 1.1 設計要求.......................................2
二 設計流程:....................................2
2.0 原理框圖.......................................2 2.1 VHDL設計思路...................................3
三 VHDL程序......................................3
3.0 天計數模塊......................................6 3.1 月計數模塊.....................................7 3.2 年計數模塊......................................9 3.3 調時控制模塊..................................11 3.4 譯碼模塊......................................12 3.5 掃描模塊........................................12
四 心得體會.....................................14 4.0................................................14 五 附錄...........................................15 5.0 頂層文件......................................15
一、設計目的及意義
1.0 設計目的及意義
在掌握EDA理論知識的基礎上進一步了解EDA開發軟件QuartusII的使
entity tian is port(clk:in std_logic;pan:in std_logic_vector(1 downto 0);T1:out std_logic_vector(6 downto 0);cout:out std_logic);end tian;
architecture one of tian is
signal q1:std_logic_vector(3 downto 0);signal q2:std_logic_vector(2 downto 0);signal ab:std_logic_vector(1 downto 0);begin
process(clk,pan)
begin
if clk'event and clk='1'
then q1<=q1+1;
if q1=9 then q1<=“0000”;q2<=q2+1;
end if;case pan is when “00”=> if q2=3 and q1=1 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when “01”=> if q2=3 and q1=0 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when “10”=> if q2=2 and q1=8 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when “11”=> if q2=2 and q1=9 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when others=>null;end case;end if;end process;T1(3 downto 0)<=q1;T1(6 downto 4)<=q2;end one;3.1 月計數模塊
when others=>null;end case;end if;Y1(3 downto 0)<=q1;Y1(6 downto 4)<=q2;end process;end behav;
3.2 年計數模塊
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity nian is port(clk :in std_logic;n1:out std_logic_vector(6 downto 0);
run:out std_logic);end entity;
architecture one of nian is signal q1,q3:std_logic_vector(3 downto 0);signal q2:std_logic_vector(2 downto 0);
begin process(clk)
begin if clk'event and clk='1' then
q1<=q1+1;q3<=q3+1;
if q1=9 then q2<=q2+1;q1<=“0000”;end if;if q3=3 then q3<=“0000”;run<='1';else run<='0';end if;
if q1=9 and q2<=7 then q1<=“0001”;q2<=“000”;end if;
end if;end process;
sel:out std_logic_vector(2 downto 0));end seltime;architecture fun of seltime is signal count:std_logic_vector(2 downto 0);begin sel<=count;process(clk1)begin if(clk1'event and clk1='1')then if(count>=“101”)then count<=“000”;else count<=count+1;end if;end if;case count is when “000”=>daout<=tian(3 downto 0);dp<='0';when“001”=>daout(3)<='0';daout(2 downto 0)<=tian(6 downto 4);dp<='0';when “010”=>daout<=yue(3 downto 0);dp<='1';when“011”=>daout(3)<='0';daout(2 downto 0)<=yue(6 downto 4);dp<='0';when “100”=>daout<=nian(3 downto 0);dp<='1';when others=>daout(3 downto 2)<=“00”;daout(2 downto 0)<=nian(6 downto 4);dp<='0';end case;end process;end fun;
3.5 譯碼模塊
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity led is port(ledi:in std_logic_vector(3 downto 0);ledo:out std_logic_vector(6 downto 0));
次萬年歷實訓我們是四個人作為一個團隊,在實訓過程中,有時候一個人在編寫程序時出現一點很小的錯誤(例如:程序中少了一個分號或者少了一個字母)就會導致整個程序編譯不能通過,而四個人在一起,出現錯誤時一起去尋找,總會有一個人及時發現錯誤的,發現后及時糾正錯誤,然后繼續開展下面的工作。這樣三個人互相協作,共同努力,各自發揮自身的優勢,這樣工作便能順利的進行下去,如果是一個人單獨去完成,在出現錯誤的時候自己要想發現錯誤便需要很長的時間才能發現,這樣很浪費時間,浪費時間的結果就是直接導致工作效率低。而在如今的社會工作中,許多公司企業都要求應聘者要有很好的團隊合作精神,工作時要有高效的工作效率。因此,在這次實訓中我也切身體會到了團隊合作的重要性。
實訓是對每個學生綜合能力的檢驗是讓我們能夠更好的鞏固專業知識,積累工作經驗,掌握工作技能。通過這次實訓,讓我深深的體會到要想做好每一件事情,除了自己平時要有一定的專業知識外,還需要一定的實踐動手能力,操作能力,說實話,這次實訓讓我學到了很多東西,也明白了很多事情。在此還要感謝王老師耐心、認真的指導。謝謝薛老師!
五、附錄
5.0 頂層文件
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity nianli is port(clk,clkdsp:in std_logic;k1,k2:in std_logic;dpout,d10,d20:out std_logic;ledout :out std_logic_vector(6 downto 0);sel1:out std_logic_vector(2 downto 0));
end entity;architecture one of nianli is component tian port(clk:in std_logic;pan:in std_logic_vector(1 downto 0);T1:out std_logic_vector(6 downto 0);cout:out std_logic);end component;component yue port(clk,run:in std_logic;cout:out std_logic;pan:out std_logic_vector(1 downto 0);
第三篇:數碼管萬年歷實習報告
河南機電高等專科學校
綜合實訓報告
系 部: 專 業: 班 級: 學生姓名: 學 號:
2013年 6月 28日
實訓任務書
1.時間:2013年6月15日~2013年6月28日 2.實訓單位:河南機電高等??茖W校 3.實訓目的:深入學習電子產品設計制作的全過程 4.實訓任務:
①加深學習電路圖繪制軟件的相關常識及其特點; ②以51單片機為核心設計出一個LED萬年歷;
③萬年歷具有年份、月、日、時、分、秒、周、溫度、整點報時等功能; ④自己獨立完成設計電路圖,生成PCB,轉印、腐蝕電路板,焊接等硬件制作工作;
⑤會使用keil軟件編寫程序,并完成燒寫過程; ⑥學會調試程序,敢于發現問題,解決問題; ⑦參考相關的的書籍、資料,認真完成實訓報告。
綜合實訓報告
前言:
萬年歷是我們經常見到和使用的計時工具,使用方便,功能多。但自己做一個讓人滿意的萬年歷,就不一定有那么輕而易舉了,本次實訓的任務就是自己親手做一個萬年歷。利用本學期學過的單片機知識,設計出具有顯示年、月、日、時、分、秒、周、溫度功能,同時有整點報時的功能的萬年歷。
一、實訓器件
1.溫度傳感器DS18B20 采用數字式溫度傳感器DS18B20,此類傳感器為數字式傳感器而且僅需要一條數據線進行數據傳輸,易于與單片機連接,可以避免A/D模數轉換模塊,降低硬件成本,簡化系統電路。另外,數字式溫度傳感器還具有測量精度高、測量范圍廣等優點。因此,本設計DS18B20溫度傳感器作為溫度采集模塊。
2.時鐘芯片DS1302 采用DS1302時鐘芯片實現時鐘,它可以對年、月、日、周、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發方式一次傳送多個字節的時鐘信號或RAM數據。DS1302內部有一個31×8的用于臨時性存放數據的RAM寄存器。具有主電源/后背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力。主要特點是采用串行數據傳輸,可為掉電保護電源提供可編程的充電功能,并且可以關閉充電功能。采用普通32.768kHz晶振。因此,本設計中采用DS1302提供時鐘。
3.74LS154 74LS154 為 4 線-16 線譯碼器,其主要電特性的典型值如下:
當選通端(G1、G2)均為低電平時,可將地址端(ABCD)的二進制編碼在一個對應的輸出端,以低電平譯出。若將G1和G2中的一個作為數據輸入端,由ABCD對輸出尋址,54/74154 還可作4線-16線數據分配器。
引出端符號: A、B、C、D 譯碼地址輸入端(低電平有效)G1、G2 選通端(低電平有效)0-15 輸出端(低電平有效)可用此種芯片作為數碼管的選址芯片。4.74HC573 74HC573是八進制3態非反轉透明鎖存器,是高性能硅門CMOS器件。當鎖存使能端為高時,這些器件的鎖存對于數據是透明的(也就是說輸出同步)。當鎖存使能變低時,符合建立時間和保持時間的數據會被鎖存。輸出能直接接到 CMOS,NMOS和 TTL接口上操作電壓范圍:2.0V~6.0V×低輸入電流: 1.0uA。本實訓采用此芯片作為數碼管的驅動芯片。
5.數碼管
本實訓使用共陰極數碼管作為顯示器件,采用 LED 數碼管動態掃描,LED 數 主電路PCB: 碼管價格適中,對于顯示數字也最合適。
綜上各模塊的選擇方案與論證,確定最后的主要硬件資源如下:采用AT89S51作為主控制系統;DS1302提供時鐘;DS18B20作為數字式溫度傳感器;74LS154作為選址芯片;74HC573作為數碼管的驅動芯片;共陰極數碼管顯示數字;S8550驅動揚聲器。
二、實訓原理
為了使萬年歷在包裝美化時簡單化及布線的方便,我將萬年歷分為兩部分,一部分是主體部分含有年份、月、日、時、分、秒,另一部分是小模塊包含周、溫度。
電路圖如下:
主電路圖:
***9485*********2930******203919343338***61635***33212*********6545516251724***1 周,溫度電路圖: 周,溫度PCB:
***061
三、程序編寫
使用Keil軟件編寫程序。程序包括主函數、時間顯示函數、溫度顯示函數、時間調整函數、DS18B20模塊、DS1302模塊和周計算函數等。
程序的編寫使我熟練的掌握了Keil軟件的應用。具體程序見附錄。
四、程序的燒寫與調試
程序燒寫需要用專用的燒寫軟件將Keil軟件聲生成的.hex文件寫進單片機里。經過多次的程序的改寫與調試,最終制作出比較滿意的成品。
五、成品展示:
心得體會: 經過此次實訓我學到了很多,剛開始以為做萬年歷很難,著手開始做這個產品沒有一點頭緒,經過上網查資料,產生了最初的制作框架,然后就開始找芯片,查芯片資料,設計電路圖,又請同學幫忙指點,修改原理圖。接著買元器件,做封裝,生成PCB,制作電路板,焊接元器件,最后完成了整個硬件部分的制作。完成了硬件制作后,我又編了測試軟件測試硬件是否有問題,發現數碼管不亮,經過問題排查及資料查詢,發現單片機P0口缺少了上拉電阻,接上后,解決了問題。
編程也是比較困難的,由于掌握的知識不夠多,借鑒了別人的程序,并加入自己的想法,經過調試,程序編寫成功。最終完成了產品的制作。在實習的過程中我得到了別人的幫助,同時也主動幫助別人,得到了很多經驗,為以后學習提供了方便。實習就是學習的過程,本次實習是最成功的一次,也是學到最多的一次。參考文獻:
《單片機C51程序設計教程與實驗》 北京航空航天大學出版社 《單片機原理及應用(C51語言)》 清華大學出版社 《數字電子技術》 黃河水利出版社 《Protel DXP 2004電路設計與仿真教程》 北京航空航天大學出版社 附錄: 程序
萬年歷.c #include
uchar mode,TH,TL,TN,seconds,minutes,hours,years,months,days,WEEK,n;
uchar count=0;sbit SET=P3^4;
sbit ADD=P3^5;//增加
sbit RED=P3^6;//減小
sbit CANL=P3^7;sbit le=P2^6;sbit oe=P2^7;sbit en=P1^4;
sbit beep=P2^4;
uchar GetWeekFromDay(uchar years,uchar months,uchar days);
void WriteSet1302(uchar cmd,uchar date);
uchar ReadSet1302(uchar cmd);
void ReadyreadDS18B20(void);
uchar ReadDS18B20(void);void IntDS1302(void);
void delay1ms(uint x){ uchar i,j;for(i=x;i>0;i--)for(j=124;j>0;j--);} void delaynus(uchar n)//延時若干微秒
{
while(n--);} void display_Year(year)//顯示年
{
uchar i,j;i=year/10;j=year%10;P0=digit[2];P1=8;delay1ms(2);P0=digit[0];P1=9;delay1ms(2);P0=digit[i];P1=10;delay1ms(2);P0=digit[j];P1=11;delay1ms(1);} void display_Month(month)//顯示月
{ uchar i,j;i=month/10;j=month%10;P0=digit[i];P1=6;delay1ms(2);P0=digit[j];P1=7;delay1ms(1);} void display_Day(day)//顯示日
{ uchar i,j;i=day/10;j=day%10;P0=digit[i];P1=4;delay1ms(2);
P0=digit[j];P1=5;delay1ms(1);} void display_Hour(hour)//顯示時
{ uchar i,j;
i=hour/10;j=hour%10;P0=digit[i];P1=2;delay1ms(2);P0=digit[j]+n*0x80;P1=3;delay1ms(1);}
void display_Minute(minute)//顯示分
{ uchar i,j;i=minute/10;j=minute%10;P0=digit[i];P1=0;delay1ms(2);P0=digit[j];P1=1;delay1ms(1);} void display_Week(void)//顯示周{ WEEK=GetWeekFromDay(years,months,days);
P1=12;switch(WEEK){
case 1:P0=digit[1];
delay1ms(2);
break;
case 2:P0=digit[2];
delay1ms(2);
break;
case 3:P0=digit[3];
delay1ms(2);
break;
case 4:P0=digit[4];
delay1ms(2);
break;
case 5:P0=digit[5];
delay1ms(2);
break;
case 6:P0=digit[6];
delay1ms(2);
break;
case 7:P0=digit[8];
delay1ms(2);
break;
} }
void display_Time(void)//顯示實時時間
{ uchar value;value=ReadSet1302(0x83);minutes=(((value&0x70)>>4)*10+(value&0x0f));display_Minute(minutes);value=ReadSet1302(0x85);hours=(((value&0x70)>>4)*10+(value&0x0f));display_Hour(hours);value=ReadSet1302(0x87);days=(((value&0x70)>>4)*10+(value&0x0f));display_Day(days);value=ReadSet1302(0x89);months=(((value&0x70)>>4)*10+(value&0x0f));display_Month(months);value=ReadSet1302(0x8D);years=(((value&0xf0)>>4)*10+(value&0x0f));display_Year(years);display_Week();} /*****************時間調整部分*********************/
void hourset(void)//調時
{ uchar timevalue,hour;
delay1ms(500);//防止多次觸發
WriteSet1302(0x8e,0x00);//將寫保護去掉,確保能正常將調整后的數值寫入DS1302
timevalue=ReadSet1302(0x85);//讀取此時的數值
hour=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));while(1){
if(ADD==0)
{
delay1ms(20);
if(ADD==0)
{
hour++;
delay1ms(100);
while(ADD==0);
}
}
if(RED==0)
{
delay1ms(20);
if(RED==0)
{
hour--;
delay1ms(100);
if(hour==0)hour=23;
while(RED==0);
}
}
if(hour>=24)hour=0;
timevalue=(((hour)/10)<<4|(hour%10));
WriteSet1302(0x84,timevalue);
delay1ms(2);
display_Hour(hour);
delay1ms(10);
if(CANL==0)
{
mode=0;
break;
}
if(SET==0)break;} WriteSet1302(0x8e,0x80);} void minuteset(void)
//調分
{ uchar timevalue,minute;delay1ms(500);WriteSet1302(0x8e,0x00);timevalue=ReadSet1302(0x83);minute=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));while(1){
if(ADD==0)
{
delay1ms(20);
if(ADD==0)
{
minute++;
if(minute>=60)timevalue=0;
while(ADD==0);
}
}
if(RED==0)
{
delay1ms(10);
if(RED==0)
{
minute--;
if(minute==0)minute=59;
delay1ms(300);
while(RED==0);
}
}
if(minute>=60)minute=0;
timevalue=((minute/10)<<4|(minute%10));
WriteSet1302(0x82,timevalue);
delay1ms(2);
display_Minute(minute);
delay1ms(10);
if(CANL==0)
{
mode=0;
break;
}
if(SET==0)break;} WriteSet1302(0x8e,0x80);}
void yearset(void)
//調年
{ uchar datevalue,year;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x8d);year=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){
if(ADD==0)
{
delay1ms(20);
if(ADD==0)
{
year++;
while(ADD==0);
}
}
if(RED==0)
{
delay1ms(20);
if(RED==0)
{
year--;
delay1ms(100);
while(RED==0);
}
}
datevalue=((year/10)<<4|(year%10));
WriteSet1302(0x8c,datevalue);
delay1ms(5);
display_Year(year);
delay1ms(5);
if(CANL==0)
{
mode=0;
break;
}
if(SET==0)break;} WriteSet1302(0x8e,0x80);} void monthset(void)
//調月
{ uchar datevalue,month;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x89);month=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){
if(ADD==0)
{
delay1ms(20);
if(ADD==0)
{
month++;
if(month>12)month=1;
while(ADD==0);
}
}
if(RED==0)
{
delay1ms(20);
if(RED==0)
{
month--;
delay1ms(100);
if(month==0)month=12;
while(RED==0);
}
}
datevalue=((month/10)<<4|(month%10));
WriteSet1302(0x88,datevalue);
delay1ms(5);
display_Month(month);
delay1ms(5);
if(CANL==0)
{
mode=0;
break;
}
if(SET==0)break;} WriteSet1302(0x8e,0x80);} void dayset(void)
//調日
{ uchar datevalue,day;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x87);day=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){
if(ADD==0)
{
delay1ms(10);
if(ADD==0)
{
day++;
if(day>31)day=1;
while(ADD==0);
}
}
if(RED==0)
{
delay1ms(10);
if(RED==0)
{
if(day==0)day=31;
day--;
delay1ms(300);
while(RED==0);
}
}
datevalue=((day/10)<<4|(day%10));
WriteSet1302(0x86,datevalue);
delay1ms(5);
display_Day(day);
delay1ms(5);
if(CANL==0)
{
mode=0;
break;
}
if(SET==0)break;} WriteSet1302(0x8e,0x80);} void TimeSet(void)
//時間調整函數
{ if(SET==0){
delay1ms(20);
if(SET==0)
{ while(!SET);
mode++;
delay1ms(20);
switch(mode)
{
case 1:{yearset();delay1ms(20);}
break;
case 2:{monthset();delay1ms(20);} break;
case 3:{dayset();delay1ms(20);}
break;
case 4:{hourset();delay1ms(20);} break;
case 5:{minuteset();delay1ms(20);} break;
}
if(mode==5)mode=0;
} } } /***************顯示溫度模塊********************/ uchar flag;/*********************顯示溫度整數部分*************************/ void Display_Integer(unsigned char x){
uchar s,g;s=x%100/10;g=x%10;P0=digit[s];P1=13;delay1ms(3);P0=digit[g]+0x80;P1=14;delay1ms(3);P0=digit[10];P1=15;delay1ms(1);}
void display_Temperature(void){
ReadyreadDS18B20();
TL=ReadDS18B20();
TH=ReadDS18B20();
if((TH&0XF8)!=0X00)
{
flag=1;
TL=~TL;
TH=~TH;
TL+=1;
if(TL>255)TH+=1;
TN=TH*16+TL/16;
}
TN=TH*16+TL/16;
Display_Integer(TN);} /**************** 設置模塊 ******************/
void Set(void){ if(SET==0){
delay1ms(5);
if(SET==0)
{
delay1ms(50);
while(1)
{
TimeSet();
if(CANL==0)
{
break;
}
}
} } } void InitTimer0(void){
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0x0B0;
EA = 1;
ET0 = 1;
TR0 = 1;} /***************主函數**********************/
void main(){ int i;P0=0;InitTimer0();IntDS1302();
//初始化DS1302 delay1ms(5);le=1;oe=0;en=0;delay1ms(200);beep=1;while(1){
for(i=1000;i>0;i--)
{
Set();
display_Time();
Display_Integer(TN);
if(hours==7||hours==8||hours==9||hours==10||hours==11||hours==12
||hours==14||hours==15||hours==16||hours==17||hours==18||hours==19
||hours==20||hours==21||hours==22)
{
if(minutes==0x00)
{
uchar value,w,k;
value=ReadSet1302(0x81);
seconds=(((value&0x70)>>4)*10+(value&0x0f));
if(seconds>0&&seconds<2)
{
for(k=5;k>=0;k--)
{
for(w=100;w>0;w--)
{
beep=0;
delay1ms(3);
beep=1;
delay1ms(3);
}
delay1ms(1000);
}
}
else beep=1;
}
}
}
display_Temperature();
}
} void t0()interrupt 1 { TH0 = 0x3C;
TL0 = 0x0B0;count++;
if(count==10){n=0;
} if(count==20){ count=0;
n=1;
} } /*******DS1302模塊*************/ sbit SCLK=P2^0;//DS1302時鐘輸入
sbit DATE=P2^1;//DS1302數據輸入
sbit REST=P2^2;//DS1302復位端口
void Write1302(uchar date)//向1302寫數據 {
uchar i;SCLK=0;delaynus(2);for(i=0;i<8;i++){
DATE=date&0x01;
SCLK=1;
delaynus(2);
SCLK=0;
delaynus(2);
date>>=1;} } void WriteSet1302(uchar cmd,uchar date)//根據相應的命令輸入相應的數據
{
REST=0;
SCLK=0;
REST=1;
Write1302(cmd);
delaynus(5);
Write1302(date);
SCLK=1;
REST=0;} uchar Read1302(void)//讀取1302數據
{
uchar i,date;delaynus(2);for(i=0;i<8;i++){
date>>=1;
if(DATE==1)
date|=0x80;
SCLK=1;
delaynus(2);
SCLK=0;
delaynus(2);} return date;
} uchar ReadSet1302(uchar cmd)//根據命令讀取1302相應的值 { uchar date;REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(2);date=Read1302();SCLK=1;REST=0;return date;} void IntDS1302(void)//DS1302初始化 {
uchar flag;
flag= ReadSet1302(0x81);if(flag&0x80)
//判斷時鐘芯片是否關閉
{
WriteSet1302(0x8E,0x00);
//根據寫狀態寄存器命令字,寫入不保護指令
WriteSet1302(0x80,((0/10)<<4|(0%10)));
//根據寫秒寄存器命令字,寫入秒的初始值
WriteSet1302(0x82,((0/10)<<4|(0%10)));
//根據寫分寄存器命令字,寫入分的初始值
WriteSet1302(0x84,((0/10)<<4|(0%10)));//根據寫小時寄存器命令字,寫入小時的初始值
WriteSet1302(0x86,((0/10)<<4|(0%10)));//根據寫日寄存器命令字,寫入日的初始值
WriteSet1302(0x88,((0/10)<<4|(0%10)));//根據寫月寄存器命令字,寫入月的初始值
WriteSet1302(0x8c,((10/10)<<4|(10%10)));//根據寫年寄存器命令字,寫入年的初始值
WriteSet1302(0x90,0xa5);
//打開充電功能 選擇2K電阻充電方式
WriteSet1302(0x8E,0x80);
//根據寫狀態寄存器命令字,寫入保護指令
} } /**********************操作DS18B20模塊***************************/ sbit DQ=P2^3;
uchar time;void delayms(uchar x){ uchar i,j;for(i=x;i>0;i--)for(j=124;j>0;j--);} /**********************DS18B20初始化****************************/ bit IntDS18B20(void){ bit temp;DQ=1;for(time=0;time<2;time++);DQ=0;for(time=0;time<200;time++);DQ=1;for(time=0;time<10;time++);temp=DQ;for(time=0;time<200;time++);return temp;} /**************************讀DS18B20**********************/ uchar ReadDS18B20(void){ uchar dat,i;for(i=0;i<8;i++){
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=1;
for(time=0;time<2;time++);
dat>>=1;
if(DQ==1)
dat=dat|0x80;
else
dat=dat|0x00;
for(time=0;time<10;time++);} return dat;} /*********************向DS18B20寫數據**************************/ void WriteDS18B20(uchar date){
uchar i;for(i=0;i<8;i++){
DQ=1;
_nop_();
DQ=0;
DQ=date&0x01;
for(time=0;time<10;time++);
DQ=1;
for(time=0;time<1;time++);
date>>=1;
} for(time=0;time<4;time++);} /*******************為讀取溫度做好準備************************/ void ReadyreadDS18B20(void){ IntDS18B20();WriteDS18B20(0XCC);WriteDS18B20(0X44);IntDS18B20();WriteDS18B20(0XCC);WriteDS18B20(0XBE);} // 計算2000~2099年任一天星期幾
// year
: 00-99 // month: 01-12 // day
: 01-31
uchar GetWeekFromDay(uchar years,uchar months,uchar days){
if(months == 1 || months == 2)
{
months+=12;
if(years> 0)
years--;
else
years;
}
return(1+((days + 2*months + 3*(months+1)/5 + years + years/4)%7));//(星期一用1表示,而星期天用7表示)}
// 返回星期幾
第四篇:單片機課程設計-電子萬年歷
單片機及接口技術綜合實驗
——————電子萬年日歷系統一、題目:電子實時時鐘/萬年日歷系統
二、功能要求:
1. 基本要求:
⑴ 顯示準確的北京時間(時、分、秒),可用24小時制式; ⑵ 隨時可以調校時間。
2. 發揮要求:
⑴ 增加公歷日期顯示功能(年、月、日),年號只顯示最后兩位; ⑵ 隨時可以調校年、月、日;
⑶ 允許通過轉換功能鍵轉換顯示時間或日期。
三、方案考慮:
1、硬件方案:
⑴ 顯示器采用6位LED數碼管(共陽),可分別顯示時間或日期;(通過KB鍵可切換)⑵ 顯示器的驅動采用動態掃描電路形式,以達到簡化電路的目的。但要注意所需的驅動電流比靜態驅動時要大,因此要增加驅動電路??刹捎?4LS244或者晶體管;其中74ls244是用來驅動段選碼,晶體管是驅動位選碼!⑶采用“一鍵多用方案”,以減少按鍵數目。本方案只采用了兩個按鍵 ⑷ 整體上要考慮:結構簡單、布局美觀、操作方便、成本低廉。
2、設計電路圖如下:
3、元件清單:
⑴ 89C51
1個
⑵ IC座(40腳)
3個(其中1個用于接插89C51、2個用于接插LED段數碼管)。⑶ 74LS244
1個(用于驅動6個共陽的LED段數碼管)。⑷ IC座(20腳)
1個(用于接插74LS244)。(5)顯示器:LED_8段數碼管(共陽型)6個三極管:
(6)PNP(8550)
6個(用于驅動6個共陽型LED段數碼管)。
(7)微型開關:
3個(其中1個用于復位電路、其它用于鍵盤)。(8)晶體振蕩器(12MHz):1個(用于振蕩電路)。(9)電阻器:
⑴ 3KΩ
1個(用于系統復位電路)。
⑵ 1KΩ
6個(用作PNP三極管基極電阻)。⑶ 100Ω
7個(驅動器用作74LS244輸出限流電阻)。(10)電容器:
⑴ 10μF
1個(用于系統復位電路)。⑵ 30 pF
2個(用于系統振蕩電路)。(11)其它:
⑴ 萬能電路板(10×15):
1塊 ⑵ 焊錫條:
2米 ⑶ 帶插頭、座的電源端子:
1條 ⑷ 各種顏色外皮的導線:
各1米(12)工具:
1.電烙鐵:
1把 2.剪鉗:
1把 3.鑷子:
1把 4.萬用表:
1個(13)設備:
編程器(MEP300或TOP851)
6個
4、軟件方案:
只使用第一組工作寄存器,功能分布如下:
⑴ “時鐘”基準時間由單片機內部定時中斷來提供,定時時間應該乘以一個整數得到“秒”,且不宜太長或太短,最長不能超過16位定時器的最長定時時間,最短不能少于定時中斷服務程序的執行時間。一般來說,基準時間越短,越有利于提高時鐘運行的精確度。本實驗定時5mS。乘以一個整數200得到“1秒”.⑵ 用一個計數器(R4)對定時中斷的次數進行計數,從而可以實現“秒”定時,同理可以實現“分”定時和“時”定時,甚至于“日”、“月”、“年”定時。
⑶ 顯示器采用動態驅動時要注意到:LED的 “啟輝時間”和 “余輝時間”。驅動信號的維持時間必須大于啟輝時間;而驅動信號的間歇時間必須小于余輝時間?!皢⑤x時間”和 “余輝時間”與驅動電流的大小有關,驅動電流越大,啟輝時間越短,而余輝時間越長。但是,驅動電流的大小受到驅動電路的驅動能力和LED極限功耗的限制。本實驗采用了74ls244和晶體管8550驅動,并進行適當的延時3ms解決上述問題。
⑷ LED的余輝時間使動態驅動顯示得到保證,但也要注意到它在更新顯示內容時,可能造成顯示字符的混亂模糊。為此,在把“更新顯示內容”寫入顯示器之前,必須把所有的LED熄滅,即要把一個“熄滅驅動信號”先寫入顯示器。
⑸對于按鍵的處理,采用中斷。產生中斷后先判有無按鍵被按下,還要考慮到“去抖動影響”問題,可采用軟件延遲法解決這個問題,延遲時間至少10mS。而單純進行軟件延時的話會令到顯示管產生斷續的情況,故調用顯示程序作為延時時間。這樣就合理地處理好這兩者的矛盾了。
⑹ 把鍵盤的按鍵分兩種情況來處理,操作簡單。
①
調整時間時,先按下KA鍵,(KA鍵為選擇調整位置的鍵,如選調整秒或分),而此時的KB鍵只是用來加一操作。在調整時間狀態下,若在十秒內檢測到沒有任何按鍵按下,則返回正常顯示時鐘狀態。
②
而不調整時間,即不按下KA鍵,KB的鍵只用來切換顯示日期和時鐘。⑺ 對于自動識別“月大、月小”和“平年、閏年”的問題,主要考慮: ① 月大、月小:
1~7月:逢單月為31天;逢雙月為30天,其中2月另行處理。8~12月:逢單月為30天;逢雙月為31天。②平年、閏年:
僅僅處理2月份的天數:平年的2月份天數為28天,閏年的2月份天數為29天。
5、程序流程圖如下:(1)電子時鐘計算程序圖
(2)調整流程圖
程序編寫如下:
;///////////////////////////////////////////////////////// ORG 0000H
LJMP START ORG 0003H LJMP PROINT0
;int0用來切換時鐘調整位置
ORG 0013H
;用來調整時間,只加不減 LJMP PROINT1
ORG 001BH
;5ms的延遲,計數200次則為1秒
LJMP PROTIME
ORG 0030H
;主程序
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;0 1 2 3 4 5 6 7 8 9
ORG 0050H
START: MOV TCON,#05H
;中斷初始化
MOV IE ,#8DH MOV TMOD,#10H MOV TH1,#0eCH
;定時器初始化
MOV TL1,#78H
MOV 31H,#0AH
;10秒 MOV 32H,#1EH;30分 MOV 33H,#09H;9點 MOV 34H,#0AH MOV 35H,#06H MOV 36H,#05H MOV 37H,#14H
;10號;6月;2005年
;R7 存放切換標志 0 NORMAL , 1 HOUR ,2 MINUTE ,3 SECOND ,4 YEAR,5 MONTH,6 DAY
MOV R1,#00H
;確定在調時不按鍵的最長時間,10秒后返回normal狀態
MOV R7,#00H
;切換標志
MOV 40H,#00H
;十六進制轉換BCD的高位 MOV 41H,#00H
;十六進制轉換BCD的低位
MOV R6,#00H
;調時的位閃爍的時間間隔
MOV R4,#00H
;用來計數5ms的中斷次數,200次則一秒
mov r3,#00h
SETB TR1
;開始計時 AGAIN:
ACALL PROSHOW
;顯示
AJMP AGAIN
PROSHOW:
CJNE R3,#00H,SHOWDATE
;如果r3等于1就顯示日期,等于0就顯示時鐘 CJNE R7,#04H,DATE1
;顯示程序
AJMP SHOWDATE
;showdate顯示年月日 AJMP SHOWDATE DATE1: CJNE R7,#05H,DATE2 DATE2: CJNE R7,#06H,SHOWCLOCK AJMP SHOWDATE
showCLOCK: MOV R0,33H
;showclock顯示時分秒,先顯示時
ACALL PROHTOD
CJNE R7,#01H,CLK1 INC R6
CJNE R6,#03H,CLK2
;若處于調時狀態,則該位閃爍
MOV R6 ,#00H CLK1: clr P2.4 mov a,41H MOV P0, a
;顯示時的低位 ACALL DELAY3MS CLK2: SETB P2.4 CLR P2.5 mov a,40H
MOV P0,a
;顯示時的高位 ACALL DELAY3MS SETB P2.5
MOV R0,32H
;顯示分 ACALL PROHTOD CJNE R7,#02H,CLK3 INC R6
CJNE R6,#03H,CLK4
;若處于調時狀態,則該位閃爍
MOV R6,#00H CLK3: CLR P2.2
mov a,41H MOV P0, a
;顯示分的低位 ACALL DELAY3MS CLK4:
SETB P2.2 CLR P2.3 mov a,40h MOV P0,a
;顯示分的高位 ACALL DELAY3MS SETB P2.3
MOV R0,31H
;顯示秒
ACALL PROHTOD CJNE R7,#03H,CLK5 INC R6
CJNE R6,#03H,CLK6
MOV R6,#00H CLK5: CLR P2.0 mov a,41H MOV P0, a
ACALL DELAY3MS CLK6: SETB P2.0 CLR P2.1 mov a,40h MOV P0,a
ACALL DELAY3MS SETB P2.1
RET
SHOWDATE: MOV R0,36H
ACALL PROHTOD CJNE R7,#04H,DAY1 INC R6
CJNE R6,#03H,DAY2
MOV R6,#00H DAY1: CLR P2.4 MOV P0,41H
ACALL DELAY3MS DAY2: SETB P2.4 CLR P2.5 MOV P0,40H
ACALL DELAY3MS SETB P2.5
MOV R0,35H
ACALL PROHTOD CJNE R7,#05H,MONTH1
;若處于調時狀態,則該位閃爍
;顯示秒的低位
;顯示秒的高位
;顯示年
;若處于調時狀態,則該位閃爍;顯示年的低位
;顯示年的高位
;顯示月
INC R6
CJNE R6,#03H,MONTH2
;若處于調時狀態,則該位閃爍
MOV R6,#00H MONTH1: CLR P2.2 MOV P0,41H
;顯示月的低位
ACALL DELAY3MS MONTH2: SETB P2.2
CLR P2.3 MOV P0,40H
;顯示月的高位
ACALL DELAY3MS SETB P2.3
MOV R0,34H
ACALL PROHTOD CJNE R7,#06H,YEAR1 INC R6
CJNE R6,#03H,YEAR2
MOV R6,#00H YEAR1: CLR P2.0
MOV P0,41H
ACALL DELAY3MS YEAR2: SETB P2.0 CLR P2.1 MOV P0,40H
ACALL DELAY3MS SETB P2.1
RET
PROHTOD:PUSH ACC
MOV A,R0 MOV B,#0AH DIV AB MOV DPTR,#0030H MOVC A,@A+DPTR MOV 40H,A MOV A,B MOVC A,@A+DPTR MOV 41H,A POP ACC RET
;顯示日
;若處于調時狀態,則該位閃爍
;十六進制數轉換成bcd碼,且可以直接輸出p0口
DELAY3MS:
;DELAY3MS MOV 45H,#08H DELAY1: MOV 46H,#0FFH DELAY2: DJNZ 46H,DELAY2 DJNZ 45H,DELAY1 RET
PROINT0:
CLR EX0
;切換鍵中斷程序 MOV R3,#00H ACALL PROSHOW MOV C,P3.2 JC IEXIT0 MOV R1,#00H INC R7 CJNE R7,#07H,IEXIT0
MOV R7,#00H INT01: MOV C,P3.2 JC INT02 ACALL PROSHOW AJMP INT01 INT02: ACALL PROSHOW IEXIT0: SETB EX0 RETI
PROINT1:CLR EX1
ACALL PROSHOW MOV C,P3.3 JC IEXIT1 LCALL ISYEAR
;判斷平年閏年
LCALL ISMONTH
;判斷月份,確定最大日數
MOV R1,#00H CJNE R7,#00H,NEXT1
;若不是調時狀態,按此鍵就是切換顯示日期、時鐘
INC R3 CJNE R3,#02H,IEXIT1 MOV R3,#00H AJMP IEXIT1 NEXT1: mov r3,#00h
CJNE R7,#03H,NEXT2
;修改秒位 INC 31H MOV A,31H CJNE A,#3CH,INT11
;遇60變0 MOV 31H,#00H AJMP IEXIT1
NEXT2: CJNE R7,#02H,NEXT3
;修改分位
INC 32H MOV A,31H
CJNE A,#3CH,INT11
;遇60變0 MOV 31H,#00H AJMP IEXIT1 NEXT3: CJNE R7,#01H,NEXT4
;修改時位
INC 33H MOV A,33H CJNE A,#18H,INT11
;遇24變0 MOV 33H,#00H AJMP IEXIT1 NEXT4: CJNE R7,#06H,NEXT5
;修改日
INC 34H MOV A,34H CJNE A,49H,INT11
;到月底就返回月初 MOV 34H,#01H AJMP IEXIT1
NEXT5: CJNE R7,#05H,NEXT6
;修改月
INC 35H
MOV A,35H CJNE A,#0DH,INT11
;十二月過后就跳回1月 MOV 35H,#01H AJMP IEXIT1 NEXT6: CJNE R7,#04H,INT11
;修改年
INC 36H
MOV A,36H CJNE A,#64H,INT11
MOV 36H,#00H MOV C,P3.3 INT11: JC INT12 ACALL PROSHOW AJMP INT11 INT12: ACALL PROSHOW IEXIT1: setb EX1
RETI PROTIME:
MOV TMOD,#10H MOV TH1,#3CH
;定時器初始化 MOV TL1,#60H setb tr1 INC R4
CJNE R4,#0c8H,EXIT
MOV R4,#00H
;計滿1秒則清零 CJNE R7,#00H,DIAOSHI
AJMP NORMAL DIAOSHI:INC R1
;調時不按鍵的最長時間為10秒,在此期間又鍵按下重新計時
CJNE R1,#0AH,EXIT MOV R7,#00H
;到10秒則返回正常顯示狀態 MOV R1,#00H AJMP EXIT
NORMAL:ACALL ISYEAR
;判斷平閏年,返回標志48h,0為平年,1為閏年
ACALL ISMONTH
;判斷哪個月,返回該月的最大日數,存放在49h
INC 31H
MOV A,31H
;秒加一 CJNE A,#3CH,EXIT MOV 31H,#00H
INC 32H
;分加一 MOV A,32H CJNE A,#3CH,EXIT MOV 32H,#00H INC 33H
;時加一 MOV A,33H CJNE A,#18H,EXIT MOV 33H,#00H INC 34H
MOV A,34H CJNE A,49H,EXIT MOV 34H,#01H INC 35H
MOV A,35H CJNE A,#0DH,EXIT MOV 35H,#01H INC 36H
MOV A,36H CJNE A,#64H,EXIT MOV 36H,#00H;年加一;月加一;日加一 EXIT:
RETI
ISYEAR: MOV A,36H;判斷平閏年
MOV B,#04H
DIV AB MOV A,B CJNE A,#00H,EXITYEAR1 MOV 48H,#01H
;閏年 SJMP EXITYEAR MOV 48H,#00H
;平年 EXITYEAR1: EXITYEAR: RETI
ISMONTH:
MOV A,35H
;開始檢查月份 CJNE A,#02H,NEXTMON1
;判斷二月 MOV R2,48H
CJNE R2,#00H,RUNNIAN MOV 49H,#1DH
;平年為28天,賦29給49h AJMP EXITMONTH RUNNIAN:MOV 49H,#1EH
;閏年為29天,賦30天給49h
AJMP EXITMONTH
NEXTMON1: CJNE A,#04H,NEXTMON2
AJMP XIAOYUE
NEXTMON2:CJNE A,#06H,NEXTMON3 AJMP XIAOYUE
NEXTMON3:CJNE A,#09H,NEXTMON4 AJMP XIAOYUE NEXTMON4:CJNE A,#0BH,DAYUE XIAOYUE: MOV 49H,#1FH
;四,六,九,十一月是小月,30天,但應該賦31天給比較值49h,AJMP EXITMONTH DAYUE: MOV 49H,#20H
;其他月份為大月,31天,賦32天給49h EXITMONTH: RETI END
第五篇:萬年歷單片機課程設計報告
課程設計報告 任務和設計要求
首先要學會安裝軟件,要熟悉會使用。系統設計 系統框圖 硬件設計 3.1 電路原理圖
課程設計報告
課程設計報告
課程設計報告
3.2 主要單元電路
3.3 元件清單 軟件設計 4.1 程序流程圖
課程設計報告
4.2程序清單
TIME_WEEK DATA 52H TIME_YEAR DATA 5DH TIME_MONTH DATA 5EH TIME_DATA DATA 5FH YEARH DATA 36H YEAR DATA 35H MONTH DATA 34H DAY DATA 33H HOUR DATA 32H MINUTE DATA 31H SEC DATA 30H
課程設計報告
AAA BIT P3.0 BBB BIT P3.1 AA BIT P3.3 BB BIT P3.4 CC BIT P3.5 BL BIT P3.2 BZ1 BIT 21H.0 TIMES DATA
20H COM
DATA
P1 ORG
0000H LJMP
START ORG
0003H RETI ORG
000BH LJMP INTT0 ORG
0013H RETI ORG
001BH RETI ORG
0023H RETI START:
課程設計報告
MOV
R0,#30H MOV
R7,#9 CLEETE: MOV
@R0,#00H INC
R0 DJNZ
R7,CLEETE MOV
TIMES,#00H MOV
TMOD,#01H MOV
TL0,#0C0H MOV
TH0,#63H MOV
SEC,#0 MOV
MINUTE,#0H MOV
HOUR,#0H MOV
DAY,#01H MOV
MONTH,#01H MOV
YEAR,#01H MOV
YEARH,#20H SETB
EA SETB
ET0 SETB
TR0 MOV
R4,#19 START1:
課程設計報告
CALL
DISP JNB
AA,SETMM1 JMP
START1 SETMM1: CALL
SETMM JMP START1 SETMM: CALL
DISP CALL
DISP JB AA,SETMM0 SETMM2: JNB AA,SETMM3 CLR ET0 CLR TR0 MOV
SEC,#0 MOV
TIMES,#01H MOV
R0,#MINUTE SETMM4: NOP INC22: CALL
OFFL CALL
INC11
課程設計報告
CALL
DISP JB AA,INC22 CALL DISP JB AA,INC22 INC R0 MOV A,TIMES RL A MOV TIMES,A JNB
TIMES.5, SETMM4 SETMM12: JNB AA , SETMM11 SETMM0: SETB
TR0 SETB
ET0 RET SETMM11: CALL DISP JMP
SETMM12 SETMM3: CALL
DISP JMP
SETMM2 INC11:
課程設計報告
MOV
R3,#40 INC111: MOV A,@R0 JB
BB,INC17 ADD
A,#1 DA A CALL INC000 INC13: JNB BB , INC14 INC17: MOV
@R0,A CALL
DISP DJNZ R3,INC111 RET INC14: CALL
DISP JMP
INC13 OFFL: MOV
22H,@R0 MOV
R6,#10 OFF1: MOV
R7,#10
課程設計報告
OFF2: MOV
@ R0, # 0AAH CALL
DISP DJNZ R7 , OFF2 DJNZ R6 , OFF1 MOV
@ R0 , 22H RET INC000: JB
TIMES.0, INC001 JB
TIMES.1, INC002 JB
TIMES.2, INC003 JB
TIMES.3, INC004 JB
TIMES.4, INC005 JMP
INCOUT INC005: CJNE A, #99H, INCOUT MOV
A,#00H JMP
INCOUT INC004: CJNE A, # 13H, INCOUT MOV
A,#01H JMP
INCOUT
課程設計報告
INC003: CJNE A,# 32H ,INCOUT MOV
A,#01H JMP
INCOUT INC002: CJNE A,#24H,INCOUT MOV
A,#00H JMP
INCOUT INC001: CJNE A,# 60H , INCOUT MOV
A,#00H INCOUT: RET INTT0: PUSH
ACC PUSH
PSW ORL TL0,#0C0H MOV
TH0,#63H DJNZ R4 , CLKE111 JMP
LOOP11 CLKE111: JMP
CLKE
課程設計報告
LOOP11: MOV
R4,#19H MOV
A,SEC ADD
A,#1 DA A MOV
SEC,A CJNE A, #60H , CLKE99 MOV
SEC,#0 MOV
A,MINUTE ADD
A,#1 DA A MOV
MINUTE,A CLK0: CJNE A, # 60H, CLKE MOV
MINUTE,#0 MOV
A,HOUR ADD
A,#1 DA
A MOV
HOUR,A CJNE A, # 24H, CLKE MOV
HOUR,#0 MOV
A,DAY
課程設計報告
ADD
A,#1 DA A MOV
DAY,A MOV
A,MONTH INC
A MOVC A, @A + PC SJMP
CLK1 DB
31H,28H,31H DB
30H,31H,30H DB
31H,31H,30H DB
00H,00H,00H DB
00H,00H,00H DB
31H,30H,31H CLK1: CLR C SUBB A,DAY JNC
CLKE MOV
A,MONTH CJNE A,#2,CLK3 MOV
A,YEAR ANL A,#13H JNB
ACC.4,CLK2
課程設計報告
ADD
A,#2 CLK2: ANL A,#3 JNZ
CLK3 MOV
A,DAY XRL A,#29H JZ
CLKE CLK3: MOV
DAY,#1 MOV
A,MONTH ADD
A,#1 DA
A MOV
MONTH,A CJNE A,#13H,CLKE MOV
MONTH,#1 MOV
A,YEAR ADD
A,#1 DA
A MOV
YEAR,A CLKE99: CALL
CONVERT CLKE:
課程設計報告
POP
PSW POP
ACC RETI DISP: PUSH
PSW PUSH
ACC MOV
23H,R0 DISP99: MOV
R1,#40H MOV
R0,#30H MOV
R2,#9 DISP1: MOV A,@R0 ANL A,#0FH MOV @R1,A MOV A,@R0 SWAP A ANL A,#0FH INC R1 MOV @R1,A DJNZ R2,DISP2 CALL DISPLAY
課程設計報告
MOV R0,23H POP ACC POP PSW RET DISP2: INC R1 INC R0 JMP DISP1 DISPLAY: MOV R1,#40H MOV R5,#19 SETB AAA PLAY: SETB BBB NOP CLR BBB CLR AAA MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV COM,A CALL DL1MS
課程設計報告
MOV COM,#0FFH DJNZ R5,PLAY1 CLR BBB SETB AAA RET PLAY1: INC R1 JMP PLAY TAB: DB 0C0H,0F9H,0A4H, 0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0A3H,8EH,0ABH DL1MS: MOV 25H,R7 MOV 24H,R6 MOV R7,#20 DS1: MOV R6,#10 DJNZ R6,$ DJNZ R7,DS1 MOV R7,25H MOV R6,24H RET
課程設計報告
START_YEAR EQU 01 CONVERT_YEAR DATA 5CH CONVERT_MONTH DATA 38H CONVERT_DATE DATA 37H TEMP_BYTE1 DATA 57H TEMP_BYTE2 DATA 58H TEMP_BYTE3 DATA 59H TEMP_BYTE4 DATA 5AH TEMP_BYTE5 DATA 5BH CONVERT: MOV A, YEAR MOV TIME_YEAR,A MOV A,MONTH MOV TIME_MONTH,A MOV A,DAY MOV TIME_DATA,A MOV A,TIME_YEAR MOV B,#16 DIV AB MOV CONVERT_YEAR,B MOV B,#10 MUL AB
課程設計報告
ADD A,CONVERT_YEAR MOV CONVERT_YEAR,A MOV A,TIME_MONTH JNB ACC.4,CON_02 CLR ACC.4 ADD A,#10 CON_02:MOV CONVERT_MONTH,A MOV A,TIME_DATA MOV B,#16 DIV AB MOV CONVERT_DATE,B MOV B,#10 MUL AB ADD A,CONVERT_DATE MOV CONVERT_DATE,A MOV DPTR,#MONTH_DATA MOV A,CONVERT_YEAR CON_06:CLR C SUBB A,#START_YEAR MOV B,#3 MUL AB ADD A,DPL
課程設計報告
MOV DPL,A MOV A,B ADDC A,DPH MOV DPH,A MOV A, #2 MOVC A, @A+DPTR CLR ACC.7 MOV B, #32 DIV AB MOV TEMP_BYTE1,A MOV TEMP_BYTE2,B MOV TEMP_BYTE3,#0 MOV A,CONVERT_MONTH CJNE A,#10,CON_08 CON_08:JC CON_09 MOV TEMP_BYTE3,#1 CON_09:MOV A,CONVERT_YEAR ANL A,#03H JNZ CON_10 MOV A,CONVERT_MONTH LCALL GET_RUN_DAYS_LOW SJMP CON_12
課程設計報告
CON_10:MOV A,CONVERT_MONTH LCALL GET_DAYS_LOW CON_12:MOV B,CONVERT_DATE DEC B ADD A,B MOV TEMP_BYTE4,A JNC CON_14 INC TEMP_BYTE3 CON_14:MOV A,TEMP_BYTE1 LCALL GET_DAYS_LOW DEC A ADD A,TEMP_BYTE2 MOV TEMP_BYTE5,A MOV A,CONVERT_MONTH CJNE A,TEMP_BYTE1,CON_20 MOV A,CONVERT_DATE CJNE A,TEMP_BYTE2,CON_20 CON_20:JC CON_22 LJMP CON_60 CON_22:MOV A,CONVERT_YEAR JNZ CON_24 MOV A,#100
課程設計報告
CON_24:DEC A MOV CONVERT_YEAR,A MOV A,DPL CLR C SUBB A,#3 MOV DPL,A JNC CON_26 DEC DPH CON_26:MOV A,TEMP_BYTE5 CLR C SUBB A,TEMP_BYTE4 MOV TEMP_BYTE3,A MOV CONVERT_MONTH,#12 CLR F0 CLR A MOVC A,@A+DPTR ANL A,#0F0H SWAP A;MOV TEMP_BYTE4,A JZ CON_30 MOV A, #2 MOVC A , @A+DPTR
課程設計報告
MOV C, ACC.7 MOV A, #1 MOVC A, @A+DPTR RLC A SJMP CON_34 CON_30:MOV A, #1 MOVC A, @A+DPTR CON_34:MOV TEMP_BYTE5, A CON_40:MOV A, TEMP_BYTE5 RRC A MOV TEMP_BYTE5, A JC CON_42 MOV B, #29 SJMP CON_44 CON_42:MOV B, #30 CON_44:MOV A, TEMP_BYTE3 CLR C SUBB A, B JZ CON_46 JNC CON_50 CPL A INC A
課程設計報告
CON_46: INC A MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_DATE, A MOV A, CONVERT_MONTH MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_MONTH, A MOV A, CONVERT_YEAR MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_YEAR, A CALL WEEK RET CON_50:MOV TEMP_BYTE3, A JB F0, CON_52
課程設計報告
DEC CONVERT_MONTH CON_52:MOV A, CONVERT_MONTH CJNE A, TEMP_BYTE4, CON_54 CPL F0 CON_54:SJMP CON_40 CON_60:MOV A, TEMP_BYTE4 CLR C SUBB A, TEMP_BYTE5 MOV TEMP_BYTE4, A JNC CON_62 DEC TEMP_BYTE3 CON_62:MOV CONVERT_MONTH, #1 CLR A MOVC A, @A+DPTR MOV TEMP_BYTE5, A ANL A, #0F0H SWAP A XCH A, TEMP_BYTE5 CLR F0 ANL A, #0FH MOV TEMP_BYTE1, A MOV A, #1
課程設計報告
MOVC A, @A+DPTR MOV TEMP_BYTE2, A ANL A, #0F0H ORL A, TEMP_BYTE1 SWAP A MOV TEMP_BYTE1, A MOV A, #2 MOVC A, @A+DPTR MOV C, ACC.7 MOV A, TEMP_BYTE2 ANL A, # 0FH SWAP A MOV ACC.3, C MOV TEMP_BYTE2, A CON_70:MOV A, TEMP_BYTE2 RLC A MOV TEMP_BYTE2, A MOV A, TEMP_BYTE1 RLC A MOV TEMP_BYTE1, A JC CON_72 MOV B, #29
課程設計報告
SJMP CON_74 CON_72:MOV B, #30 CON_74:MOV A, TEMP_BYTE4 CLR C SUBB A,B JNC CON_78 MOV B, A MOV A, TEMP_BYTE3 JZ CON_76 DEC TEMP_BYTE3 MOV TEMP_BYTE4, B SJMP CON_80 CON_76:MOV A, TEMP_BYTE4 LJMP CON_46
CON_78:MOV TEMP_BYTE4, A CON_80:MOV A, CONVERT_MONTH CJNE A, TEMP_BYTE5, CON_82 CPL F0 JNB F0, CON_82 SJMP CON_70 CON_82:INC CONVERT_MONTH SJMP CON_70
課程設計報告
GET_DAYS_LOW: MOVC A, @A+PC RET DB 0,31,59,90,120,151,181,212,243,17,48,78 GET_RUN_DAYS_LOW: MOVC A, @A+PC RET DB 0,31,60,91,121,152,182,213,244,18,49,79 MONTH_DATA:
DB 04DH,04AH,0B8H;2001 DB 00DH,04AH,04CH;2002 DB 00DH,0A5H,041H;2003 DB 025H,0AAH,0B6H;2004 DB 005H,06AH,049H;2005 DB 07AH,0ADH,0BDH;2006 DB 002H,05DH,052H;2007 DB 009H,02DH,047H;2008 DB 05CH,095H,0BAH;2009 DB 00AH,095H,04EH;2010 DB 00BH,04AH,043H;2011
課程設計報告
DB 04BH,055H,037H;2012 DB 00AH,0D5H,04AH;2013 DB 095H,05AH,0BFH;2014 DB 004H,0BAH,053H;2015 DB 00AH,05BH,048H;2016 DB 065H,02BH,0BCH;2017 DB 005H,02BH,050H;2018 DB 00AH,093H,045H;2019 DB 047H,04AH,0B9H;2020 DB 006H,0AAH,04CH;2021 DB 00AH,0D5H,041H;2022 DB 024H,0DAH,0B6H;2023 DB 004H,0B6H,04AH;2024 DB 069H,057H,03DH;2025 DB 00AH,04EH,051H;2026 DB 00DH,026H,046H;2027 DB 05EH,093H,03AH;2028 DB 00DH,053H,04DH;2029 DB 005H,0AAH,043H;2030 DB 036H,0B5H,037H;2031 DB 009H,06DH,04BH;2032 DB 0B4H,0AEH,0BFH;2033
課程設計報告
DB 004H,0ADH,053H;2034 DB 00AH,04DH,048H;2035 DB 06DH,025H,0BCH;2036 DB 00DH,025H,04FH;2037 DB 00DH,052H,044H;2038 DB 05DH,0AAH,038H;2039 DB 00BH,05AH,04CH;2040 DB 005H,06DH,041H;2041 DB 024H,0ADH,0B6H;2042 DB 004H,09BH,04AH;2043 DB 07AH,04BH,0BEH;2044 DB 00AH,04BH,051H;2045 DB 00AH,0A5H,046H;2046 DB 05BH,052H,0BAH;2047 DB 006H,0D2H,04EH;2048 DB 00AH,0DAH,042H;2049 DB 035H,05BH,037H;2050 DB 009H,037H,04BH;2051 DB 084H,097H,0C1H;2052 DB 004H,097H,053H;2053 DB 006H,04BH,048H;2054 DB 066H,0A5H,03CH;2055
課程設計報告
DB 00EH,0A5H,04FH;2056 DB 006H,0B2H,044H;2057 DB 04AH,0B6H,038H;2058 DB 00AH,0AEH,04CH;2059 DB 009H,02EH,042H;2060 DB 03CH,097H,035H;2061 DB 00CH,096H,049H;2062 DB 07DH,04AH,0BDH;2063 DB 00DH,04AH,051H;2064 DB 00DH,0A5H,045H;2065 DB 055H,0AAH,0BAH;2066 DB 005H,06AH,04EH;2067 DB 00AH,06DH,043H;2068 DB 045H,02EH,0B7H;2069 DB 005H ,02DH, 04BH;2070 DB 08AH, 095H, 0BFH;2071 DB 00AH, 095H, 053H;2072 DB 00BH, 04AH, 047H;2073 DB 06BH, 055H, 03BH;2074 DB 00AH, 0D5H, 04FH;2075 DB 005H, 05AH, 045H;2076 DB 04AH, 05DH, 038H;2077
課程設計報告
DB 00AH, 05BH, 04CH;2078 DB 005H, 02BH, 042H;2079 DB 03AH, 093H, 0B6H;2080 DB 006H, 093H, 049H;2081 DB 077H, 029H, 0BDH;2082 DB 006H, 0AAH, 051H;2083 DB 00AH, 0D5H, 046H;2084 DB 054H, 0DAH, 0BAH;2085 DB 004H, 0B6H, 04EH;2086 DB 00AH, 057H, 043H;2087 DB 045H, 027H, 038H;2088 DB 00DH, 026H, 04AH;2089 DB 08EH, 093H, 03EH;2090 DB 00DH, 052H, 052H;2091 DB 00DH, 0AAH, 047H;2092 DB 066H, 0B5H, 03BH;2093 DB 005H, 06DH, 04FH;2094 DB 004H, 0AEH, 045H;2095 DB 04AH, 04EH, 0B9H;2096 DB 00AH, 04DH, 04CH;2097 DB 00DH, 015H, 041H;2098 DB 02DH, 092H, 0B5H;2090
課程設計報告
DB 00DH, 053H, 049H;2100 TIME_WEEK1 DATA 52H WEEK: MOV A, TIME_YEAR MOV B, #16 DIV AB MOV TEMP_BYTE1, B MOV B, #10 MUL AB ADD A, TEMP_BYTE1 MOV TEMP_BYTE1, A MOV A, TIME_MONTH JB ACC.7, GETW02 MOV A, #100 ADD A, TEMP_BYTE1 MOV TEMP_BYTE1, A MOV A, TIME_MONTH CLR ACC.7 GETW02: JNB ACC.4, GETW04 ADD A , #10 CLR ACC.4 GETW04: MOV TEMP_BYTE2,A
課程設計報告
MOV A, TIME_DATA MOV B, #16 DIV AB MOV TEMP_BYTE3, B MOV B, #10 MUL AB ADD A, TEMP_BYTE3 MOV TEMP_BYTE3, A MOV A ,TEMP_BYTE1 ANL A, #03H JNZ GETW10 MOV A, TEMP_BYTE2 CJNE A, #3,GETW06 GETW06: JNC GETW10 DEC TEMP_BYTE3 GETW10: MOV A,TEMP_BYTE2 LCALL GET_CORRECT ADD A, TEMP_BYTE1 MOV B, #7 DIV AB
MOV A, TEMP_BYTE1
課程設計報告
ANL A, #0FCH RR A RR A ADD A, B ADD A, TEMP_BYTE3 MOV B, #7 DIV AB MOV A, B CJNE A, #0,OUTOUT MOV B, #8 OUTOUT: MOV TIME_WEEK, B RET GET_CORRECT: MOVC A, @A+PC RET DB 0,3,3,6,1,4,6,2,5,0,3,5 END 系統仿真及調試
課程設計報告 仿真結果及分析
課程設計報告
上圖為運行時的顯示,左邊兩個數碼管顯示器顯示的是年、月、日,中間的顯示的是時、分、秒,右邊顯示的是農歷日期以及星期。若想要調試時間,可通過右下方兩個并聯開關調試,左邊開關調試數碼管顯示位置,右邊的調試增1。此刻是2013年11月29日下午15:02,星期五,時間準確。訓練體會
在整個單片機課程設計中,想要做出這個完整的設計過程,必須突破幾個難點:
1、元件得找準卻,6路驅動可以用74LS244代替。
2、連線不能連錯,對應的輸入輸出端標上序號。
3、程序代碼不能敲錯。
4、由于單管顯示的星期數不穩定,可以采用雙管顯示。參考文獻:單片機課程設計指導。