單片機綜合實驗源程序如下:
- #include<reg52.h>
- #include "disp.h"
- #include "text.h"
- #include "readkey.h"
- uint code pulse_tab[100]={//脈沖數
- 213, 224, 235, 246, 258, 270, 283, 296, 310, 324,
- 339, 354, 370, 387, 404, 421, 439, 458, 477, 497,
- 518, 539, 561, 583, 606, 630, 654, 680, 705, 731,
- 758, 786, 814, 843, 873, 903, 934, 965, 997,1030,
- 1063,1097,1131,1166,1202,1238,1274,1311,1348,1386,
- 1424,1463,1502,1542,1581,1621,1662,1702,1743,1784,
- 1825,1867,1908,1950,1991,2033,2075,2116,2158,2200,
- 2241,2283,2324,2365,2406,2447,2487,2527,2567,2607,
- 2646,2686,2724,2763,2801,2838,2876,2913,2949,2985,
- 3020,3056,3090,3124,3158,3191,3224,3256,3288,3319};
- //uchar code tab[]={0x4f,0xbf,0xdf,0xef,0xf4,0xfb,0xfd,0xfe,0xff};//串行口
- void work_0();//時鐘模塊
- void work_1();//時間設置模塊
- void work_2();//鬧鐘時間設置模塊
- void work_3();//溫度顯示模塊
- void rkey();//矩陣鍵盤按鍵解釋
- //void work_4();
- void init();//初始化函數
- void Delay();//延時函數
- void init()
- {
- TMOD=0x51; //T1作計數器 T0作定時器 工作方式1
- SCON=0X00;
- // TCON=0x00;
- TH0=0xf0;
- TL0=0x60;
- TR0=1;
- msta=0;
- // cnt1=0;
- xs=0;
- // buf0=0;
- num4=1;//時鐘顯示初始值
- num3=4;
- num2=3;
- num1=0;
- nz4=1; //鬧鐘初始值
- nz3=4;
- nz2=3;
- nz1=1;
- }
- void main()
- {
- init();
- while(1)
- {
- while(!TF0);
- TH0=0xF0;
- TL0=0x60;
- TF0=0;
- readkey();
- disp(light,num4,num3,num2,num1);
- switch(msta)
- {
- case 0:
- work_0();
- break;
- case 1:
- work_1();
- break;
- case 2:
- work_2();
- break;
- case 3:
- work_3();
- // case 4:
- // work_4();
- // break;
- default:break;
- }
- }
- }
- void work_0() //時鐘模塊
- {
- light=18;
- mcnt1++;
- if(nz1==num1 && nz2==num2 && nz3==num3 && nz3==num3&&dp_1==1)//到設定鬧鐘的時間
- { //串行數碼管顯示“三”
- SBUF = 0x6d;
- // flon=1;
- // tzsta++;
- // if(tzsta>=4)
- // tzsta=0;
- }
- else
- {
- SBUF =0xff;
- // flon=0;
- }
- if(mcnt1>=125)//500ms到
- {
- dp_1^=1;
- a++;
- mcnt1=0;
- }
- if(a>120) //1s到
- {a=0;
- num1++; //秒滿60,秒歸零,向分進位
- if(num1>=0x0a)
- {num1=0;
- num2++;
- if(num2>=0x06)
- {num2=0; //分滿60,分歸零,
- if(num4<2) //時的十位在小于2區間,即十位為0或為1時
- {num3++; //時的個位可取0到9,即可以從0加到9
- if(num3>=0x0a)
- {num3=0; //時的個位滿10,歸零,向十位進一
- num4++;
- }
- }
- else //當十位大于等于2時
- {num3++; //時的個位正常增加
- if(num3>=0x05) //直到時的個位因分為60進1,由4變為5的瞬間
- {num1=num2=num3=num4=0; //各個顯示位都被置零
- }
- }
- }
- }
- }
-
- if(sw1)//跳轉時間設置模塊
- {
- msta=1;
- flon=1;
- dp_1=1;
- }
- if(K9) //跳轉鬧鐘設置模塊
- {
- msta=2;
- num11=num1;//存儲當前時間
- num22=num2;
- num33=num3;
- num44=num4;
- }
- if(sw2)//跳轉溫度計模塊
- {
- msta=3;
- flon=0;
- dp_1=0;
- num11=num1; //存儲當前時間
- num22=num2;
- num33=num3;
- num44=num4;
- }
-
- }
- void work_1() //時間設置
- {
- light=19;
- if(sw1)//跳轉時鐘模塊
- {
- msta=0;
- flon=0;
- }
- if(K9) //跳轉鬧鐘設置模塊
- {
- msta=2;
- num11=num1;//存儲當前時間
- num22=num2;
- num33=num3;
- num44=num4;
- }
- if(K11)//選擇閃控位
- {
- tzsta++;
- if(tzsta>=4)
- tzsta=0;
- }
- if(K10)
- {
- switch(tzsta)//設置
- {
- case 0: num1++;
- if(num1>=0x0a)
- num1=0;
- break;
- case 1: num2++;
- if(num2>=0x06)
- num2=0;
- break;
- case 2: num3++;
- if(num3>=0x0a)
- num3=0;
- break;
- case 3: num4++;
- if(num4>=0x06)
- num4=0;
- break;
- default: break;
- }
- }
- }
- void work_2() //鬧鐘設置
- {
- light=20;
- num1=nz1;
- num2=nz2;
- num3=nz3;
- num4=nz4;
- if(sw1) //跳轉時鐘模塊
- {
- msta=0;
- flon=0;
- num1=num11;
- num2=num22;
- num3=num33;
- num4=num44;
- }
- if(K11)
- {
- tzsta++;
- if(tzsta>=4)
- tzsta=0;
- }
- rkey();
- switch(tzsta)//設置
- {
- case 0: if(K10)
- {nz1=xs;
- num1=xs;}
- break;
- case 1: if(K10)
- {nz2=xs;
- num2=xs;}
- break;
- case 2: if(K10)
- {nz3=xs;
- num3=xs;}
- break;
- case 3: if(K10)
- {nz4=xs;
- num4=xs;}
- break;
- default: break;
- }
- }
- void work_3()//顯示溫度
- {
- uint a,b;
- light=21;
- pulse_cnt++;//脈沖時間計數
- if(pulse_cnt>=25)
- {
- pulse_cnt=0;
- TR1=0;
- t_1=TH1;
- t_0=TL1;
- TH1=TL1=0;
- TR1=1;
- }
- tt=(t_1<<8)+t_0;
- if(tt>pulse_tab[x])x++;
- else
- if(tt<=pulse_tab[x-1]&&x!=0)x--;
-
- a=tt-pulse_tab[x];
- b=pulse_tab[x]-tt;
-
- if(b<=a)y=x-1;
- else y=x;
-
- num4=16; //顯示溫度
- num3=y/10;
- num2=y%10;
- num1=12;
- if(sw2) //返回時鐘模塊
- {
- msta=0;
- num1=num11;
- num2=num22;
- num3=num33;
- num4=num44;
- }
- // if(K0) //脈沖數測試
- // {
- // num4=buf2/1000;
- // num3=buf2%1000/100;
- // num2=buf2%100/10;
- // num1=buf2%10;
- // }
- }
- //void work_4()
- //{ mcnt1++;
- // light=18;
- // SBUF = 0x6d;
- // flon=1;
- // tzsta++;
- // if(tzsta>=4)
- // tzsta=0;
- // if(mcnt1>=125)//500ms到
- // {
- // dp_1^=1;
- // a++;
- // mcnt1=0;
- // }
- //
- // if(a>120) //1s到
- // {a=0;
- // num1++; //秒滿60,秒歸零,向分進位
- // if(num1>=0x0a)
- // {num1=0;
- // num2++;
- // if(num2>=0x06)
- // {num2=0; //分滿60,分歸零,
- // if(num4<2) //時的十位在小于2區間,即十位為0或為1時
- // {num3++; //時的個位可取0到9,即可以從0加到9
- // if(num3>=0x0a)
- // {num3=0; //時的個位滿10,歸零,向十位進一
- // num4++;
- // }
- // }
- // else //當十位大于等于2時
- // {num3++; //時的個位正常增加
- // if(num3>=0x05) //直到時的個位因分為60進1,由4變為5的瞬間
- // {num1=num2=num3=num4=0; //各個顯示位都被置零
- // }
- // }
- // }
- // }
- // }
- // if(K8)
- // {
- // msta=0;
- // flon=0;
- // SBUF =0xff;
- // }
- // if(sw1)//跳轉時間設置模塊
- // {
- // msta=1;
- // flon=1;
- // dp_1=1;
- // }
- // if(K9) //跳轉鬧鐘設置模塊
- // {
- // msta=2;
- // num11=num1;//存儲當前時間
- // num22=num2;
- // num33=num3;
- // num44=num4;
- // }
- // if(sw2)//跳轉溫度計模塊
- // {
- // msta=3;
- // flon=0;
- // dp_1=0;
- // num11=num1; //存儲當前時間
- // num22=num2;
- // num33=num3;
- // num44=num4;
- // }
- //
- //
- //}
- void rkey() //矩陣鍵盤掃描按鍵解釋
- {
- if(K0)xs=0;
- if(K1)xs=1;
- if(K2)xs=2;
- if(K3)xs=3;
- if(K4)xs=4;
- if(K5)xs=5;
- if(K6)xs=6;
- if(K7)xs=7;
- if(K8)xs=8;
- if(K9)xs=9;
- }
- void Delay(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<100;j++);
- }
復制代碼
所有資料51hei提供下載:
ce綜合.rar
(68.45 KB, 下載次數: 5)
2018-6-6 00:06 上傳
點擊文件名下載附件
單片機實驗 下載積分: 黑幣 -5
|