单片机点阵沙漏仿真和代码
时间: 2024-03-14 20:46:59 浏览: 29
好的,以下是单片机点阵沙漏的仿真和代码。
实验原理:
点阵沙漏的实现原理是通过计时器和中断实现,每次中断时改变点阵LED的亮度,从而实现逐渐变亮或逐渐变暗的效果。
仿真软件:
本实验使用Keil uVision4作为仿真软件。
代码:
```c
#include <reg52.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit LED=P0^0;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
unsigned char num=0;
unsigned char flag=0;
unsigned int cnt=0;
void display(unsigned char num)
{
LSA=1;LSB=1;LSC=1;//关闭显示
P0=table[num];//数码管赋值
switch(num)
{
case 0:LSA=0;break;
case 1:LSB=0;break;
case 2:LSC=0;break;
case 3:LSA=0;LSB=0;break;
case 4:LSA=0;LSC=0;break;
case 5:LSB=0;LSC=0;break;
case 6:LSA=0;LSB=0;LSC=0;break;
}
}
void timer0() interrupt 1
{
TH0=0xfc;
TL0=0x67;
cnt++;
if(cnt==1000)
{
cnt=0;
flag=1;
}
}
void main()
{
TMOD=0x01;//定时器0,模式1
TH0=0xfc;
TL0=0x67;
TR0=1;//启动定时器0
ET0=1;//使能定时器0中断
EA=1;//打开总中断
while(1)
{
if(flag)
{
flag=0;
LED=num;
num++;
if(num>0x7f)
{
num=0;
}
}
display(num);
}
}
```
说明:
本实验使用了定时器0的中断,每秒中断1000次,通过计数器cnt来控制时间,flag用于标志中断是否触发。在main函数中,当flag为1时,改变点阵LED的亮度,并将num自增1,当num大于0x7f时,将num归0。同时,调用display函数显示num的值。
如果您使用的是其他单片机开发板或者不同的点阵LED显示器,请根据实际情况修改引脚和数码管的映射关系。