微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机 定时器 流水灯 数码管计时

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

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

代码如下:

//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() interrupt 1
{
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;
}
}
}

以上,结束。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top