找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4493|回復: 1
收起左側

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

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

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


0.png


0.png 1.png

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

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

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

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

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

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

  46. }

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

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

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

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

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

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



回復

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表