今天完成了单片机的练习:
题目如下:
这是郭天祥老师很早以前的题目,我的开发板流水灯是从左往右的,数码管有八位,因此我稍微对题目做了调整,基本程序是一样的
编码过程中我发现数码管与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各由于引脚冲突常亮外,其他部分正常
由于我还是个新手,代码部分是边看教程边写的,有错误之处欢迎各位大佬指出。