2020-12-03

今天完成了单片机的练习:

题目如下:

这是郭天祥老师很早以前的题目,我的开发板流水灯是从左往右的,数码管有八位,因此我稍微对题目做了调整,基本程序是一样的

编码过程中我发现数码管与LED灯之间引脚有冲突,导致二者不能完全各自独立运行,显示有些混乱

这次我还学习到了定义标志位flag,通过在中断程序中改变其值可以实现一个中断程序中可以根据某些条件执行不同命令

最后数码管显示hello部分由于我的nixie.h头文件中并无字母编码,所以我让其显示000000(其实就是因为我懒)

下面是我写的代码

#include <REGX52.H>
#include "delay.h"
#include "nixie.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp,t0=0,t1=0,a,b,c,flag=1,flag1=1;
uint shu=432;

void timer()
{	
	temp=0XFE; 
	P2=temp;
	TMOD=0X11;					//¶¨Ê±Æ÷ģʽ
	TH0=(65536-50000)/256;		
	TL0=(65536-50000)%256;		//¸ø¶¨Ê±Æ÷¸³³õÖµ 
	TH1=(65536-50000)/256;		
	TL1=(65536-50000)%256;
	EA=1;						//ÖжÏ×Ü¿ª¹Ø
	ET0=1;						//ÖжÏÒç³öÔÊÐíλ
	ET1=1;
	TR0=1;						//´ò¿ª¶¨Ê±Æ÷0
	TR1=1;
}

void timer0_routine() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	t0++;
	if(flag==1)
	{	
		if (t0==10)					//10´ÎÖжϣ¬¹²500ºÁÃë
		{
			t0=1;
			temp=_crol_(temp,1);
			P2=temp;				//ʵÏÖÁ÷Ë®µÆ
		}
	}
	else
	{
		if(t0%4==0)
		P2=~P2;
		if(t0==60)
		{
			TR0=0;
			P2=0XFF;
			flag1=0;
		}
		
	}
		
}
void timer1_routine() interrupt 3
{
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	t1++;
	if (t1==2)					//2´ÎÖжϣ¬100ºÁÃë		
	{
		t1=0;
		shu--;
		a=shu/100;
		b=shu%100/10;
		c=shu%100;
		if(shu==398)
		{
			TR0=0;				//¹Ø±ÕÁ÷Ë®µÆ¼ÆʱÆ÷
			TR1=0;				//¹Ø±ÕÊýÂë¹Ü¼ÆʱÆ÷
			P2=0XFF;
			TH0=(65536-50000)/256;
			TL0=(65536-50000)%256;
			TR0=1;				//ÖØÐÂÆô¶¯¶¨Ê±Æ÷0
			flag=0;
		}
	}
}

void main()
{
	timer();					//Á÷Ë®µÆ
	while(1)
	{ 	
		if(flag1==1)
		{	
		nixie(1,7);
		nixie(2,6);
		nixie(3,5);
		nixie(4,a);
		nixie(5,b);
		nixie(6,c);			//ÊýÂë¹ÜÏÔʾ
		}	
		else
		{
		nixie(1,0);
		nixie(2,0);
		nixie(3,0);
		nixie(4,0);
		nixie(5,0);
		nixie(6,0);
		}
	}
}

由于keil5软件本身原因,注释部分变成了乱码,不过我相信大家可以看懂的

经测试,除数码管部分显示异常和LED第3、4、5各由于引脚冲突常亮外,其他部分正常

由于我还是个新手,代码部分是边看教程边写的,有错误之处欢迎各位大佬指出。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值