专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
上传《时间触发嵌入式系统设计模式 8051系列微控制器开发可靠应用》PDF
2020-01-18 18:49
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
15331
99
99
下载的超星格式,然后自己转成PDF的
点击此处打开armok01153597.pdf
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
98条回答
zhuyi
1楼-- · 2020-01-21 17:22
很糟糕的一本书,还卖那么贵,买回来仔细看才发现没什么内容
加载中...
AVR_AFA
2楼-- · 2020-01-21 22:23
精彩回答 2 元偷偷看……
加载中...
ningmeng7294
3楼-- · 2020-01-22 03:37
shaozh 再发一个
加载中...
wj414
4楼-- · 2020-01-22 05:27
我同学刚买了一本,后悔死了,怎么早没看到这有下呢?
呵呵
好东西
加载中...
shaozh
5楼-- · 2020-01-22 06:19
这是项目中的实例
时间触发合作式调度器在avr中的移植(cvavr编译器)
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.7d Standard
Automatic Program Generator
?Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Project : os_mega16
Version :
Date : 2006-2-12
Author : SHAOZH
Company : SZH
Comments:
Chip type : ATmega16L
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
void LED1_Flash(void);
void LED2_Flash(void);
void LED3_Flash(void);
/********************************************************
××××××××××××××公用数据类型声明××××××××××××××××××××
每个任务的存储器总和为7个字节
********************************************************/
typedef struct {
void (* pTask)(void);
uint Delay;
uint Period;
uchar RunMe;
}sTask;
/********************************************************
××××××××××××××公用的常数××××××××××××××××××××
任务的最大数目
注意:每个新建项目必须调整
********************************************************/
#define OS_MAX_TASKS (4) //每个新建项目必须调整
//*******************************************************
#define ERROR_OS_MANY_TASKS 1 //任务满
#define ERROR_OS_DELETE_TASK 2 //任务删除
#define RETURN_ERROR 1 //任务删除
#define RETURN_OK 0
/********************************************************
××××××××××××××公用变量定义××××××××××××××××××××
/********************************************************/
sTask OS_tasks_G[OS_MAX_TASKS]; //任务队列
uchar Error_code_G=0; //显示错误代码
uchar old_Error_code_G=0; //保存显示错误代码
//*****************私有函数原型**************************
static void OS_Go_To_Sleep(void);
//*****************私有变量******************************
static uint Error_tick_count_G; //跟踪自从上一次记录错误以来的时间
static uchar Last_error_code_G; //上次错误代码(在一分钟后复位)
#define OS_REPORT_ERRORS 1 //1:显示错误代码 0:不显示错误代码函数
#define OS_SLEEP_MODE 1 //1:进入空闲 0: 不进入空闲
/********************************************************
××××××××××××××公用的函数原型××××××××××××××××××××
调度器内核函数
********************************************************/
void OS_Dispatch_Tasks(void);
uchar OS_Add_Task(void(*)(void),const uint ,const uint );
uchar OS_Delete_Task(const uchar);
void OS_Report_Status(void);
/********************************************************
×××××××××××××××调度函数×××××××××××××××××
********************************************************/
void OS_Dispatch_Tasks(void)
{uchar Index;
for (Index=0;Index<OS_MAX_TASKS;Index++)
{if(OS_tasks_G[Index].RunMe>0)
{ (*OS_tasks_G[Index].pTask)();
OS_tasks_G[Index].RunMe-=1;
if(OS_tasks_G[Index].Period==0)
{OS_Delete_Task(Index);
}
}
}
// OS_Report_Status(); //报告系统状态
// OS_Go_To_Sleep(); //进入空闲模式
}
/********************************************************
×××××××××××××××加任务函数×××××××××××××××××
Fn_P 任务名 (必须是无传人参数,无返回值的任务)
DELAY 在任务第一次被运行之前的间隔(时标)
PERIOD 如果为 0 :该函数将在DELAY确定的时间被调用一次
如果为非0 : 该函数将按DELAY的值在确定的时间被重复调用
********************************************************/
uchar OS_ADD_Task(void (*pFunction)(),const uint DELAY,const uint PERIOD)
{uchar Index=0;
while ((OS_tasks_G[Index].pTask!=0)&&(Index<OS_MAX_TASKS))
{Index++;
}
if(Index==OS_MAX_TASKS)
{Error_code_G=ERROR_OS_MANY_TASKS; //设置全局错误变量
return OS_MAX_TASKS; //返回错误代码
}
OS_tasks_G[Index].pTask=pFunction;
OS_tasks_G[Index].Delay=DELAY;
OS_tasks_G[Index].Period=PERIOD;
OS_tasks_G[Index].RunMe=0;
return Index;
}
/********************************************************
×××××××××××××××删除任务函数×××××××××××××××××
********************************************************/
uchar OS_Delete_Task(const uchar TASK_INDEX)
{bit Return_code;
if(OS_tasks_G[TASK_INDEX].pTask==0)
{Error_code_G=ERROR_OS_DELETE_TASK; //设置全局错误变量
Return_code=RETURN_ERROR; //返回错误代码
}
else
{Return_code=RETURN_OK;
}
OS_tasks_G[TASK_INDEX].pTask=0x0000;
OS_tasks_G[TASK_INDEX].Delay=0;
OS_tasks_G[TASK_INDEX].Period=0;
OS_tasks_G[TASK_INDEX].RunMe=0;
return Return_code; //返回状态
}
/********************************************************
×××××××××××××××显示错误代码函数×××××××××××××××××
********************************************************/
#if OS_REPORT_ERRORS
void OS_Report_Status()
{
if(Error_code_G!=old_Error_code_G)
{
//在次处编写错误显示程序
old_Error_code_G=Error_code_G;
if(Error_code_G!=0)
{Error_tick_count_G=60000;
}
else
{Error_tick_count_G=0;
}
}
else
{if(Error_tick_count_G!=0)
{if(--Error_tick_count_G==0)
{Error_code_G=0; //复位错误代码
}
}
}
}
#endif
/********************************************************
×××××××××××××××进入空闲函数×××××××××××××××××
********************************************************/
#if OS_SLEEP_MODE
#include <SLEEP.h>
void OS_Go_To_Sleep(void)
{ sleep_enable(); //使能进入空闲
idle(); //进入空闲
}
#endif
/********************************************************
×××××××××××××××调度器初始化函数×××××××××××××××××
********************************************************/
void OS_Init_T0(void)
{uchar i;
for(i=0;i<OS_MAX_TASKS;i++)
{OS_Delete_Task(i);
}
Error_code_G=0;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
TCCR0=0x03;
TCNT0=0x7D;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
}
/********************************************************
×××××××××××××××启动调度器函数×××××××××××××××××
********************************************************/
OS_Start(void)
{#asm("sei")
}
/********************************************************
×××××××××××××××调度中断函数×××××××××××××××××
********************************************************/
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{uchar Index;
TCNT0=0x7D;
for(Index=0;Index<OS_MAX_TASKS;Index++)
{if(OS_tasks_G[Index].pTask)
{if(OS_tasks_G[Index].Delay==0)
{OS_tasks_G[Index].RunMe+=1;
if(OS_tasks_G[Index].Period)
{OS_tasks_G[Index].Delay=OS_tasks_G[Index].Period;
}
}
else
{OS_tasks_G[Index].Delay-=1;
}
}
}
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0xFF;
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
// Func7=In Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=0 State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x40;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x03;
TCNT0=0x7D;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
OS_ADD_Task(LED1_Flash,0,250); //led1闪烁频率2Hz
OS_ADD_Task(LED2_Flash,3,500); //led2闪烁频率1Hz
OS_ADD_Task(LED3_Flash,7,1000); //led3闪烁频率0.5Hz
OS_Start();
// Global enable interrupts
//#asm("sei")
while (1)
{
OS_Dispatch_Tasks();
};
}
/************************************************
my_mega16_dome.c
************************************************/
#define LED1 PORTD.6
#define LED2 PORTC
#define LED3 PORTA
void LED1_Flash(void)
{ LED1^=1;
}
void LED2_Flash(void)
{ LED2^=0xff;
}
void LED3_Flash(void)
{ LED3^=0xff;
}
以上程序硬件实验通过
----------项目实例-----------
#include "Main.H"
#define CU_AU P3_0
#define KW1 P3_1
#define KW3 P3_2
#define LED_3KW P3_3
#define LED_1KW P3_4
#define LED_CUO P3_5
#define LED_AUO P3_7
#define OUT_1KW P1_1
#define OUT_3KW P1_2
#define COM1 P1_7
#define COM2 P1_6
#define COM3 P1_5
#define DATA P1_4
#define CLK P1_3
// 0 1 2 3 4 5 6
const unsigned char Tab[13]={0xf9,0xc0,0xa4,0xb0,0x99,0x92,0x82,
// 7 8 9 A C U
0xf8,0x80,0x90,0x88,0xc6,0xc1};
bit CU_AU_fg=0; // 0 手动 ;1 自动;
bit Work_fg=0; // 0 停止 ;1 工作;
bit AU_start_fg=0; // 0 自动状态不工作;1 自动状态工作;
bit KW1_fg=0; // 0 停止 ;1 工作;
bit KW3_fg=0; // 0 停止 ;1 工作;
bit CU_AU_down_fg=0; //键按下标志;
bit Sec_500ms_fg=0; //500ms标志;
bit start_one=0; //开机有无键按下标志;
unsigned char led_disp_index=0; //数码管扫描指针;
unsigned int CU_AU_count=0; //按键延迟计数器
unsigned char KW1_count=0; //按键延迟计数器
unsigned char KW3_count=0; //按键延迟计数器
unsigned char Key_delay_count=0;//无键按下延迟计数器
unsigned char count_500ms=0;
unsigned int AUO_count_val=25200;//自动状态计数变量;
unsigned char disp_buff[3]={0,0,0}; //显示寄存器
//unsigned int Sec_count=25200; //0.5秒计数器
void Hex_Bcd(unsigned int x)
{unsigned char i;
unsigned int j;
j=x;
for(i=0;i<3;i++)
{disp_buff
=j%10;
j=j/10;
}
}
void off_led(void)
{COM1=1;
COM2=1;
COM3=1;
}
void on_led(unsigned char x)
{if(x==0)COM1=0;
else if(x==1)COM2=0;
else COM3=0;
}
/*
void delay_us(unsigned char x)
{unsigned char i;
for (i=0;i<x;i++);
}
*/
void out_164(unsigned char x)
{unsigned char i;
for (i=0;i<8;i++)
{ CLK=0;
CLK=0;
if((x<<i)&0x80)DATA=1;
else DATA=0;
// CLK=0;
// CLK=0;
CLK=1;
CLK=1;
}
}
void cpu_kz_Init(void) //cpu端口初始化函数
{P1=0xff;
P3=0xff;
}
void Key_Update(void)
{if(CU_AU==0)
{start_one=1;
CU_AU_down_fg=1;
if(++CU_AU_count>200)
{CU_AU_down_fg=0;
CU_AU_count=210;
Work_fg=1 ;
}
}
else
{if(CU_AU_down_fg)
{if((CU_AU_count>1)&&(CU_AU_count<30))
{CU_AU_fg=~CU_AU_fg;
Work_fg=0;
CU_AU_down_fg=0;
Key_delay_count=0;
OUT_1KW=LED_1KW=1;
OUT_3KW=LED_3KW=1;
KW3_fg=KW1_fg=0;
}
}
CU_AU_count=0;
}
if(CU_AU_fg==0)
{if(KW1==0)
{start_one=1;
KW1_count++;}
else
{if(KW1_count>1)
{KW1_fg=~KW1_fg;
Work_fg=1;
}
KW1_count=0;
}
if(KW3==0)
{start_one=1;
KW3_count++;
}
else
{if(KW3_count>1)
{KW3_fg=~KW3_fg;
Work_fg=1;
}
KW3_count=0;
}
}
if(start_one==0)
{if(++Key_delay_count>200)
{CU_AU_fg=1;
Work_fg=1;
start_one=1;
}
}
}
void Disp_Update(void)
{off_led();
if((CU_AU_fg==1)&&(Work_fg==1))
{
Hex_Bcd(AUO_count_val/240);
if(led_disp_index==0)
{if(Sec_500ms_fg)
{ out_164(Tab[disp_buff][0]]&0x7f);}
else{out_164(Tab[disp_buff][0]]);}
}
else if(led_disp_index==1)out_164(Tab[disp_buff][1]]);
else if(led_disp_index==2)out_164(Tab[disp_buff][2]]);
on_led(led_disp_index);
}
else if((CU_AU_fg==1)&&(Work_fg==0))
{if(led_disp_index==0) out_164(Tab[0]);
else if(led_disp_index==1)out_164(Tab[12]);
else if(led_disp_index==2)out_164(Tab[10]);
on_led(led_disp_index);
}
else if((CU_AU_fg==0)&&(Work_fg==1))
{if(led_disp_index==0) out_164(Tab[0]);
else if(led_disp_index==1)out_164(Tab[12]);
else if(led_disp_index==2)out_164(Tab[11]);
on_led(led_disp_index);
}
else if((CU_AU_fg==0)&&(Work_fg==0))
{if(led_disp_index==0) out_164(Tab[0]);
else if(led_disp_index==1)out_164(Tab[12]);
else if(led_disp_index==2)out_164(Tab[11]);
on_led(led_disp_index);
}
if(++led_disp_index>2)led_disp_index=0;
}
void Work_Update(void)
{if((CU_AU_fg==1)&&(Work_fg==1))
{if(AUO_count_val>0)
{ if(++count_500ms>=2)
{Sec_500ms_fg=~Sec_500ms_fg;
count_500ms=0;
}
AUO_count_val-=1;
if(AUO_count_val>43200)
{LED_CUO=1;
LED_AUO=0;
OUT_1KW=LED_1KW=0;
OUT_3KW=LED_3KW=0;
}
else if(AUO_count_val>0)
{LED_CUO=1;
LED_AUO=0;
OUT_1KW=LED_1KW=0;
OUT_3KW=LED_3KW=1;
}
else {LED_CUO=1;LED_AUO=0;
OUT_1KW=LED_1KW=1;
OUT_3KW=LED_3KW=1;
Sec_500ms_fg=0;
}
}
}
else if((CU_AU_fg==1)&&(Work_fg==0))
{LED_CUO=1;LED_AUO=0;
OUT_1KW=LED_1KW=1;
OUT_3KW=LED_3KW=1;
}
else if((CU_AU_fg==0)&&(Work_fg==1))
{AUO_count_val=50400;
LED_CUO=0;LED_AUO=1;
if(KW1_fg)OUT_1KW=LED_1KW=0;
else OUT_1KW=LED_1KW=1;
if(KW3_fg)OUT_3KW=LED_3KW=0;
else OUT_3KW=LED_3KW=1;
}
else if((CU_AU_fg==0)&&(Work_fg==0))
{AUO_count_val=50400;
LED_CUO=0;LED_AUO=1;
OUT_1KW=LED_1KW=1;
OUT_3KW=LED_3KW=1;
}
}
/**************************************************
OS_main.c
**************************************************/
#include "Main.h"
static void SCH_Go_To_Sleep(void);
static tWord Error_tick_count_G;
static tByte Last_error_code_G;
void SCH_Init_T0(void);
void SCH_Start(void);
/*****************************************
以下程序需要根据实际情况修改
/*****************************************/
void cpu_kz_Init(void);
void Key_Update(void);
void Disp_Update(void);
void Work_Update(void);
/*****************************************/
typedef data struct
{void (code * pTask)(void);
tWord Delay;
tWord Period;
tByte RunMe;
} sTask;
void SCH_Dispatch_Tasks(void);
tByte SCH_Add_Task(void (code*) (void), const tWord, const tWord);
bit SCH_Delete_Task(const tByte);
void SCH_Report_Status(void);
sTask SCH_tasks_G[SCH_MAX_TASKS];
tByte Error_code_G = 0;
void SCH_Dispatch_Tasks(void)
{
tByte Index;
for (Index = 0; Index < SCH_MAX_TASKS; Index++)
{
if (SCH_tasks_G[Index].RunMe > 0)
{
(*SCH_tasks_G[Index].pTask)(); // Run the task
SCH_tasks_G[Index].RunMe -= 1; // Reset / reduce RunMe flag
if (SCH_tasks_G[Index].Period == 0)
{
SCH_Delete_Task(Index);
}
}
}
SCH_Report_Status();
SCH_Go_To_Sleep();
}
tByte SCH_Add_Task(void (code * pFunction)(),
const tWord DELAY,
const tWord PERIOD)
{
tByte Index = 0;
while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
{
Index++;
}
if (Index == SCH_MAX_TASKS)
{
Error_code_G = ERROR_SCH_TOO_MANY_TASKS;
return SCH_MAX_TASKS;
}
SCH_tasks_G[Index].pTask = pFunction;
SCH_tasks_G[Index].Delay = DELAY;
SCH_tasks_G[Index].Period = PERIOD;
SCH_tasks_G[Index].RunMe = 0;
return Index;
}
bit SCH_Delete_Task(const tByte TASK_INDEX)
{
bit Return_code;
if (SCH_tasks_G[TASK_INDEX].pTask == 0)
{
Error_code_G = ERROR_SCH_CANNOT_DELETE_TASK;
Return_code = RETURN_ERROR;
}
else
{
Return_code = RETURN_NORMAL;
}
SCH_tasks_G[TASK_INDEX].pTask = 0x0000;
SCH_tasks_G[TASK_INDEX].Delay = 0;
SCH_tasks_G[TASK_INDEX].Period = 0;
SCH_tasks_G[TASK_INDEX].RunMe = 0;
return Return_code; // return status
}
void SCH_Report_Status(void)
{
#ifdef SCH_REPORT_ERRORS
if (Error_code_G != Last_error_code_G)
{
Error_port = 255 - Error_code_G;
Last_error_code_G = Error_code_G;
if (Error_code_G != 0)
{
Error_tick_count_G = 60000;
}
else
{
Error_tick_count_G = 0;
}
}
else
{
if (Error_tick_count_G != 0)
{
if (--Error_tick_count_G == 0)
{
Error_code_G = 0; // Reset error code
}
}
}
#endif
}
void SCH_Go_To_Sleep()
{
PCON |= 0x01;
//PCON |= 0x01; // Enter idle mode (#1)
//PCON |= 0x20; // Enter idle mode (#2)
}
加载中...
shaozh
6楼-- · 2020-01-22 08:27
多发啦
-----
此内容被shaozh于2007-05-15,15:28:47编辑过
加载中...
首页
上一页
3
4
5
6
7
8
9
10
下一页
最后一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
呵呵
好东西
时间触发合作式调度器在avr中的移植(cvavr编译器)
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.7d Standard
Automatic Program Generator
?Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Project : os_mega16
Version :
Date : 2006-2-12
Author : SHAOZH
Company : SZH
Comments:
Chip type : ATmega16L
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
void LED1_Flash(void);
void LED2_Flash(void);
void LED3_Flash(void);
/********************************************************
××××××××××××××公用数据类型声明××××××××××××××××××××
每个任务的存储器总和为7个字节
********************************************************/
typedef struct {
void (* pTask)(void);
uint Delay;
uint Period;
uchar RunMe;
}sTask;
/********************************************************
××××××××××××××公用的常数××××××××××××××××××××
任务的最大数目
注意:每个新建项目必须调整
********************************************************/
#define OS_MAX_TASKS (4) //每个新建项目必须调整
//*******************************************************
#define ERROR_OS_MANY_TASKS 1 //任务满
#define ERROR_OS_DELETE_TASK 2 //任务删除
#define RETURN_ERROR 1 //任务删除
#define RETURN_OK 0
/********************************************************
××××××××××××××公用变量定义××××××××××××××××××××
/********************************************************/
sTask OS_tasks_G[OS_MAX_TASKS]; //任务队列
uchar Error_code_G=0; //显示错误代码
uchar old_Error_code_G=0; //保存显示错误代码
//*****************私有函数原型**************************
static void OS_Go_To_Sleep(void);
//*****************私有变量******************************
static uint Error_tick_count_G; //跟踪自从上一次记录错误以来的时间
static uchar Last_error_code_G; //上次错误代码(在一分钟后复位)
#define OS_REPORT_ERRORS 1 //1:显示错误代码 0:不显示错误代码函数
#define OS_SLEEP_MODE 1 //1:进入空闲 0: 不进入空闲
/********************************************************
××××××××××××××公用的函数原型××××××××××××××××××××
调度器内核函数
********************************************************/
void OS_Dispatch_Tasks(void);
uchar OS_Add_Task(void(*)(void),const uint ,const uint );
uchar OS_Delete_Task(const uchar);
void OS_Report_Status(void);
/********************************************************
×××××××××××××××调度函数×××××××××××××××××
********************************************************/
void OS_Dispatch_Tasks(void)
{uchar Index;
for (Index=0;Index<OS_MAX_TASKS;Index++)
{if(OS_tasks_G[Index].RunMe>0)
{ (*OS_tasks_G[Index].pTask)();
OS_tasks_G[Index].RunMe-=1;
if(OS_tasks_G[Index].Period==0)
{OS_Delete_Task(Index);
}
}
}
// OS_Report_Status(); //报告系统状态
// OS_Go_To_Sleep(); //进入空闲模式
}
/********************************************************
×××××××××××××××加任务函数×××××××××××××××××
Fn_P 任务名 (必须是无传人参数,无返回值的任务)
DELAY 在任务第一次被运行之前的间隔(时标)
PERIOD 如果为 0 :该函数将在DELAY确定的时间被调用一次
如果为非0 : 该函数将按DELAY的值在确定的时间被重复调用
********************************************************/
uchar OS_ADD_Task(void (*pFunction)(),const uint DELAY,const uint PERIOD)
{uchar Index=0;
while ((OS_tasks_G[Index].pTask!=0)&&(Index<OS_MAX_TASKS))
{Index++;
}
if(Index==OS_MAX_TASKS)
{Error_code_G=ERROR_OS_MANY_TASKS; //设置全局错误变量
return OS_MAX_TASKS; //返回错误代码
}
OS_tasks_G[Index].pTask=pFunction;
OS_tasks_G[Index].Delay=DELAY;
OS_tasks_G[Index].Period=PERIOD;
OS_tasks_G[Index].RunMe=0;
return Index;
}
/********************************************************
×××××××××××××××删除任务函数×××××××××××××××××
********************************************************/
uchar OS_Delete_Task(const uchar TASK_INDEX)
{bit Return_code;
if(OS_tasks_G[TASK_INDEX].pTask==0)
{Error_code_G=ERROR_OS_DELETE_TASK; //设置全局错误变量
Return_code=RETURN_ERROR; //返回错误代码
}
else
{Return_code=RETURN_OK;
}
OS_tasks_G[TASK_INDEX].pTask=0x0000;
OS_tasks_G[TASK_INDEX].Delay=0;
OS_tasks_G[TASK_INDEX].Period=0;
OS_tasks_G[TASK_INDEX].RunMe=0;
return Return_code; //返回状态
}
/********************************************************
×××××××××××××××显示错误代码函数×××××××××××××××××
********************************************************/
#if OS_REPORT_ERRORS
void OS_Report_Status()
{
if(Error_code_G!=old_Error_code_G)
{
//在次处编写错误显示程序
old_Error_code_G=Error_code_G;
if(Error_code_G!=0)
{Error_tick_count_G=60000;
}
else
{Error_tick_count_G=0;
}
}
else
{if(Error_tick_count_G!=0)
{if(--Error_tick_count_G==0)
{Error_code_G=0; //复位错误代码
}
}
}
}
#endif
/********************************************************
×××××××××××××××进入空闲函数×××××××××××××××××
********************************************************/
#if OS_SLEEP_MODE
#include <SLEEP.h>
void OS_Go_To_Sleep(void)
{ sleep_enable(); //使能进入空闲
idle(); //进入空闲
}
#endif
/********************************************************
×××××××××××××××调度器初始化函数×××××××××××××××××
********************************************************/
void OS_Init_T0(void)
{uchar i;
for(i=0;i<OS_MAX_TASKS;i++)
{OS_Delete_Task(i);
}
Error_code_G=0;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
TCCR0=0x03;
TCNT0=0x7D;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
}
/********************************************************
×××××××××××××××启动调度器函数×××××××××××××××××
********************************************************/
OS_Start(void)
{#asm("sei")
}
/********************************************************
×××××××××××××××调度中断函数×××××××××××××××××
********************************************************/
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{uchar Index;
TCNT0=0x7D;
for(Index=0;Index<OS_MAX_TASKS;Index++)
{if(OS_tasks_G[Index].pTask)
{if(OS_tasks_G[Index].Delay==0)
{OS_tasks_G[Index].RunMe+=1;
if(OS_tasks_G[Index].Period)
{OS_tasks_G[Index].Delay=OS_tasks_G[Index].Period;
}
}
else
{OS_tasks_G[Index].Delay-=1;
}
}
}
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0xFF;
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
// Func7=In Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=0 State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x40;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x03;
TCNT0=0x7D;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
OS_ADD_Task(LED1_Flash,0,250); //led1闪烁频率2Hz
OS_ADD_Task(LED2_Flash,3,500); //led2闪烁频率1Hz
OS_ADD_Task(LED3_Flash,7,1000); //led3闪烁频率0.5Hz
OS_Start();
// Global enable interrupts
//#asm("sei")
while (1)
{
OS_Dispatch_Tasks();
};
}
/************************************************
my_mega16_dome.c
************************************************/
#define LED1 PORTD.6
#define LED2 PORTC
#define LED3 PORTA
void LED1_Flash(void)
{ LED1^=1;
}
void LED2_Flash(void)
{ LED2^=0xff;
}
void LED3_Flash(void)
{ LED3^=0xff;
}
以上程序硬件实验通过
----------项目实例-----------
#include "Main.H"
#define CU_AU P3_0
#define KW1 P3_1
#define KW3 P3_2
#define LED_3KW P3_3
#define LED_1KW P3_4
#define LED_CUO P3_5
#define LED_AUO P3_7
#define OUT_1KW P1_1
#define OUT_3KW P1_2
#define COM1 P1_7
#define COM2 P1_6
#define COM3 P1_5
#define DATA P1_4
#define CLK P1_3
// 0 1 2 3 4 5 6
const unsigned char Tab[13]={0xf9,0xc0,0xa4,0xb0,0x99,0x92,0x82,
// 7 8 9 A C U
0xf8,0x80,0x90,0x88,0xc6,0xc1};
bit CU_AU_fg=0; // 0 手动 ;1 自动;
bit Work_fg=0; // 0 停止 ;1 工作;
bit AU_start_fg=0; // 0 自动状态不工作;1 自动状态工作;
bit KW1_fg=0; // 0 停止 ;1 工作;
bit KW3_fg=0; // 0 停止 ;1 工作;
bit CU_AU_down_fg=0; //键按下标志;
bit Sec_500ms_fg=0; //500ms标志;
bit start_one=0; //开机有无键按下标志;
unsigned char led_disp_index=0; //数码管扫描指针;
unsigned int CU_AU_count=0; //按键延迟计数器
unsigned char KW1_count=0; //按键延迟计数器
unsigned char KW3_count=0; //按键延迟计数器
unsigned char Key_delay_count=0;//无键按下延迟计数器
unsigned char count_500ms=0;
unsigned int AUO_count_val=25200;//自动状态计数变量;
unsigned char disp_buff[3]={0,0,0}; //显示寄存器
//unsigned int Sec_count=25200; //0.5秒计数器
void Hex_Bcd(unsigned int x)
{unsigned char i;
unsigned int j;
j=x;
for(i=0;i<3;i++)
{disp_buff=j%10;
j=j/10;
}
}
void off_led(void)
{COM1=1;
COM2=1;
COM3=1;
}
void on_led(unsigned char x)
{if(x==0)COM1=0;
else if(x==1)COM2=0;
else COM3=0;
}
/*
void delay_us(unsigned char x)
{unsigned char i;
for (i=0;i<x;i++);
}
*/
void out_164(unsigned char x)
{unsigned char i;
for (i=0;i<8;i++)
{ CLK=0;
CLK=0;
if((x<<i)&0x80)DATA=1;
else DATA=0;
// CLK=0;
// CLK=0;
CLK=1;
CLK=1;
}
}
void cpu_kz_Init(void) //cpu端口初始化函数
{P1=0xff;
P3=0xff;
}
void Key_Update(void)
{if(CU_AU==0)
{start_one=1;
CU_AU_down_fg=1;
if(++CU_AU_count>200)
{CU_AU_down_fg=0;
CU_AU_count=210;
Work_fg=1 ;
}
}
else
{if(CU_AU_down_fg)
{if((CU_AU_count>1)&&(CU_AU_count<30))
{CU_AU_fg=~CU_AU_fg;
Work_fg=0;
CU_AU_down_fg=0;
Key_delay_count=0;
OUT_1KW=LED_1KW=1;
OUT_3KW=LED_3KW=1;
KW3_fg=KW1_fg=0;
}
}
CU_AU_count=0;
}
if(CU_AU_fg==0)
{if(KW1==0)
{start_one=1;
KW1_count++;}
else
{if(KW1_count>1)
{KW1_fg=~KW1_fg;
Work_fg=1;
}
KW1_count=0;
}
if(KW3==0)
{start_one=1;
KW3_count++;
}
else
{if(KW3_count>1)
{KW3_fg=~KW3_fg;
Work_fg=1;
}
KW3_count=0;
}
}
if(start_one==0)
{if(++Key_delay_count>200)
{CU_AU_fg=1;
Work_fg=1;
start_one=1;
}
}
}
void Disp_Update(void)
{off_led();
if((CU_AU_fg==1)&&(Work_fg==1))
{
Hex_Bcd(AUO_count_val/240);
if(led_disp_index==0)
{if(Sec_500ms_fg)
{ out_164(Tab[disp_buff][0]]&0x7f);}
else{out_164(Tab[disp_buff][0]]);}
}
else if(led_disp_index==1)out_164(Tab[disp_buff][1]]);
else if(led_disp_index==2)out_164(Tab[disp_buff][2]]);
on_led(led_disp_index);
}
else if((CU_AU_fg==1)&&(Work_fg==0))
{if(led_disp_index==0) out_164(Tab[0]);
else if(led_disp_index==1)out_164(Tab[12]);
else if(led_disp_index==2)out_164(Tab[10]);
on_led(led_disp_index);
}
else if((CU_AU_fg==0)&&(Work_fg==1))
{if(led_disp_index==0) out_164(Tab[0]);
else if(led_disp_index==1)out_164(Tab[12]);
else if(led_disp_index==2)out_164(Tab[11]);
on_led(led_disp_index);
}
else if((CU_AU_fg==0)&&(Work_fg==0))
{if(led_disp_index==0) out_164(Tab[0]);
else if(led_disp_index==1)out_164(Tab[12]);
else if(led_disp_index==2)out_164(Tab[11]);
on_led(led_disp_index);
}
if(++led_disp_index>2)led_disp_index=0;
}
void Work_Update(void)
{if((CU_AU_fg==1)&&(Work_fg==1))
{if(AUO_count_val>0)
{ if(++count_500ms>=2)
{Sec_500ms_fg=~Sec_500ms_fg;
count_500ms=0;
}
AUO_count_val-=1;
if(AUO_count_val>43200)
{LED_CUO=1;
LED_AUO=0;
OUT_1KW=LED_1KW=0;
OUT_3KW=LED_3KW=0;
}
else if(AUO_count_val>0)
{LED_CUO=1;
LED_AUO=0;
OUT_1KW=LED_1KW=0;
OUT_3KW=LED_3KW=1;
}
else {LED_CUO=1;LED_AUO=0;
OUT_1KW=LED_1KW=1;
OUT_3KW=LED_3KW=1;
Sec_500ms_fg=0;
}
}
}
else if((CU_AU_fg==1)&&(Work_fg==0))
{LED_CUO=1;LED_AUO=0;
OUT_1KW=LED_1KW=1;
OUT_3KW=LED_3KW=1;
}
else if((CU_AU_fg==0)&&(Work_fg==1))
{AUO_count_val=50400;
LED_CUO=0;LED_AUO=1;
if(KW1_fg)OUT_1KW=LED_1KW=0;
else OUT_1KW=LED_1KW=1;
if(KW3_fg)OUT_3KW=LED_3KW=0;
else OUT_3KW=LED_3KW=1;
}
else if((CU_AU_fg==0)&&(Work_fg==0))
{AUO_count_val=50400;
LED_CUO=0;LED_AUO=1;
OUT_1KW=LED_1KW=1;
OUT_3KW=LED_3KW=1;
}
}
/**************************************************
OS_main.c
**************************************************/
#include "Main.h"
static void SCH_Go_To_Sleep(void);
static tWord Error_tick_count_G;
static tByte Last_error_code_G;
void SCH_Init_T0(void);
void SCH_Start(void);
/*****************************************
以下程序需要根据实际情况修改
/*****************************************/
void cpu_kz_Init(void);
void Key_Update(void);
void Disp_Update(void);
void Work_Update(void);
/*****************************************/
typedef data struct
{void (code * pTask)(void);
tWord Delay;
tWord Period;
tByte RunMe;
} sTask;
void SCH_Dispatch_Tasks(void);
tByte SCH_Add_Task(void (code*) (void), const tWord, const tWord);
bit SCH_Delete_Task(const tByte);
void SCH_Report_Status(void);
sTask SCH_tasks_G[SCH_MAX_TASKS];
tByte Error_code_G = 0;
void SCH_Dispatch_Tasks(void)
{
tByte Index;
for (Index = 0; Index < SCH_MAX_TASKS; Index++)
{
if (SCH_tasks_G[Index].RunMe > 0)
{
(*SCH_tasks_G[Index].pTask)(); // Run the task
SCH_tasks_G[Index].RunMe -= 1; // Reset / reduce RunMe flag
if (SCH_tasks_G[Index].Period == 0)
{
SCH_Delete_Task(Index);
}
}
}
SCH_Report_Status();
SCH_Go_To_Sleep();
}
tByte SCH_Add_Task(void (code * pFunction)(),
const tWord DELAY,
const tWord PERIOD)
{
tByte Index = 0;
while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
{
Index++;
}
if (Index == SCH_MAX_TASKS)
{
Error_code_G = ERROR_SCH_TOO_MANY_TASKS;
return SCH_MAX_TASKS;
}
SCH_tasks_G[Index].pTask = pFunction;
SCH_tasks_G[Index].Delay = DELAY;
SCH_tasks_G[Index].Period = PERIOD;
SCH_tasks_G[Index].RunMe = 0;
return Index;
}
bit SCH_Delete_Task(const tByte TASK_INDEX)
{
bit Return_code;
if (SCH_tasks_G[TASK_INDEX].pTask == 0)
{
Error_code_G = ERROR_SCH_CANNOT_DELETE_TASK;
Return_code = RETURN_ERROR;
}
else
{
Return_code = RETURN_NORMAL;
}
SCH_tasks_G[TASK_INDEX].pTask = 0x0000;
SCH_tasks_G[TASK_INDEX].Delay = 0;
SCH_tasks_G[TASK_INDEX].Period = 0;
SCH_tasks_G[TASK_INDEX].RunMe = 0;
return Return_code; // return status
}
void SCH_Report_Status(void)
{
#ifdef SCH_REPORT_ERRORS
if (Error_code_G != Last_error_code_G)
{
Error_port = 255 - Error_code_G;
Last_error_code_G = Error_code_G;
if (Error_code_G != 0)
{
Error_tick_count_G = 60000;
}
else
{
Error_tick_count_G = 0;
}
}
else
{
if (Error_tick_count_G != 0)
{
if (--Error_tick_count_G == 0)
{
Error_code_G = 0; // Reset error code
}
}
}
#endif
}
void SCH_Go_To_Sleep()
{
PCON |= 0x01;
//PCON |= 0x01; // Enter idle mode (#1)
//PCON |= 0x20; // Enter idle mode (#2)
}
-----此内容被shaozh于2007-05-15,15:28:47编辑过
一周热门 更多>