11545|7

5

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急用的,谁能帮我写下这个程序 [复制链接]

利用自己购买的:S51单片机学习板,在晶振频为6MHZ.试编写利用定时器T0软件计数的方法;实现下题: 功能要求:三组(3*8)LED发光二极管每组8只轮流显示1S的程序,既开始第一组亮1S,其余均灭;随之第二组亮1S,其余均灭;然后第三组亮1S,其余灭;最后以返回第一组亮1S,其余灭。如此周而复始循环。 我的学习板是P0口可控制三组24个发光二极管,P24口P25口 P26口可各控制一组8只发光二极管 哪位高手帮下忙
此帖出自单片机论坛

最新回复

支持4楼,呵呵。  详情 回复 发表于 2007-7-16 12:57
点赞 关注
 

回复
举报

449

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

回复:急用的,谁能帮我写下这个程序

貌似流水灯~参考帖如下:自己写出来比什么都强~~HOHO,加油! https://bbs.eeworld.com.cn/showtopic.aspx?topicid=38116
此帖出自单片机论坛
 
个人签名世界是个圈,人生也是个圈。
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

回复: 急用的,谁能帮我写下这个程序

请说得清楚点 不知你的外围电路怎么样的,希望这段对你有用 MOV TMOD,#01H ;T0工作方式1 mov a,#0feh mov r0,#08h s_1: mov p1,a acall delay rl a ;循环 djnz r0,s_1 ;八次 mov p1,#0ffh ;一组循环结束 ajmp main delay: clr tr0 ;125ms延时 clr tf0 MOV TH0,#000bH MOV TL0,#00eaH SETB TR0 JNB TF0,$ ret
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 

回复: 急用的,谁能帮我写下这个程序

