找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8880|回復(fù): 7
收起左側(cè)

帶LCD顯示的定時(shí)鬧鐘設(shè)計(jì)報(bào)告 帶PCB 原理圖 源程序

[復(fù)制鏈接]
ID:137190 發(fā)表于 2016-9-27 16:17 | 顯示全部樓層 |閱讀模式
0.png

設(shè)計(jì)報(bào)告,pcb,源碼等所有資料打包下載:
帶LCD顯示的定時(shí)鬧鐘.zip (1.08 MB, 下載次數(shù): 133)



------------------------------------------------------------------------
0.png
0.png


.系統(tǒng)調(diào)試過(guò)程

通過(guò)上面的硬件設(shè)計(jì)和軟件設(shè)計(jì)過(guò)程,設(shè)計(jì)的工作已經(jīng)基本完成,接下來(lái)的工作就是對(duì)所設(shè)計(jì)好的應(yīng)用系統(tǒng)進(jìn)行調(diào)試。通過(guò)調(diào)試可以檢查出系統(tǒng)出現(xiàn)的一些錯(cuò)誤,從而進(jìn)行下一步的修改。

(1)在Protel 99 SE中,對(duì)硬件電路圖進(jìn)行ERC電氣規(guī)則檢查。

1.064.jpg

圖 5-1  protel原理圖

1.065.jpg

圖5-2  ERC電氣規(guī)則檢查結(jié)果

1.066.jpg

                                  圖5-3 PCB圖

(2)程序調(diào)試

程序經(jīng)過(guò)調(diào)試顯示“0錯(cuò)誤,0警告”。表示程序調(diào)試通過(guò)。

1.067.jpg

圖5-3  程序調(diào)試通過(guò)示意圖

(3)protues調(diào)試
1.068.jpg

圖5-4 protues仿真圖

結(jié) 論

單片機(jī)是一門應(yīng)用性很強(qiáng)的學(xué)科,課程設(shè)計(jì)是培養(yǎng)我們綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn)、提出、分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)我們實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程。雖然在做課程設(shè)計(jì)以前已經(jīng)系統(tǒng)的把單片機(jī)課本認(rèn)真的學(xué)習(xí)了一下,但是在剛拿到設(shè)計(jì)任務(wù)書(shū)時(shí)還是有點(diǎn)一頭霧水,不知道該從哪里下手。令人欣慰的是經(jīng)過(guò)一周的學(xué)習(xí),雖然過(guò)程很艱辛,但是總算實(shí)現(xiàn)了定時(shí)鬧鐘的功能,所有的努力都很值得。這一周的大部分時(shí)間都在研究程序怎么處理,在這個(gè)過(guò)程中加深了我對(duì)匯編語(yǔ)言命令的應(yīng)用,而且也更加了解到軟硬件配套的重要性。

通過(guò)這次課程設(shè)計(jì),使我們對(duì)這們功課有了更深刻的認(rèn)識(shí)和了解。首先對(duì)于硬件電路的工作原理有了進(jìn)一步系統(tǒng)的學(xué)習(xí),同樣就有了進(jìn)一步的認(rèn)識(shí),使我懂得了理論與實(shí)際相結(jié)合的重要性,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),才能提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。其次軟件在這次設(shè)計(jì)中也有不足之處,比如音樂(lè)的響聲不連續(xù),但又不知道從哪個(gè)地方入手解決這個(gè)問(wèn)題,這要求在以后的學(xué)習(xí)中,拓寬自己的知識(shí)面,解決設(shè)計(jì)的不足之處。

總之,通過(guò)這次課程設(shè)計(jì)不僅使我鞏固了本課程所學(xué)的基本知識(shí),還使我們具有了撰寫(xiě)科研報(bào)告的初步訓(xùn)練能力,我相信這些能力在我們以后的工作或者是再學(xué)習(xí)中一定會(huì)起到不小的作用,一切的辛苦和艱難都是值得的。

致 謝

在陳飛老師的指導(dǎo)下,我完成了本次設(shè)計(jì)。本設(shè)計(jì)從選題到完成,都得到了陳老師細(xì)心的指導(dǎo)。另外,本設(shè)計(jì)的完成也離不開(kāi)其他老師和各位同學(xué)給我的建議和幫助,是他們讓我明白了團(tuán)隊(duì)合作的精神。當(dāng)然,這之中也有我自己的努力。這次課程設(shè)計(jì)最令我高興的是:遇到困難,翻閱書(shū)本解決困難的同時(shí)鞏固了已學(xué)知識(shí),也學(xué)到了新知識(shí)。在此,我謹(jǐn)向陳飛老師和幫助過(guò)我的老師和同學(xué)們,表示崇高的敬意和衷心的感謝!


