单片机实验板实现交通_第1页
单片机实验板实现交通_第2页
单片机实验板实现交通_第3页
单片机实验板实现交通_第4页
单片机实验板实现交通_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1会计学单片机实验板实现交通单片机实验板实现交通三位三位LED两位数码管两位数码管键盘键盘单片机单片机单片机单片机24c02绿、黄、红灯时间显示计时器控制器设置定时值定时值存储器设置运行状态开始初始化状态改变?计时处理交通灯处理计时显示定时值改变?状态处理在设置状态?定时值处理YYNN交通灯控制器的状态有:设置状态(包括设置红、黄、绿灯状态)、运行状态(包括红、黄、绿灯亮的状态)、暂停状态。是否为运行状态?计时时间为0?改变交通灯的亮灭装入新的倒计时值倒计时值减一中断结束YYNN有键盘按下?延时有键盘按下?读取键盘状态键盘释放?结束开始YNYYNN类型: 花属性: 颜色;香气;行为:开花( )

2、;定义玫瑰是花;玫瑰.颜色=深红;玫瑰.香气=浓郁;玫瑰.开花( )任务n:状态f每个操作任务都处在不同的状态中,每个任务在某一状态下,每次执行过程中连续执行的时间很短,各个任务轮流执行,分时轮流占用内核,执行的效果好像多个任务同时执行,这称为“时间轮转调度法”。任务2:状态b任务1:状态a任务n:状态c任务2:状态e任务1:状态d红灯亮黄灯亮绿灯亮全亮绿灯倒计时结束设置红灯时间红灯倒计时结束设置黄灯时间黄灯倒计时结束设置绿灯时间暂停暂停暂停struct light uchar state;l1;void LightProcess( );lightuchar state;void LightP

3、rocess( );/灯的状态为0则红灯亮,1则黄灯亮,2则绿灯亮void LightProcess( ) if(s1.pause!=0) r=0; g=0; y=0; else if(s1.state!=3) l1.state=s1.state; switch(l1.state) case 0: r=0;g=1;y=1; break; case 1: y=0;r=1;g=1; break; case 2: g=0; r=1;y=1;break; /如果暂停标志为1,则进入暂停状态/暂停时红绿黄灯全亮/若系统在设置状态,系统状态变量s1.state3/利用系统的状态确定灯的状态/判断灯的状态/

4、状态值0为红灯亮的状态,点亮红灯/状态值1为黄灯亮的状态,点亮黄灯/状态值2为绿灯亮的状态,点亮绿灯装入初值倒计时暂停暂停暂停开始开始倒计时为0停止控制器为运行状态struct counter uint ms5; uchar val;c1;void TimerProcess( );counteruchar ms5;void CounterProcess( );uchar val;/5ms计数器,5ms中断后计数器加1/秒倒计时器,ms5计数满200后val减1void CounterProcess( ) if(s1.state=3) if(s1.pause=0) if(+c1.ms5=200)

5、 c1.ms5=0;if(c1.val=0) if(+l1.state=3) l1.state=0; c1.val=t1.vall1.state;else c1.val-; /系统状态3为运行状态/若暂停标志为0/若5毫秒计数器为200,则满1秒/若秒倒计时器为0/改变灯的状态,若从绿灯转为红灯,则状态从3变为0/在秒倒计时器中装入新的倒计时值/若秒倒计时器不为0,则计时值减1设置红灯时间设置黄灯时间设置绿灯时间等待设置黄灯状态设置绿灯状态进入运行状态+/-键按动+/-键按动+/-键按动设置红灯状态struct timer uchar val3; t1;timervoid TimerProce

6、ss( );uchar val3;void TimerProcess( );/三个元素对应三个交通灯的定时值void TimerProcess( ) if(cess2) cess2=0;if(s1.state60) t1.vals1.state=60; if(cess3) cess3=0;if(s1.state3) if(t1.vals1.state=0) t1.vals1.state=0; else t1.vals1.state-; /cess2为1,说明+键按下/把cess2清零等待下一次响应/如果系统在设置状态/对应灯的

7、定时值加1/若加1后定时值超过60,则保持为60/cess3为1,说明-键按下/若定时值不为0,对应灯的定时值减1/若定时值超过0,则保持为0设置红灯设置黄灯设置绿灯运行暂停按下设置键按下设置键按下设置键按下暂停键按下暂停键按下暂停键按下暂停键启动启动启动启动struct sys uchar state; uchar pause;s1;/系统状态为03,对应设置红灯时间、设置黄灯状态、设置绿灯时间和运行sysvoid SysProcess( );uchar state;uchar pause;void SysProcess( );/暂停标志位void SysProcess( ) if