用一个软件调度器: // **建立任务队列** SCH_Add_Task(FLASH_LED1, 200, 200); /*设系统时标为5个毫秒*/ SCH_Add_Task(FLASH_LED2, 200*2, 200); SCH_Add_Task(FLASH_LED3, 200*3, 200); 给你软件内核: A. 头文件: /*-------------------------------------------------------*- SCH51.H (V1.1) 调度器的数据结构以及任务队列 -*-------------------------------------------------------*/ /* * Copyright (c) 2006,wsl * All rights reserved * * 文件名称: SCH51.H * 文件标识: * 摘 要: 调度器的核心是调度器的数据结构.这是一种用户 * 自定义的数据类型,集中了每个任务所需的信息. * * 当前版本: 1.1 * 取代版本: * 作 者: wsl * 原作者 : Michael J.Pont * 完成日期: 2006-09-14 * 完成日期: *********************************************************/ #ifndef _SCH51_H #define _SCH51_H #include"Main.H" //---------------公用数据类型声明------------------------ // 可能的话,存储在DATA区,以供快速存取 // 每个任务的存储器总和是7个字节 typedef data struct { // 指向任务的指针(必须是一个'void(void)'函数) // 构造一个指向函数的指针变量.专门用来存放函数的入口地址 void (code *pTask)(void); // 延迟Delay个时标后函数将第一次运行 // 当Delay=0时,任务立即运行 unsigned int Delay; // 在连续的运行之间的间隔(时标) // 当Period=0时,任务运行一次. unsigned int Period; // 当任务需要运行时(由调度器)加1 unsigned char RunMe; } sTask; //------------公用的函数原型---------------------------- // 调度器内核函数 extern void SCH_Dispatch_Tasks(void); extern unsigned char SCH_Add_Task(void (code *pFunction)(), // 任务指针 const unsigned int DELAY, // 延迟Delay个时标后函数将第一次运行 const unsigned int PERIOD); // 连续的运行之间的间隔(时标) extern bit SCH_Delete_Task(const unsigned char TASK_INDEX); extern void SCH_Init_Timer2(void); extern void SCH_Start(void); //-------------------------------------------------------- #endif //-------------------END OF FILE------------------------- B.c文件: /*--------------------------------------------------------------------*- SCH51.C (V1.00) 这里是调度器的内核函数,这个函数可以用于所有的8051芯片. --- SCH_MAX_TASKS必须由用户设置 ---- -*---------------------------------------------------------------------*/ /* * Copyright (c) 2006 * All rights reserved * * 文件名称: SCH51.C * 文件标识: * 摘 要: 内核函数 * * 当前版本: 1.1 * 取代版本: * 作 者: wsl * 原作者 : Michael J.Pont * 完成日期: 2006-09-14 * 完成日期: ************************************************************************/ #include"main.H" #include"Port.H" #include"SCH51.H" #include "MMI.h" #include"Uart.h" #include"LedDisp.h" /*私有函数*/ static void SCH_Updata(void); static void SCH_Report_Status(void); //---------------公用常数------------------------------- // 在任一时刻要求的任务最大数目 // 每个新建项目都必须调整 #define SCH_MAX_TASKS (8) //-------公用变量定义----------------------------------------------------- // 任务队列 sTask SCH_tasks_G[SCH_MAX_TASKS]; #define RETURN_NORMAL (bit)0 #define RETURN_ERROR (bit)1 // 错误代码 #define ERROR_SCH_TOO_MANY_TASKS (1) #define ERROR_SCH_CANNOT_DELETE_TASK (2) // 用来显示错误代码 static unsigned char Error_code_G = 0; static unsigned char RTCCounter = 0; /*---------------------------------------------------------*- * 函数名称: SCH_Update_Server() * 入 口: * 出 口: * 函数功能: 调度器的中断服务程序 * * 说 明: "刷新"函数,确定某个任务需要运行时,将这个任务的 * RunMe标志加1,然后该任务将由调度程序执行. * * 当前版本: 1.1 * 取代版本: * 作 者: wsl * 原作者 : Michael J.Pont * 完成日期: 2006-09-14 * 完成日期: -*---------------------------------------------------------*/ void SCH_Update_Server(void)interrupt 5 { TF2 = 0; // 必须手工清除 if(++RTCCounter == 200) { RTCCounter = 0; RTC_Soft_clock(); /*定时器例行程序*/ /*每秒钟查询一次是否有闹铃时间到*/ if (RingIDRegister > 0) { /*响铃*/ Ring_server(); } } FlashFreq(); SCH_Updata(); } /*---------------------------------------------------------*- * 函数名称: SCH_Dispatch_Tasks() * 入 口: * 出 口: * 函数功能: 调度函数,当一个任务()需要运行时,此函数将运行它, * * 说 明: 这个函数必须被主循环(重复)调用 * * 当前版本: 1.1 * 取代版本: * 作 者: wsl * 原作者 : Michael J.Pont * 完成日期: 2006-09-14 * 完成日期: -*---------------------------------------------------------*/ void SCH_Dispatch_Tasks(void) { unsigned char Index; // 调度(运行)下一个任务(如果有任务就绪) for (Index=0; Index<SCH_MAX_TASKS; Index++) { if (SCH_tasks_G[Index].RunMe > 0) { // 运行任务 (*SCH_tasks_G[Index].pTask)(); // 复位 / 降低RunMe标志 SCH_tasks_G[Index].RunMe -= 1; // 周期性的任务将自动地再次运行 // 如果这个是'单次'任务,将它从队列中删除 if (SCH_tasks_G[Index].Period == 0) { SCH_Delete_Task(Index); } } } // 报告系统状况 SCH_Report_Status(); } /*---------------------------------------------------------*- * 函数名称: SCH_Report_Status() * 入 口: * 出 口: * 函数功能: 用来显示错误代码 * * 说 明: 错误只在有限的时间内显示,此后错误代码被复位为0. * * 当前版本: 1.1 * 取代版本: * 作 者: wsl * 原作者 : Michael J.Pont * 完成日期: 2006-09-14 * 完成日期: -*---------------------------------------------------------*/ void SCH_Report_Status(void) { // 只在需要报告错误时适用 // 检查新的错误代码 if (Error_code_G != 0) { switch (Error_code_G) { case 1: uart_send_string("Tasks Full\n", 0); break; // 任务队列已满 case 2: uart_send_string("No Tasks\n", 0); break; // 这里没有任务 default: break; } } Error_code_G = 0; // 复位错误代码 } /*---------------------------------------------------------*- * 函数名称: SCH_Add_Task() * 入 口: (*pFunction)任务指针,(DELAY)到第一次运行间隔时标, * (PERIOD)每次运行的间隔时标 * * 出 口: 返回SCH_MAX_TASKS表示任务队列已满 * 返回(Index)=任务位置 * * 函数功能: 用来添加任务到任务队列上,以保证它们在需要的时 * 候被调用 * * 说 明: 使任务函数每隔一定间隔或在用户的延迟之后执行. * * 当前版本: 1.1 * 取代版本: * 作 者: wsl * 原作者 : Michael J.Pont * 完成日期: 2006-09-14 * 完成日期: -*---------------------------------------------------------*/ unsigned char SCH_Add_Task(void (code *pFunction)(), // 任务指针 const unsigned int DELAY, // 延迟Delay个时标后函数将第一次运行 const unsigned int PERIOD) // 连续的运行之间的间隔(时标) { unsigned char 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; } /*---------------------------------------------------------*- * 函数名称: SCH_Delete_Task() * 入 口: TASK_INDEX -任务索引.由SCH_Add_task()提供 * * 出 口: 返回值: RETURN_ERROR(或)RETURN_NORMAL * * 函数功能: 从调度器删除任务. * * 说 明: 请注意:并不是从存储器中删除相关的函数,仅仅是不再 * 由调度器调用这个任务. * * 当前版本: 1.1 * 取代版本: * 作 者: wsl * 原作者 : Michael J.Pont * 完成日期: 2006-09-14 * 完成日期: -*---------------------------------------------------------*/ bit SCH_Delete_Task(const unsigned char 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 = 0x00; SCH_tasks_G[TASK_INDEX].Delay = 0; SCH_tasks_G[TASK_INDEX].Period = 0; SCH_tasks_G[TASK_INDEX].RunMe = 0; // 返回状态 return Return_code; } /*---------------------------------------------------------*- * 函数名称: SCH_Update() * 入 口: * 出 口: * 函数功能: 在调度器的中断服务程序中运行 * * 说 明: "刷新"函数,确定某个任务需要运行时,将这个任务的 * RunMe标志加1,然后该任务将由调度程序执行. * * 当前版本: 1.1 * 取代版本: * 作 者: wsl * 原作者 : Michael J.Pont * 完成日期: 2006-09-14 * 完成日期: -*---------------------------------------------------------*/ void SCH_Updata(void) { unsigned char Index; // 注意: 计算单位为"时标" (不是毫秒) for (Index=0; Index < SCH_MAX_TASKS; Index++) { // 检测这里是否有任务? if (SCH_tasks_G[Index].pTask != 0) { if (SCH_tasks_G[Index].Delay == 0) { // 任务需要运行 SCH_tasks_G[Index].RunMe += 1; // RunMer标志加1 if (SCH_tasks_G[Index].Period != 0) { // 调度定期的任务再次运行 SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period; } } else { // 还没有准备好运行,延迟减1 SCH_tasks_G[Index].Delay -= 1; } } } } /*---------------------------------------------------------*- * 函数名称: SCH_Init_Timer2() * 入 口: * 出 口: * 函数功能: 准备调度器数据结构并且设置定时器以所需的频率中断 * * 说 明: 调度器初始化化函数,必须在使用调度器之前调用它 * * 当前版本: 1.1 * 取代版本: * 作 者: wsl * 原作者 : Michael J.Pont * 完成日期: 2006-09-14 * 完成日期: -*---------------------------------------------------------*/ void SCH_Init_Timer2(void) { unsigned char i; for (i=0; i<SCH_MAX_TASKS; i++) { SCH_Delete_Task(i); } // 复位全局错误变量 // - SCH_Delete_Task()将产生一个错误代码 // (因为任务队列是空的) // Error_code_G = 0; // 设置定时器2 // 16位定时自动重装 T2CON = 0x04; TH2 = PRELOAD_05mS_H; RCAP2H = PRELOAD_05mS_H; TL2 = PRELOAD_05mS_L; RCAP2L = PRELOAD_05mS_L; ET2 = 1; // 使能定时器2中断 TR2 = 1; // 启动定时器2 } /*---------------------------------------------------------*- * 函数名称: SCH_Start() * 入 口: * 出 口: * 函数功能: 通过允许中断来启动调度器 * * 说 明: 在添加了所有定期的任务之后调用,从而使任务保持同步. * 注意:应该只使能调度器中断 * * 当前版本: 1.1 * 取代版本: * 作 者: wsl * 原作者 : Michael J.Pont * 完成日期: 2006-09-14 * 完成日期: -*---------------------------------------------------------*/ void SCH_Start(void) { EA = 1; } //**************END OF FILE********************************* 看明白了我想你一定能完成上面的那个任务.
此帖出自单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复:急用的,谁能帮我写下这个程序

好东东可要多多发表,最好开专题推广。
此帖出自单片机论坛
 
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

6
 

回复:急用的,谁能帮我写下这个程序

很好 不错
此帖出自单片机论坛
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

7
 

回复:急用的,谁能帮我写下这个程序

谢咯,试试看..
此帖出自单片机论坛
 
 
 

回复

229

帖子

0

TA的资源

纯净的硅(高级)

8
 

回复:急用的,谁能帮我写下这个程序

支持4楼,呵呵。
此帖出自单片机论坛
 
个人签名作人随心、做事随缘。世间凡事岂能尽如人意。不求无怨无悔、但求无愧于心。
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表