秒表系統設計 設計要求: 以秒位 為單位,小數點后保留三位,最大計時時間99秒。 兩個控制按鍵K1-K2: K1:計時開始。 K2:計時停止,顯示當前計時值。再次按下此鍵,計時值清除。
以上壓縮包所有資料下載:
單片機秒表課程設計.rar
(417.01 KB, 下載次數: 51)
2016-4-7 02:53 上傳
點擊文件名下載附件
程序:
- #include<reg52.h>//52單片機包含的頭文件
- #define uint unsigned int //宏定義uint為無符號整形
- #define uchar unsigned char//宏定義uchar為無符號整形
- #define LCD P2//宏定義P2口為LCD1602的并行口
- sbit rs=P3^0; //定義P3^0為LCD1602的數據/命令選擇端
- sbit rw=P3^1;//定義P3^1為LCD1602的讀/寫選擇端
- sbit E=P3^2;//定義P3^2為LCD1602的使能信號端
- sbit start=P3^3;//定義P3^3為開始按鍵
- sbit control=P3^4;//定義P3^4為LCD1602的停止與清零按鍵
- uchar s1,s2,s3,s4,s5; //定義s1為秒表的十位,s2為秒表的個位,s3為秒表的小數點后第一位,s4為秒表的小數點后第二位s5為秒表的小數點后第三位.
- uchar temp=0;//定義temp為多功能按鍵功能計數器
- uchar code tab[]="miao biao"; //顯示代碼
- uchar i,a;//定義隨機變量i,a;
- /**************************************************
- 毫秒級延時子程序
- **************************************************/
- void delay(unsigned int k) //形參k為要延時的長度
- {
- unsigned int m,n;
- for(m=k;m>0;m--)
- for(n=50;n>0;n--);//讓程序空循環50*k次 延時k毫秒
- }
- /**************************************************
- LCD 1602寫指令子程序
- **************************************************/
- write_com(uchar com) //形參com為要寫的指令
- {
- rs=0;//拉低LCD1602的數據/命令選擇端 1表示選擇數據 0表示選擇命令
- rw=0;//拉低LCD1602的讀/寫選擇端 1表示選擇數據 0表示選擇命令
- E=1;//打開使能LCD1602
- LCD=com;//將命令寫入LCD1602
- delay(5);//延時5ms
- E=0; //關閉使能LCD1602 使使能端出現高電平
-
- }
- /**************************************************
- LCD 1602寫數據子程序
- **************************************************/
- write_data(uchar dat)//寫數據
- {
- rs=1;//拉高LCD1602的數據/命令選擇端 ,1表示選擇數據 0表示選擇命令
- rw=0;//拉低LCD1602的讀/寫選擇端 ,1表示選擇數據 0表示選擇命令
- E=1;//打開使能LCD1602
- LCD=dat;//將數據寫入LCD1602
- delay(5); //延時5ms
- E=0; //關閉使能LCD1602 使使能端出現高電平
- }
- /**************************************************
- LCD 1602初始化子程序
- **************************************************/
- init_lcd()
- {
- write_com(0x38);//顯示模式設置為0x38,表示設置為16*2顯示,5*7點陣,8位數據接口
- write_com(0x01);//顯示清屏 數據指針清零和所有數據清零
- write_com(0x06); //顯示開/關及光標設置0000 01NS N=1當讀或寫一個字符后地址指針加一,且光標加一
- // N=0當讀或寫一個字符后地址指針減一,且光標減一
- // S=1當寫一個字符整屏顯示左移(N=1)或右移(N=0)以得到光標不移動而屏幕移動的效果
- // S=0當寫一個字符整屏顯示不移動
- write_com(0x0c);//顯示開/關及光標設置0000 1DCB D=1開顯示 D=0關顯示
- //C=1顯示光標 C=0不顯示光標
- //B=1光標閃爍 B=0光標不閃爍
- while(tab[i]!='\0')
- {
- write_com(0x80+i+0x04); // 設置顯示位置為第一行的第5個字符開始顯示出'miaobiao',0x80為第一行第一個字符,0x04為第五個字符
- write_data(tab[i]);
- i++;
- }
- }
- /***************************************************************
- 中斷和定時器初始化函數
- /**************************************************************/
- void init_clock(void)
- {
- TMOD=0x01;//設置定時器0為工作方式M1M0=01是16位定時器/計數器
- TH0=(65536-1000)/256;//定時器/計數器0的高八位重新賦初值
- TL0=(65536-1000)%256;//定時器/計數器0的低八位重新賦初值
- //以上兩行設置定時時間為50ms,以后只需改動50000的數值即可
- EA=0;//打開總中斷
- ET0=1;//定時器/計數器0的中斷打開,允許定時器/計數器0申請中斷
- TR0=1;//啟動定時器/計數器0
- }
- /***************************************************************
- 主函數
- /**************************************************************/
- void main()
- {
- init_lcd();//初始化LCD1602
- init_clock();//初始化中斷和定時器
- while(1)//大循環
- {
- write_com(0x80+0x40+5);// 設置顯示位置為第一行的第6個字符開始顯示,0x80為第一行第一個字符
- write_data(0x30+s1); //顯示 秒表的十位
- write_com(0x80+0x40+6);// 設置顯示位置為第一行的第7個字符開始顯示,0x80為第一行第一個字符
- write_data(s2+0x30);//顯示秒表的個位
- write_com(0x80+0x40+7);// 設置顯示位置為第一行的第8個字符開始顯示,0x80為第一行第一個字符
- write_data(':');//顯示一個:號
-
- write_com(0x80+0x40+8);// 設置顯示位置為第一行的第9個字符開始顯示,0x80為第一行第一個字符
- write_data(0x30+s3);//秒表的小數點后第一位
- write_com(0x80+0x40+9);// 設置顯示位置為第一行的第10個字符開始顯示,0x80為第一行第一個字符
- write_data(0x30+s4);//秒表的小數點后第二位
- write_com(0x80+0x40+0x0a);// 設置顯示位置為第一行的第11個字符開始顯示,0x80為第一行第一個字符
- write_data(0x30+s5);//秒表的小數點后第三位
- if(start==0)//如果開始按鍵按下
- EA=1; //打開中斷
- if(control==0)//如果停止與清零按鍵按下
- {
- delay(100);//延時
- if(control==0)//再次判斷停止與清零按鍵是否按下
- {
- temp=temp+1;//按一次讓多功能按鍵功能計數器加一
- delay(100);//延時
- while(!control);//按鍵松手檢測
- if(temp>=2) temp=2;//使多功能按鍵功能計數器只有兩個功能
-
- }
- }
- if(temp==1)//多功能按鍵功能計數器為功能1 停止
- EA=0;//關閉中斷
- if(temp==2)//多功能按鍵功能計數器為功能2 清零
- {s1=0;s2=0;s3=0;s4=0;s5=0;temp=0;} //清零
-
-
- }
- }
- void exter1() interrupt 1 //中斷服務子程序,1代表定時器/計數器0中斷
- {
- TH0=(65536-1000)/256;//定時器/計數器0的高八位重新賦初值
- TL0=(65536-1000)%256;//定時器/計數器0的低八位重新賦初值
- a++;
- //每進入一次中斷函數歷時1ms,我們讓計時器a加1
- if(a==1)//1毫秒到讓秒表的小數點后第三位加一
- { a=0;//清零a
- s5++;//讓秒表的小數點后第三位加一
- if(s5==10)//10毫秒到讓秒表的小數點后第二位加一
- {
- s5=0;//清零s5
- s4++;//讓秒表的小數點后第二位加一
- if(s4==10)//100毫秒到讓秒表的小數點后第一位加一
- {
- s4=0;//清零
- s3++;//讓秒表的小數點后第一位加一
- if(s3==10)//1秒到讓秒表的個位加一
- {
- s3=0;//清零
- s2++;//讓秒表的個位加一
- if(s2==10)//10秒到讓秒表的十位加一
- {
- s2=0;//清零
- s1++;//讓秒表的十位加一
- if(s1==10) //100秒到讓秒表的小數點后第二位加一
- {s1=9;s2=9;s3=0;s4=0;s5=0;EA=0;}//計數到99秒 停止
- }
- }
- }
- }
- }
- }
復制代碼
|