8、(cess1) cess1=0;if(+s1.state=4) s1.state=0;if(s1.state=3) WriteByteToEPROM (t1.val0,0); delay_ms(2); WriteByteToEPROM (t1.val1,1); delay_ms(2); WriteByteToEPROM (t1.val2,2); if(cess4) cess4=0;s1.pause=s1.pause; /cess1为1,说明设置键按下/设置键按下后进行状态转换/系统状态超过4则转为设置红灯状态/若要进入运行状态/把设置的

9、定时值存入存储器中/cess4为1,说明暂停键按下/改变暂停状态等待输入状态消抖状态等待释放状态键盘处理状态延时结束前输入信号消失检测到输入信号延时结束输入信号消失struct key uchar state; uchar value; uchar timer; uchar process1; uchar process2; uchar process3; uchar process4;k1;/键盘扫描的状态/扫描读取的键盘值/延时的计时器/暂停键按下的标志位/+键按下的标志位/-键按下的标志位/设置键按下的标志位信号灯计时器定时设置器键盘系统ces

10、cess3s1.pauses1.pauses1.statet1.val3c1.valvoid SysInit( ) s1.pause=0; s1.state=0; l1.state=0; c1.ms5=0; c1.val=0; t1.val0=ReadByteFromEPROM (0); delay_ms(2); t1.val1=ReadByteFromEPROM (1); delay_ms(2); t1.val2=ReadByteFromEPROM (2);/从存储器中读出定时值/延时2ms/对各个状态进行初始化/对各个计数器进行初始化运行等待建立建立注

11、销注销事件发生事件发生实时或多任务应用程序由一个或多个完成具体的操作的任务组成, RTX51 Tiny允许最多 16个任务。 任务是使用下面的格式定义的返回质类型和参数列表为空的 C语言函数void func (void) _task_ num num是一个从 0到 15的任务标识号例子void job0 (void) _task_ 0 while (1) counter0+; /* increment counter */定义函数 job0为任务号0。#include char os_create_task (unsigned char task_id); /* ID of task to

12、start */文字说明| os_create_task函数启动使用用task_id表示的任务号定义的任务函数。如果任务成功地开始os_create_task 函数的返回值为0, 如果任务不能被开始,或如果没有使用规定任务号定义的任务返回值为-1。例:#include #include /* for printf */void new_task (void) _task_ 2 void tst_os_create_task (void) _task_ 0 if (os_create_task (2) printf (Couldnt start task 2n); 摘要 #include cha

13、r os_delete_task (unsigned char task_id); /* ID of task to stop and delete */文字说明:os_delete_task函数停止用 task_id表示的任务,指定的任务被从任务列表中删除。如果任务成功地停止和删除,os_create_task函数的返回值为0 ;如果规定的任务不存在或没有开始返回值为-1。例子 #include #include /* for printf */void tst_os_delete_task (void) _task_ 0 if (os_delete_task (2) printf (Cou

14、ldnt stop task 2n); 可利用的中央处理器时间被分成时间片,由RTX51 Tiny分配一个时间片给每个任务。每个任务允许执行一个预先确定的时间,然后RTX51 Tiny切换到另一准备运行的任务并且允许这个任务执行片刻。一个时间片的持续时间可以用配置变量 TIMESHARING 定义。超时(Timeout) :挂起运转的任务指定数量的时钟报时周期;信号(Signal) :用于任务内部协调。#include char os_wait (unsigned char event_sel, /* events to wait for */unsigned char ticks, /* t

15、imer ticks to wait */unsigned int dummy); /* unused argument */事件常数文字说明K_SIG等待一个信号K_TMO等待一个超时(time-out)上述事件可以用字符“|”进行逻辑或。例如K_TMO | K_SIG 规定任务等待一个超时或一个信号。参数ticks规定等待一个超时事件k_tmo的报时信号数目。事件常数文字说明SIG_EVENT接收到一个信号TMO_EVENT 一个超时(time-out)已经完成。NOT_OK参数 event_sel的值无效。n 你可以使用 os_wait功能暂停一个任务并等待从另一个任务发出的信号。 这可

