标题:
单片机流水灯中断计数程序(带Proteus仿真)
[打印本页]
作者:
15976402147
时间:
2019-10-5 11:57
标题:
单片机流水灯中断计数程序(带Proteus仿真)
这是我做的流水灯+中断计数,流水灯每亮一下,数码管自动加1,有仿真图
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(20.41 KB, 下载次数: 73)
下载附件
2019-10-5 16:14 上传
单片机源程序如下:
#include <reg51.h>
#define DATAPORT P2 //数码管数据口
sbit COM1 = P3^0; //数码管位1驱动口
sbit COM2 = P3^1; //数码管位2驱动口
sbit COM3=P3^7;//第三个数码管
sbit key1=P3^5;//清零按键
sbit led=P1^0;//20分钟那个小灯
unsigned char miao,fen;//计时变量
code unsigned char cc_table[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段码
unsigned int num;//计数变量
void delay(unsigned char t)//延时函数
{
unsigned char x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
void display(void)
{
COM1 = 1; //打开第一个数码管,让他亮
DATAPORT = cc_table[num/100]; //显示百位段码
delay(5);//延时5ms
COM1 = 0;//关闭第一个数码管,灭,消影
COM2 = 1;//打开第二个数码管
DATAPORT = cc_table[num%100/10];//显输十位段码
delay(5);
COM2 = 0;//关闭
COM3 = 1; //打开第三个数码管
DATAPORT = cc_table[num%10];//显输个位段码
delay(5);
COM3 = 0;//关闭三个数码管,灭,消影
}
void main(void)
{
TMOD = 0X01; //初始化定时器
TH0 =(65536-46078)/256;//定时器初始化
TL0 =(65536-46078)%256;//定时器初始化
EA = 1; //开总中断
ET0 = 1; //开T0中断
TR0=1; //启动定时器0
TH1 =(65536-46078)/256;//定时器初始化
TL1 =(65536-46078)%256;//定时器初始化
ET1 = 1; //开T1中断
TR1=1;//启动定时器1
IT0=1; //下降沿触发
EX0=1;//打开外部0中断
P0=0x01;//P1第一灯亮
led=1;//20分钟小灯亮
while(1)
{
display(); //显示脉冲数
if(key1==0)//清零按键按下
{
delay(2);//延时消去按键抖动
if(key1==0)//按键按下
{
while(!key1);//按键可释放
num=0;//清零
}
}
}
}
/********************************************************
* INT0中断函数 *
********************************************************/
void counter0(void) interrupt 0 using 1
{
EX0=0; //关中断
num++;//计数值加1
EX0=1;//开中断
}
void T0_ISR(void) interrupt 1
{
static unsigned char count,temp=0x02;
TH0 =(65536-46078)/256;//定时器初始化
TL0 =(65536-46078)%256;//定时器初始化
count++;//累计20次为1秒
if(count==20)//1秒到
{
P0=0x00;//不亮
}
if((count>=60)&&(count>20))//2秒
{
count=0;//计数值清零
P0=temp;
temp=temp<<1;//左移动
if(temp==0x40)// 0X40是循环6位,0X00是循环8位
temp=0x01; // 循环结束,由第一个灯开始
}
}
void T1_ISR(void) interrupt 3
{
static unsigned int count1;
TH1 =(65536-46078)/256;//定时器初始化
TL1 =(65536-46078)%256;//定时器初始化
count1++;
if(count1==20)//计数1秒
{
count1=0;
miao++;
if(miao==60)//计时60秒到
{
miao=0;
fen++;
if(fen>=150)//计时20分钟
{
led=0;
TR1=0;
}
}
}
}
复制代码
0.png
(5.52 KB, 下载次数: 70)
下载附件
2019-10-5 16:15 上传
全部资料51hei下载地址:
流水灯中断计数(带仿真).rar
(46.1 KB, 下载次数: 70)
2019-10-5 11:55 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
13028490628
时间:
2019-11-19 23:58
楼主可以的
作者:
wuchaode125
时间:
2019-11-26 13:16
可以的,做的很好!
作者:
zhwennn
时间:
2020-11-2 14:45
为什么流水灯亮了数码管没有自动加一啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1