1.设计任务
利用AT89C51单片机为核心控制元件,设计一个简易的数字电压表,设计的系统实用性强、操作简单,实现了智能化、数字化。
本设计采用单片机为主控芯片,结合周边电路组成LED彩灯的闪烁控制系统器,用来控制红色的LED闪烁发光,实现LED灯在倒计时结束后闪烁,该LED灯控制器可以通过开始按键来控制倒计时系统的开始;然后可以通过暂停按键控制倒计时的中止暂停,再次按下按键后倒计时继续直到倒计时结束,随后红色LED灯闪烁。
2. 设计要求
2.1系统方案论证
根据设计任务,分析设计系统的组成,给出实现设计任务的几种方案,分析比较几种设计方案的优略,本着尽量以软件代替硬件,同时力求电路简单,工作可靠的原则,确定总体设计方案。
2.2系统硬件电路设计
根据系统设计方案进行软、硬件的分配,软、硬件设计分别进行。硬件设计包括单片机最小系统和扩展接口及配置,硬件结构在设计时要选择合适的元器件,硬件电路要简洁、工作可靠,需用Proteus绘制整个系统的电路仿真原理图。
2.3软件设计
根据该系统要求的功能进行软件设计,简述软件的功能,并根据每个模块的功能绘制软件流程图,根据流程图编写程序并汇编调试通过;列出软件清单,软件清单要求加以注释。
#include <REGX52.H>
#include <INTRINS.H>
// delay模块
void delay(unsigned int xms)
{
unsigned char i, j;
while (xms > 0, xms--)
{
i = 2;
j = 239;
do
{
while (--j)
;
} while (--i);
}
}
// END delay模块
void nixie(unsigned char location, i)
{
switch (location)
{ // 0是灭
case 1:
P2_0 = 1;
P2_1 = P2_2 = P2_3 = 0;
break;
case 2:
P2_1 = 1;
P2_0 = P2_2 = P2_3 = 0;
break;
case 3:
P2_2 = 1;
P2_0 = P2_1 = P2_3 = 0;
break;
case 4:
P2_3 = 1;
P2_0 = P2_1 = P2_2 = 0;
break;
}
P0 = ~nixienum[i];
delay(1); //显示一段时间
P0 = ~0x00; //段码清0,消影
}
// END 数码管显示模块
// START LED部分
sbit Led = 0xB1; // P3_1//LED端口:
void Led_Delay500us()
{
unsigned char i;
_nop_();
i = 247;
while (--i)
;
}
void Led_Time(unsigned int ms)
{
unsigned int i;
for (i = 0; i < ms * 2; i++)
{
Led = !Led;
Led_Delay500us();
}
}
// END LED部分
// START 初始化函数
void init(int i, int j)
{
nixie(3, i);
nixie(4, j);
}
// END 初始化函数
// START 判断按键按下 //由于是模拟软件,delay不需要很高,这里的可以再调低点
unsigned char key()
{
unsigned char KeyNumber = 0;
if (P1_3 == 0)
{
delay(10);
while (P1_3 == 0)
;
delay(10);
KeyNumber = 4;
}
if (P1_4 == 0)
{
delay(10);
while (P1_4 == 0)
;
delay(10);
KeyNumber = 5;
}
return KeyNumber;
}
// END 判断按键按下
//暂停的原理是,k4按下,然后while卡滞,while内按键判断,再次按下k4继续,
int timeSecond = 30; //倒数的秒数
int flag = 1; //用于暂停部分,第一次按下变0(代表触发暂停),第二次按下再变1(代表当前次暂停结束)
// START 数码管显示函数
void show()
{
if (timeSecond < 10)
{
nixie(3, 10);
nixie(4, timeSecond);
}
else
{
nixie(3, timeSecond / 10); //取二位秒数第一位,十位
nixie(4, timeSecond % 10); //取二位秒数第二位,个位
}
}
void display()
{
for (timeSecond; timeSecond >= 0; timeSecond--)
{
int i = 0;
if (key() == 4)
{
flag = 0;
while (flag == 0)
{
if (key() == 4)
flag = 1;
show();
}
}
//这里每次show都会延时2毫秒(一次nixie一毫秒),那show出1秒,只要循环500次show就行
// show其它部分也消耗时间,故再减少循环次数,此方法是为了视觉
for (i; i < 25; i++)
{
show();
delay(38); //减去show内两次nixie消耗的
}
}
}
// END 数码管显示函数
// START 主函数部分
void main()
{
while (1)
{
init(3, 0); //初始化
if (key() == 5)
{
display();
init(3, 0); //结束显示的时间
Led_Time(3000); //显示完结到0时,3秒LED闪烁
timeSecond = 30;
}
}
}
// END 主函数部分
完整代码点开链接私信 免费 获取。
【iBot机器人工作室的个人空间-哔哩哔哩】 https://b23.tv/ryUWVKa