16、以用于协调两个或更多的任务。n如果一任务在等待一个信号并且信号标志是 0 ,在这个信号被发送之前,这个任务将一直处于挂起状态;如果信号标志已经是 1 ,当任务查询信号时信号标志会被清除,并且继续执行任务。#include char os_send_signal (unsigned char task_id); /* ID of task to signal */os_send_signal函数向任务 task_id发送一个信号,如果指定任务已经在等待一个信号,这个函数调用会把任务准备好用于运行。os_send_signal函数只可以从任务函数中调用。如果成功,os_send_signal 函数

17、的返回值为0 ;如果规定的任务不存在则返回值为- 1。#include /* for printf */void signal_func (void) _task_ 2os_send_signal (8); /* signal task #8 */#include char os_clear_signal (unsigned char task_id); /* task ID of signal to clear */os_clear_signal函数清除用task_id表示的任务的信号标志位。如果信号标志位成功地清除 ,os_clear_signal函数的返回值为0; 如果规定的任务不存在,

18、返回值为-1。#include #include /* for printf */void tst_os_clear_signal (void) _task_ 8os_clear_signal (5);/* clear signal flag in task 5 */任务初始化任务初始化系统初始系统初始化化时钟计数时钟计数键盘扫描键盘扫描键盘处理键盘处理计时值写计时值写入入交通灯控交通灯控制制显示显示发送消息发送消息任务走向任务走向#define INIT 0#define SET 1 #define KEYCHECK 2 #define KEYREAD 3 #define WRITE 4#d

19、efine CLOCK 5#define LIGHTS 6#define DISPLAY 7#include #include /RTX51头文件/定义任务号,/系统按任务号顺序调度任务void init (void) _task_ INIT os_create_task (SET); os_create_task (CLOCK); os_create_task (KEYCHECK); os_create_task (KEYREAD); os_create_task (LIGHTS); os_create_task (DISPLAY); state_work=1; os_delete_task

20、 (INIT); /在第0号初始化任务中建立其他的任务/完成后注销该任务,以后不进行调度/暂停标志位置1,系统在工作状态任务初始化任务任务初始化任务void clock (void) _task_ CLOCK while (1) if(state_work) if(ctime=0) if(+light_state=3) light_state=0; ctime=settimelight_state; else ctime-; os_send_signal(LIGHTS); os_wait (K_TMO,20,0); /任务在死循环中任务在死循环中/若在工作状态,系统不暂停若在工作状态,系统不暂

21、停/若计时值为若计时值为0/交通灯亮灭的状态改变交通灯亮灭的状态改变/交通灯变化后,计时值设为对应交通灯变化后,计时值设为对应交通灯的定时值交通灯的定时值/向交通灯发出信号向交通灯发出信号/等待等待20个定时(个定时(TIME_OUT)void keyread (void) _task_ KEYREAD while(1) switch(key_value) case 2: if(+state_flag=4) state_flag=0; if(state_flag=3) os_create_task(WRITE);os_clear_signal(KEYREAD);os_wait(K_SIG, 0

22、, 0); light_state=0; break;键盘扫描任务键盘扫描任务/判断键盘状态/若按下的是状态键,则改变状态变量/若是设置状态 /创建计时值写入任务/等待计时值写入任务发来信号case 8: state_work=state_work; break; os_send_signal(LIGHTS);os_clear_signal(KEYREAD); os_wait(K_SIG, 0, 0); /若按下的是暂停键/取反暂停标志位/向交通灯任务发送信号,使交通灯任务就绪/清信号标志位/等待键盘扫描任务发送信号void write (void) _task_ WRITE flag=Wri

23、teByteToEPROM(settime0,0 x0); delay_ms(1); flag=WriteByteToEPROM(settime1,0 x1); delay_ms(1); flag=WriteByteToEPROM(settime2,0 x2); os_send_signal(KEYREAD); os_delete_task (WRITE);计时值写入任务计时值写入任务/任务处理后向键盘扫描任务发送信号任务处理后向键盘扫描任务发送信号/注销计时值写入任务注销计时值写入任务是否为运行状态?计时时间为0?改变交通灯的亮灭装入新的倒计时值倒计时值减一中断结束YYNN有键盘按下?延时有键盘按下?读取键盘状态键盘释放?结束开始YNYYNN任务n:状态f每个操作任务都处在不同的状态中,每个任务在某一状态下,每次执行过程中连续执行的时间很短,各个任务轮流执行,分时轮流占用内核,执行的效果好像多个任务同时执行,这称为“时间轮转调度法”。任务2:状态b任务1:状态a任务n:状态c任务2:状态e任务1:状态dvoid SysProcess( ) if(cess1) cess1=0;if(+s1.state=4) s1.state=0;if(s1.s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论