新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机 定时器 流水灯 数码管计时

51单片机 定时器 流水灯 数码管计时

作者: 时间:2016-11-25 来源:网络 收藏
这个就是前面的历程的一个综合定时器T0控制流水灯,T1控制时间,通过数码管显示出来。

代码如下:

本文引用地址://m.amcfsurvey.com/article/201611/321309.htm

//Led流水灯,五位数码管100000秒计时
#include//头文件
#include//循环左旋函数所在头文件
#define uint unsigned int//宏定义无符号整形
#define uchar unsigned char//宏定义无符号字符型
sbit weixuan=P2^7;//声明P2.7为位选端口
sbit duanxuan=P2^6;//声明P2.6为段选端口
uint number1,number2,aa,number; //number1:T0计满次数;number2:T1计满次数;number:显示的秒数;aa:P0端口显示赋值
uint no1,no2,no3,no4,no5;//分别代表五个数码管显示的数字(字符断码数字序号)
void delay(uint);//声明延时函数
void display(uint,uint,uint,uint,uint);//声明数码管显示函数
uchar code table[]={//字符断码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//C语言编码定义

void main()//主函数入口
{
aa=0xfe;//aa初始化,点亮第一的LED
//定时器初始化
TMOD=0x11;//TMOD赋值,确定T0/T1工作方式
TH0=(65536-46080)/256;//TH0/TL0;TH1/TL1计算初值
TL0=(65536-46080)%6;
TH1=(65536-46080)/256;
TL1=(65536-46080)%6;
EA=1;//总中断打开
ET0=1;//开T0/T1中断
ET1=1;
TR0=1;//TR0/TR1置位,启动定时器
TR1=1;
while(1)//不可少的大循环
{
display(no1,no2,no3,no4,no5);//数码管显示
}
}
//延时函数主体
void delay(uint s)
{
uint i,j;
for(i=s;i>0;i--)
{
for(j=110;j>0;j--)
{
}
}
}
//显示数码管显示函数主体
void display(uint no1,uint no2,uint no3,uint no4,uint no5)//数码管显示函数主体
{
//数码管1显示①送断码;②选择要显示数码管
duanxuan=1;//打开段选锁存器
P0=table[no5];//送断码
duanxuan=0;//关闭(锁住)锁存器
P0=0xff;//必不可少的清屏
weixuan=1;//打开位选锁存器
P0=0xfe;//选择数码管
weixuan=0;//关闭锁存器
delay(2);//延时
//数码管2显示
duanxuan=1;
P0=table[no4];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xfd;
weixuan=0;
delay(2);
//数码管3显示
duanxuan=1;
P0=table[no3];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xfb;
weixuan=0;
delay(2);
//数码管4显示
duanxuan=1;
P0=table[no2];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xf7;
weixuan=0;
delay(2);
//数码管5显示
duanxuan=1;
P0=table[no1];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xef;
weixuan=0;
delay(2);
}
//定时器T0方式一中断服务程序
void T0_time_no1()interrupt1
{
TH0=(65536-46080)/256;//预装初始值
TL0=(65536-46080)%6;
number1++;//number1判断计满次数,4次为200ms
if(number1==4)
{
number1=0;
aa=_crol_(aa,1);//循环左旋函数,把aa左旋之后赋值给aa
P1=aa;//P1显示流水灯
}
}
//定时器T1方式一中断服务程序
void T1_time_no1() interrupt 3
{
TH1=(65536-46080)/256;//预装初始值
TL1=(65536-46080)%6;
number2++;//用于判断T1计满次数
if(number2==4)//number2=20,就是1s时间
{
number2=0;
number++;//用于装总数字
no5=number/10000;//把一个5位数分离出来给五个数码管显示
no4=number000/1000;
no3=number00/100;
no2=number0/10;
no1=number;
if(number==1000000)//达到最大值100000,重新开始计时
{
number=0;
}
}
}

以上,结束。



评论


技术专区

关闭