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