标题:
ce单片机综合实验程序
[打印本页]
作者:
我是你爸爸1111
时间:
2018-6-6 00:07
标题:
ce单片机综合实验程序
单片机综合实验源程序如下:
#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
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1