单片机综合实验源程序如下:
- #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)
|