源程序:
  1.                                                                                                 #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. uint miao,fen,fen1,shi,shi1,flag1,flag2,flag3,aa,K1num,K2num,K3num,K4num,N;        //K1num-K1按鍵被按下的標(biāo)記變量,K2num-K2按鍵被按下的標(biāo)記變量,K3num=0-K3按鍵被按下的標(biāo)記變量
  5. uchar code table[]="  TIMING CLOCK";        //定義初始上電時(shí)液晶默認(rèn)顯示狀態(tài)
  6.         
  7. sbit K1=P1^0;        //四個(gè)按鍵
  8. sbit K2=P1^1;
  9. sbit K3=P1^2;
  10. sbit K4=P1^3;
  11. sbit rs=P2^0;
  12. sbit lcden=P2^2;
  13. sbit led=P2^3;        //發(fā)光二極管控制端
  14. sbit beep=P2^4;   //蜂鳴器控制端
  15. sbit relay=P2^5;                //繼電器控制端
  16. void delay(uint z)        //延時(shí)函數(shù)
  17. {
  18.         uint x,y;
  19.         for(x=z;x>0;x--)
  20.                 for(y=110;y>0;y--);
  21. }

  22. void write_com(uchar com)        //液晶寫(xiě)命令函數(shù)
  23. {
  24.         rs=0;
  25.         lcden=0;
  26.         P0=com;
  27.         delay(5);
  28.         lcden=1;
  29.         delay(5);
  30.         lcden=0;        
  31. }

  32. void write_date(uchar date)                //液晶寫(xiě)數(shù)據(jù)函數(shù)
  33. {
  34.         rs=1;
  35.         lcden=0;
  36.         P0=date;
  37.         delay(5);
  38.         lcden=1;
  39.         delay(5);
  40.         lcden=0;        
  41. }

  42. void write_sfm(uchar add,uchar date)        //液晶寫(xiě)時(shí)分秒函數(shù)
  43. {
  44.         uchar shi,ge;
  45.         shi=date/10;
  46.         ge=date%10;
  47.         write_com(0x80+0x40+add);
  48.         write_date(0x30+shi);
  49.         write_date(0x30+ge);
  50. }

  51. void init()                //初始化函數(shù)
  52. {        
  53.         uint num;        //寫(xiě)液晶的循環(huán)控制變量
  54.         aa=0;                //中斷次數(shù)標(biāo)志
  55.         K1num=0;        //K1按鍵被按下的標(biāo)記變量
  56.         K2num=0;        //K2按鍵被按下的標(biāo)記變量
  57.         K3num=0;        //K3按鍵被按下的標(biāo)記變量
  58.         K4num=0;
  59.         flag1=1;        //控制lcd屏刷新的變量
  60.         flag2=1;        //控制鬧鐘響鬧和繼電器開(kāi)啟關(guān)閉的標(biāo)記
  61.         flag3=1;        //控制鬧鐘響起時(shí),按下K4停止鬧鐘響鬧的標(biāo)記
  62.         led=1;           //發(fā)光二極管初始化
  63.         relay=0;        //繼電器初始化
  64.         N=100;                //系統(tǒng)啟動(dòng)時(shí),鬧鐘時(shí)間到發(fā)出的聲音為連續(xù)三次發(fā)出“嘩”的一聲
  65.         miao=0;                //系統(tǒng)初始化時(shí)間
  66.         fen=0;
  67.         shi=0;
  68.         fen1=1;                //初始化鬧鐘的時(shí)間
  69.         shi1=0;
  70.         beep=0;                //蜂鳴器初始化
  71.         lcden=0;        //液晶使能端初始化
  72.         write_com(0x38);        //1602液晶初始化,設(shè)置16*2顯示。5*7點(diǎn)陣,8位數(shù)據(jù)接口
  73.         write_com(0x0c);        //設(shè)置開(kāi)顯示,不顯示光標(biāo)        
  74.         write_com(0x06);        //寫(xiě)一個(gè)字符后地址指針自動(dòng)加1
  75.         write_com(0x01);        //顯示清0,數(shù)據(jù)指針清0
  76.         write_com(0x80);        //將數(shù)據(jù)指針定位到第一行,第一個(gè)字處
  77.         for(num=0;num<15;num++)                //顯示鬧鐘標(biāo)示:TIMING CLOCK
  78.         {
  79.                         write_date(table[num]);
  80.                         delay(10);
  81.         }
  82.         write_com(0x80+0x40+7);//寫(xiě)出時(shí)間顯示部分的兩個(gè)冒號(hào)
  83.         write_date(':');

  84.         write_sfm(8,fen);        //送去液晶顯示秒,分,時(shí)
  85.         write_sfm(5,shi);
  86.         TMOD=0x01;        //設(shè)置定時(shí)器0為工作方式1
  87.         TH0=(65536-50000)/256;                //定時(shí)器裝初值
  88.         TL0=(65536-50000)%256;
  89.         EA=1;        //開(kāi)總中斷
  90.         ET0=1;        //開(kāi)定時(shí)器0中斷
  91.         TR0=1;        //啟動(dòng)定時(shí)器0

  92. }

  93. void keyscan()                //鍵盤掃描函數(shù)
  94. {        
  95.         if(K1==0&&K3num==0)                //判斷K1按下,按下前沒(méi)有按下K3鍵,則開(kāi)始修改時(shí)間
  96.         {
  97.                 delay(5);
  98.                 if(K1==0&&K1num==0)
  99.                 {        
  100.                         
  101.                         K1num=1;        
  102.                         while(!K1)                //判斷是否松開(kāi)按鍵,后同
  103.                         if(K1num==1)
  104.                         {
  105.                                 TR0=0;                //關(guān)閉計(jì)數(shù)器0
  106.                                 write_com(0x80+0x40+9);                //第一次按下光標(biāo)定位到分鐘位置
  107.                                 write_com(0x0f);         //光標(biāo)開(kāi)始閃爍               
  108.                         }
  109.                 }
  110.         }


  111.         if(K3==0&&K3num==0&&K1num==0)                //判斷K3首次被按下,則設(shè)置鬧鐘
  112.         {
  113.                 delay(5);        //延時(shí)消抖,后同
  114.                 if(K3==0)
  115.                 {        
  116.                         flag1=0;
  117.                         write_com(0x80+0x40+9);                //第一次按下光標(biāo)定位到分鐘位置
  118.                         while(!K3);
  119.                         K3num=1;
  120.                         write_sfm(8,fen1);        //送去液晶顯示定時(shí)的分,時(shí)
  121.                         write_sfm(5,shi1);
  122.                         write_com(0x0f);        //光標(biāo)開(kāi)始閃爍
  123.                         write_com(0x80+0x40+9);        //顯示位置回到調(diào)節(jié)處
  124.                 }
  125.         }

  126.         if(K1==0&&K1num==1)                //判斷K1按下,修改系統(tǒng)時(shí)間的小時(shí)
  127.         {
  128.                 delay(5);
  129.                 if(K1==0)
  130.                 {        
  131.                         write_com(0x80+0x40+6);        //光標(biāo)定位到小時(shí)位置
  132.                         K1num=1;        //置K1num=1
  133.                         while(!K1);
  134.                         shi++;         //則調(diào)整時(shí)加1
  135.                         if(shi==24) shi=0;        //若滿24后將清零
  136.                         write_sfm(5,shi);        //每調(diào)節(jié)一次送液晶顯示一下
  137.                         write_com(0x80+0x40+6);        //顯示位置重新回到調(diào)節(jié)處
  138.                 }
  139.                
  140.         }               
  141.         
  142.         
  143.         if(K2==0&&K1num==1)                //判K2按下,修改系統(tǒng)時(shí)間的分鐘
  144.         {
  145.                 delay(5);
  146.                 if(K2==0)
  147.                 {        
  148.                         write_com(0x80+0x40+9);                //光標(biāo)定位到分鐘位置
  149.                         K1num=1;
  150.                         while(!K2);
  151.                         fen++;         //則調(diào)整分加1
  152.                         if(fen==60)        fen=0;//若滿60后將清零
  153.                         write_sfm(8,fen);        //每調(diào)節(jié)一次送液晶顯示一下
  154.                         write_com(0x80+0x40+9);        //顯示位置重新回到調(diào)節(jié)處
  155.                 }
  156.         }

  157.         if(K1num==1||K3num==1)        //當(dāng)設(shè)置時(shí)間或鬧鐘時(shí),K3被按下設(shè)置完成。
  158.         {
  159.                 if(K3==0)                //判斷K3按下
  160.                 {
  161.                         delay(5);
  162.                         if(K3==0)
  163.                         {
  164.                                 K1num=0;
  165.                                 K3num=0;
  166.                                 while(!K3);
  167.                                 write_com(0x0c);        //取消光標(biāo)閃
  168.                                 TR0=1;        //啟動(dòng)定時(shí)器使時(shí)鐘開(kāi)始走
  169.                                 flag1=1;        //flag=1.則修改系統(tǒng)時(shí)間時(shí)液晶顯示的系統(tǒng)時(shí)間值,flag=0,則為修改鬧鐘時(shí)間時(shí),屏幕顯示的是修改鬧鐘時(shí)間的值
  170.                                 write_sfm(8,fen);//送去液晶顯示分,時(shí)
  171.                                 write_sfm(5,shi);
  172.                         }
  173.                 }
  174.         }
  175.         if(K2==0&&K1num==0&&K3num==0)        //K2被按下時(shí)顯示定時(shí)時(shí)間
  176.         {
  177.                 delay(5);
  178.                 if(K2==0)
  179.                 {        
  180.                         write_sfm(8,fen1);        //送去液晶顯示定時(shí)的分,時(shí)
  181.                         write_sfm(5,shi1);
  182.                         while(!K2);        
  183.                         write_sfm(8,fen);        //K2松開(kāi)顯示當(dāng)前時(shí)間
  184.                         write_sfm(5,shi);

  185.                 }
  186.         }


  187.         if(K1==0&&K3num==1)                //修改小時(shí),判斷K1鍵按下,K3num=1,表示K3按鍵按下,則此時(shí)修改的是鬧鐘時(shí)間的小時(shí)
  188.         {        
  189.                 delay(5);
  190.                 if(K1==0)
  191.                 {        
  192.                         write_com(0x80+0x40+6);        //光標(biāo)定位到小時(shí)位置
  193.                         K3num=1;
  194.                         while(!K1);
  195.                         shi1++;         //則調(diào)整定時(shí)的時(shí)加1
  196.                         if(shi1==24)        //若滿24后將清零
  197.                         shi1=0;
  198.                         write_sfm(5,shi1);        //每調(diào)節(jié)一次送液晶顯示一下
  199.                         write_com(0x80+0x40+6);        //顯示位置重新回到調(diào)節(jié)處
  200.                 }
  201.         }
  202.         
  203.         if(K2==0&&K3num==1)                //卸螷2按下,修改鬧鐘時(shí)間的分鐘
  204.         {
  205.                 delay(5);
  206.                 if(K2==0)
  207.                 {        
  208.                         write_com(0x80+0x40+9);                //光標(biāo)定位到分鐘位置
  209.                         K3num=1;
  210.                         while(!K2);
  211.                         fen1++;         //則調(diào)整分加1
  212.                         if(fen1==60)        //若滿60后將清零
  213.                         fen1=0;
  214.                         write_sfm(8,fen1);        //每調(diào)節(jié)一次送液晶顯示一下
  215.                         write_com(0x80+0x40+9);        //顯示位置重新回到調(diào)節(jié)處
  216.                 }
  217.         }
  218.         

  219.         if(K4==0&&flag3==0)                //當(dāng)鬧鐘響起時(shí),按下K4停止響鬧,當(dāng)鬧鐘響起時(shí)候flag3置為1
  220.         {
  221.                 delay(5);
  222.                 if(K4==0)
  223.                 {        
  224.                         flag2=0;
  225.                         flag3=1;        //此處需置flag3為1,否則鬧鐘沒(méi)有響起的時(shí)候按下K4鍵,程序會(huì)執(zhí)行此句
  226.                 }
  227.         }
  228.         if(K4==0&&flag3==1&&K4num==0)        //K4按下設(shè)置鬧鐘的狀態(tài)為ON或OFF,flag3=1,表示鬧鐘此時(shí)沒(méi)響起。K4num==0,表示此時(shí)為ON狀態(tài)。
  229.         {
  230.                 delay(5);
  231.                 {
  232.                         K4num=1;        
  233.                 }
  234.         }
  235.         if(K4==0&&flag3==1&&K4num==1)        //K4按下設(shè)置鬧鐘的狀態(tài)為ON或OFF,flag3=1,表示鬧鐘此時(shí)沒(méi)響起。K4num==1,表示此時(shí)為OFF狀態(tài)。
  236.         {
  237.                 delay(5);
  238.                 {
  239.                         K4num=0;        
  240.                 }
  241.         }        
  242. }

  243. void clock()        //        鬧鐘函數(shù) K4—鬧鈴ON/OFF的狀態(tài)設(shè)置,設(shè)置為ON時(shí)連續(xù)三次發(fā)出“嘩”的一聲,設(shè)置為OFF發(fā)出“嘩”的一?
  244. {
  245.         if((fen==fen1)&&(shi==shi1)&&(flag2==1)&&(K4num==0))                //鬧鐘的響鬧控制                                
  246.         {
  247.                 beep=1;                //此時(shí)鬧鐘響起,連續(xù)三次發(fā)出嘩的一聲
  248.                 relay=1;        //鬧鐘時(shí)間到,則繼電器啟動(dòng)
  249.                 flag3=0;        //置flag3=0,表示此時(shí)鬧鐘響起,按下K4鍵執(zhí)行停止鬧鐘響鬧語(yǔ)句
  250.                 delay(100);        //這些語(yǔ)句是為了使鬧鐘響起時(shí),發(fā)出連續(xù)三次嘩的聲音
  251.                 beep=0;
  252.                 delay(100);
  253.                 beep=1;
  254.                 delay(100);
  255.                 beep=0;
  256.                 delay(100);
  257.                 beep=1;
  258.                 delay(100);
  259.                 beep=0;
  260.                 delay(300);
  261.         }
  262.         else if((fen==fen1)&&(shi==shi1)&&(flag2==1)&&(K4num==1))                //鬧鐘的響鬧控制                                
  263.         {
  264.                 beep=1;                //此時(shí)鬧鐘響起,發(fā)出嘩的一聲
  265.                 relay=1;        //鬧鐘時(shí)間到,則繼電器啟動(dòng)
  266.                 flag3=0;        //置flag3=0,表示此時(shí)鬧鐘響起,按下K4鍵執(zhí)行停止鬧鐘響鬧語(yǔ)句
  267.         }
  268.         else
  269.         {
  270.                 beep=0;
  271.                 relay=0;
  272.         }
  273. }
  274. void main()                        //主函數(shù)
  275. {        
  276.         
  277.         init();//初始化子程序
  278.         while(1)
  279.         {        
  280.                 keyscan();
  281.                 clock();
  282.         }
  283. }

  284. void time0() interrupt 1        //定時(shí)器0中斷服務(wù)程序
  285. {
  286.         TH0=(65536-50000)/256;        //定時(shí)器重新裝入數(shù)值
  287.         TL0=(65536-50000)%256;
  288.         aa++;        //中斷次數(shù)累加                        

  289.         if(aa==20)        //20次50毫秒為1秒
  290.         {               
  291.                 aa=0;
  292.                 miao++;
  293.                 led=~led;
  294.                 if(miao==60)
  295.                         {
  296.                                 miao=0;
  297.                                 fen++;
  298.                                 flag2=1;//鬧鐘響起時(shí)按下K4鍵鬧鐘關(guān)閉,此處應(yīng)重置該變量,使下一次鬧鐘時(shí)間來(lái)到時(shí),鬧鐘仍然可以響起
  299.                                 if(fen==60)
  300.                                 {
  301.                                         fen=0;
  302.                                         shi++;
  303.                                         if(shi==24)
  304.                                         {
  305.                                                 shi=0;
  306.                                         }
  307.                                         if(flag1==1)
  308.                                         {write_sfm(5,shi);}        //小時(shí)發(fā)生變化則立即吸入屏幕顯示
  309.                                 }
  310.                                 if(flag1==1)
  311.                                 {write_sfm(8,fen);}        //分鐘發(fā)生變化則立即吸入屏幕顯示
  312.                         }
  313.                         
  314.                 }        

  315. }

復(fù)制代碼



相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:206457 發(fā)表于 2017-6-2 16:21 | 顯示全部樓層
參考學(xué)習(xí)下~謝謝
回復(fù)

使用道具 舉報(bào)

ID:265141 發(fā)表于 2017-12-22 09:33 | 顯示全部樓層
有聯(lián)系方式嗎?
回復(fù)

使用道具 舉報(bào)

ID:407230 發(fā)表于 2018-10-10 22:24 | 顯示全部樓層
很不錯(cuò)的參考
回復(fù)

使用道具 舉報(bào)

ID:414426 發(fā)表于 2018-11-7 18:56 | 顯示全部樓層
運(yùn)行不得。。。。
回復(fù)

使用道具 舉報(bào)

ID:432516 發(fā)表于 2018-11-24 19:09 | 顯示全部樓層
參考學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

ID:435622 發(fā)表于 2018-11-30 08:29 來(lái)自手機(jī) | 顯示全部樓層
原理圖打不開(kāi)
回復(fù)

使用道具 舉報(bào)

ID:413630 發(fā)表于 2018-12-25 15:05 | 顯示全部樓層
牛牛牛
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表