找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6861|回复: 3
打印 上一主题 下一主题
收起左侧

(开源)基于时间片轮询的程序架构思想的LED闪烁

  [复制链接]
跳转到指定楼层
楼主
ID:84566 发表于 2015-7-21 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  这两天失业在家里,无聊间浏览各网站,其实想想自己的程序写的实在很乱,其实也很少写程序 的
看到一篇文章是关于程序架构的文章:“浅谈单片机应用程序架构(原创)”里面关于程序的架构思想很好,
很实用,博客的主人刘俊先生愿意将这些编程的思想与大家分享,分享构建程序的思想,值得大家学习
  今天下午运用了刘俊先生的思想,做了两个LED灯轮流闪烁的思想,让两个LED灯轮流闪烁,与大家分享
也是“从业十年,手把手教你。。。。。”此文作者的思想差不多!与大家一起分享程序,和大家一起进步
在此谢谢刘俊先生的开源思想!

/*****************************
*PROJECT:LED轮流闪烁
*根据操作系统思想使用时间片轮询法实现LED轮流闪烁
*DATE:2015-7-21
*
*/
#include <reg52.h>
#define uChar unsigned char
#define uInt  unsigned int
//CONFIG
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
void LedOn(void);
void LedOff(void);
void InitSys(void);//系统初始化
//1.定义一个结构体
typedef struct _TASK_COMPONENTS
{
uChar Run;                 //程序运行标志   0-不运行  1-运行
  uInt Timer;               //计时器
uInt ItvTimer;            //任务运行间隔时间
void (*TaskHook)(void);    //要运行的任务函数

}TASK_COMPONENTS;
typedef enum _TASK_LIST
{
TAST_LED_ON,
TAST_LED_OFF,
TASKS_MAX        // import
}TASK_LIST;
static TASK_COMPONENTS TaskComps[] =
{
{0,250,250,LedOn},    //  LED on
{0,250,250,LedOff}, //LED OFF

};
/********************************************
*FunctionName    :TaskReMarks()
*Description     :任务标志处理
*EntryParameter  :None
*RetrunValue     :None
*********************************************/
void TaskReMarks(void) //此函数在中断中调用
{
uChar i = 0;

for(i = 0;i < TASKS_MAX; i++)
{
  if(TaskComps[ i].Timer)
  {
   TaskComps[ i].Timer--;
   if(TaskComps[ i].Timer == 0)
   {
    TaskComps[ i].Timer = TaskComps[ i].ItvTimer;
    TaskComps[ i].Run = 1;   //任务可以运行
   }
  }
}
}
//3.程序处理
/**************************
FunctionName    :TaskProcess()
*Description     :任务标志处理
*EntryParameter  :None
*RetrunValue     :None
***************************/
void TaskProcess(void)
{
uChar i = 0;

for(i = 0;i < TASKS_MAX;i++)
{
  if(TaskComps[ i].Run)
  {
   TaskComps[ i].TaskHook();
   TaskComps[ i].Run = 0;
  }
}
}
void main()
{
InitSys();
while(1)
{
  TaskProcess();
}
}

void InitSys(void)//系统初始化
{
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;

TMOD = 0X01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void InterruptTimer0(void) interrupt 1
{
TH0 = 0xFC;  //定时2MS
TL0 = 0x67;

TaskReMarks();
}
/********************************************
*FunctionName    :void LedOn(void)
*Description     :LED开启与关闭
*EntryParameter  :None
*RetrunValue     :None
*********************************************/
void LedOn(void)
{
LED1 = 0;
LED2 = 1;
}
/********************************************
*FunctionName    :void LedOff()
*Description     :LED开启与关闭
*EntryParameter  :None
*RetrunValue     :None
*********************************************/
void LedOff(void)
{
LED1 = 1;
LED2 = 0;
}

评分

参与人数 1威望 +50 黑币 +50 收起 理由
admin + 50 + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:191542 发表于 2017-8-5 20:32 | 只看该作者
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4
楼主大人在吗,这几句是干吗的?没看懂诶
回复

使用道具 举报

板凳
ID:507641 发表于 2021-8-26 22:41 | 只看该作者

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4看应该是三八译码器控制端口
回复

使用道具 举报

地板
ID:235200 发表于 2021-8-27 01:26 | 只看该作者
总是离人泪 发表于 2017-8-5 20:32
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;

这是移植时未删除的部分,在本程序中控制LED1和LED2中不起作用,可忽略
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表