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

QQ登錄

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

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

單片機(jī)秒表系統(tǒng)課程設(shè)計(jì) PPT文檔 程序 仿真下載

[復(fù)制鏈接]
ID:112317 發(fā)表于 2016-4-7 02:54 | 顯示全部樓層 |閱讀模式

秒表系統(tǒng)設(shè)計(jì)
設(shè)計(jì)要求:
以秒位
為單位,小數(shù)點(diǎn)后保留三位,最大計(jì)時(shí)時(shí)間99秒。
兩個(gè)控制按鍵K1-K2:
K1:計(jì)時(shí)開(kāi)始。
K2:計(jì)時(shí)停止,顯示當(dāng)前計(jì)時(shí)值。再次按下此鍵,計(jì)時(shí)值清除。


0.png


0.png 1.png

以上壓縮包所有資料下載: 單片機(jī)秒表課程設(shè)計(jì).rar (417.01 KB, 下載次數(shù): 51)

程序:
  1. #include<reg52.h>//52單片機(jī)包含的頭文件
  2. #define uint unsigned int //宏定義uint為無(wú)符號(hào)整形
  3. #define uchar unsigned char//宏定義uchar為無(wú)符號(hào)整形
  4. #define LCD P2//宏定義P2口為L(zhǎng)CD1602的并行口
  5. sbit rs=P3^0; //定義P3^0為L(zhǎng)CD1602的數(shù)據(jù)/命令選擇端
  6. sbit rw=P3^1;//定義P3^1為L(zhǎng)CD1602的讀/寫(xiě)選擇端
  7. sbit E=P3^2;//定義P3^2為L(zhǎng)CD1602的使能信號(hào)端
  8. sbit start=P3^3;//定義P3^3為開(kāi)始按鍵
  9. sbit control=P3^4;//定義P3^4為L(zhǎng)CD1602的停止與清零按鍵
  10. uchar s1,s2,s3,s4,s5; //定義s1為秒表的十位,s2為秒表的個(gè)位,s3為秒表的小數(shù)點(diǎn)后第一位,s4為秒表的小數(shù)點(diǎn)后第二位s5為秒表的小數(shù)點(diǎn)后第三位.
  11. uchar temp=0;//定義temp為多功能按鍵功能計(jì)數(shù)器
  12. uchar code tab[]="miao biao"; //顯示代碼
  13. uchar i,a;//定義隨機(jī)變量i,a;

  14. /**************************************************
  15.                  毫秒級(jí)延時(shí)子程序
  16. **************************************************/
  17. void delay(unsigned int k) //形參k為要延時(shí)的長(zhǎng)度
  18. {
  19.   unsigned int m,n;
  20.   for(m=k;m>0;m--)
  21.   for(n=50;n>0;n--);//讓程序空循環(huán)50*k次 延時(shí)k毫秒

  22. }
  23. /**************************************************
  24.                 LCD 1602寫(xiě)指令子程序
  25. **************************************************/

  26. write_com(uchar com) //形參com為要寫(xiě)的指令
  27. {
  28.   rs=0;//拉低LCD1602的數(shù)據(jù)/命令選擇端 1表示選擇數(shù)據(jù) 0表示選擇命令
  29.   rw=0;//拉低LCD1602的讀/寫(xiě)選擇端 1表示選擇數(shù)據(jù) 0表示選擇命令
  30.   E=1;//打開(kāi)使能LCD1602
  31.   LCD=com;//將命令寫(xiě)入LCD1602
  32.   delay(5);//延時(shí)5ms
  33.   E=0;  //關(guān)閉使能LCD1602 使使能端出現(xiàn)高電平

  34. }
  35. /**************************************************
  36.                 LCD 1602寫(xiě)數(shù)據(jù)子程序
  37. **************************************************/
  38. write_data(uchar dat)//寫(xiě)數(shù)據(jù)
  39. {
  40.   rs=1;//拉高LCD1602的數(shù)據(jù)/命令選擇端  ,1表示選擇數(shù)據(jù) 0表示選擇命令
  41.   rw=0;//拉低LCD1602的讀/寫(xiě)選擇端 ,1表示選擇數(shù)據(jù) 0表示選擇命令
  42.   E=1;//打開(kāi)使能LCD1602
  43.   LCD=dat;//將數(shù)據(jù)寫(xiě)入LCD1602
  44.   delay(5); //延時(shí)5ms
  45.   E=0; //關(guān)閉使能LCD1602 使使能端出現(xiàn)高電平

  46. }

  47. /**************************************************
  48.                 LCD 1602初始化子程序
  49. **************************************************/
  50. init_lcd()
  51. {

  52.   write_com(0x38);//顯示模式設(shè)置為0x38,表示設(shè)置為16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  53.   write_com(0x01);//顯示清屏 數(shù)據(jù)指針清零和所有數(shù)據(jù)清零
  54.   write_com(0x06); //顯示開(kāi)/關(guān)及光標(biāo)設(shè)置0000 01NS  N=1當(dāng)讀或?qū)懸粋(gè)字符后地址指針加一,且光標(biāo)加一
  55.                                                                                                           // N=0當(dāng)讀或?qū)懸粋(gè)字符后地址指針減一,且光標(biāo)減一
  56.                                                                                                           // S=1當(dāng)寫(xiě)一個(gè)字符整屏顯示左移(N=1)或右移(N=0)以得到光標(biāo)不移動(dòng)而屏幕移動(dòng)的效果
  57.                                                                                                           // S=0當(dāng)寫(xiě)一個(gè)字符整屏顯示不移動(dòng)
  58.   write_com(0x0c);//顯示開(kāi)/關(guān)及光標(biāo)設(shè)置0000 1DCB  D=1開(kāi)顯示    D=0關(guān)顯示
  59.                                                                                                            //C=1顯示光標(biāo)  C=0不顯示光標(biāo)
  60.                                                                                                            //B=1光標(biāo)閃爍  B=0光標(biāo)不閃爍
  61.           while(tab[i]!='\0')
  62.                 {
  63.                         write_com(0x80+i+0x04); // 設(shè)置顯示位置為第一行的第5個(gè)字符開(kāi)始顯示出'miaobiao',0x80為第一行第一個(gè)字符,0x04為第五個(gè)字符
  64.                         write_data(tab[i]);
  65.                         i++;
  66.                 }
  67. }
  68. /***************************************************************
  69.                    中斷和定時(shí)器初始化函數(shù)
  70. /**************************************************************/
  71. void init_clock(void)
  72. {
  73.         TMOD=0x01;//設(shè)置定時(shí)器0為工作方式M1M0=01是16位定時(shí)器/計(jì)數(shù)器
  74.         TH0=(65536-1000)/256;//定時(shí)器/計(jì)數(shù)器0的高八位重新賦初值
  75.         TL0=(65536-1000)%256;//定時(shí)器/計(jì)數(shù)器0的低八位重新賦初值
  76.         //以上兩行設(shè)置定時(shí)時(shí)間為50ms,以后只需改動(dòng)50000的數(shù)值即可
  77.     EA=0;//打開(kāi)總中斷
  78.         ET0=1;//定時(shí)器/計(jì)數(shù)器0的中斷打開(kāi),允許定時(shí)器/計(jì)數(shù)器0申請(qǐng)中斷
  79.         TR0=1;//啟動(dòng)定時(shí)器/計(jì)數(shù)器0
  80. }
  81. /***************************************************************
  82.                           主函數(shù)
  83. /**************************************************************/
  84. void main()
  85. {  
  86.         init_lcd();//初始化LCD1602
  87.     init_clock();//初始化中斷和定時(shí)器
  88.         while(1)//大循環(huán)
  89.         {
  90.                    write_com(0x80+0x40+5);// 設(shè)置顯示位置為第一行的第6個(gè)字符開(kāi)始顯示,0x80為第一行第一個(gè)字符
  91.                         write_data(0x30+s1); //顯示 秒表的十位

  92.                         write_com(0x80+0x40+6);// 設(shè)置顯示位置為第一行的第7個(gè)字符開(kāi)始顯示,0x80為第一行第一個(gè)字符
  93.                         write_data(s2+0x30);//顯示秒表的個(gè)位

  94.                write_com(0x80+0x40+7);// 設(shè)置顯示位置為第一行的第8個(gè)字符開(kāi)始顯示,0x80為第一行第一個(gè)字符

  95.                         write_data(':');//顯示一個(gè):號(hào)
  96.                        
  97.                         write_com(0x80+0x40+8);// 設(shè)置顯示位置為第一行的第9個(gè)字符開(kāi)始顯示,0x80為第一行第一個(gè)字符
  98.                         write_data(0x30+s3);//秒表的小數(shù)點(diǎn)后第一位
  99.                         write_com(0x80+0x40+9);// 設(shè)置顯示位置為第一行的第10個(gè)字符開(kāi)始顯示,0x80為第一行第一個(gè)字符
  100.                         write_data(0x30+s4);//秒表的小數(shù)點(diǎn)后第二位
  101.                         write_com(0x80+0x40+0x0a);// 設(shè)置顯示位置為第一行的第11個(gè)字符開(kāi)始顯示,0x80為第一行第一個(gè)字符
  102.                         write_data(0x30+s5);//秒表的小數(shù)點(diǎn)后第三位
  103.              if(start==0)//如果開(kāi)始按鍵按下
  104.                EA=1;  //打開(kāi)中斷
  105.              if(control==0)//如果停止與清零按鍵按下
  106.               {
  107.                  delay(100);//延時(shí)
  108.                  if(control==0)//再次判斷停止與清零按鍵是否按下
  109.                                  {  
  110.                     temp=temp+1;//按一次讓多功能按鍵功能計(jì)數(shù)器加一
  111.                     delay(100);//延時(shí)
  112.                                         while(!control);//按鍵松手檢測(cè)
  113.                                         if(temp>=2) temp=2;//使多功能按鍵功能計(jì)數(shù)器只有兩個(gè)功能
  114.                                   
  115.                  }
  116.               }
  117.             if(temp==1)//多功能按鍵功能計(jì)數(shù)器為功能1 停止
  118.               EA=0;//關(guān)閉中斷
  119.              if(temp==2)//多功能按鍵功能計(jì)數(shù)器為功能2 清零
  120.               {s1=0;s2=0;s3=0;s4=0;s5=0;temp=0;} //清零
  121.             
  122.                        
  123.         }
  124. }
  125. void exter1() interrupt 1 //中斷服務(wù)子程序,1代表定時(shí)器/計(jì)數(shù)器0中斷
  126. {
  127.         TH0=(65536-1000)/256;//定時(shí)器/計(jì)數(shù)器0的高八位重新賦初值
  128.         TL0=(65536-1000)%256;//定時(shí)器/計(jì)數(shù)器0的低八位重新賦初值
  129.     a++;  
  130.     //每進(jìn)入一次中斷函數(shù)歷時(shí)1ms,我們讓計(jì)時(shí)器a加1       

  131.                 if(a==1)//1毫秒到讓秒表的小數(shù)點(diǎn)后第三位加一
  132.                  {   a=0;//清零a
  133.                     s5++;//讓秒表的小數(shù)點(diǎn)后第三位加一
  134.                         if(s5==10)//10毫秒到讓秒表的小數(shù)點(diǎn)后第二位加一
  135.                          {
  136.                                  s5=0;//清零s5
  137.                                 s4++;//讓秒表的小數(shù)點(diǎn)后第二位加一
  138.                                 if(s4==10)//100毫秒到讓秒表的小數(shù)點(diǎn)后第一位加一
  139.                                 {
  140.                                         s4=0;//清零
  141.                                         s3++;//讓秒表的小數(shù)點(diǎn)后第一位加一
  142.                                         if(s3==10)//1秒到讓秒表的個(gè)位加一
  143.                                         {
  144.                                                 s3=0;//清零
  145.                                                 s2++;//讓秒表的個(gè)位加一
  146.                                                 if(s2==10)//10秒到讓秒表的十位加一
  147.                                                 {
  148.                                                         s2=0;//清零
  149.                                                         s1++;//讓秒表的十位加一
  150.                                                         if(s1==10) //100秒到讓秒表的小數(shù)點(diǎn)后第二位加一
  151.                                                         {s1=9;s2=9;s3=0;s4=0;s5=0;EA=0;}//計(jì)數(shù)到99秒 停止
  152.                                                 }
  153.                                         }
  154.                                 }
  155.                          }
  156.                  }
  157. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

ID:154795 發(fā)表于 2016-12-14 22:40 | 顯示全部樓層
buduoffff
回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除

本版積分規(guī)則

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

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

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