⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 圆梦小车(寻迹小车 ) step by step 之一.htm

📁 机器人应用的全套实例寻机小车
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                        <P>void DelayNms(unsigned int uiNms); // 
                        因为子程序在后面,所以必须在此先声明。</P>
                        <P>void main(void)<BR>{ <BR>// 初始化硬件<BR>P3M0 = P3MODE0; 
                        // 因为只涉及 P3 口,所以此处只初始化 P3<BR>P3M1 = 
                        P3MODE1;<BR><BR>while(1)<BR>{<BR>Work_Display = LIGHT; 
                        // 点亮 <BR>DelayNms(LIGHT_TIME);<BR><BR>Work_Display = 
                        DARK; // 熄灭<BR>DelayNms(DARK_TIME); <BR>} // 不断循环, 
                        在所有嵌入式应用的主程序中,都有这样一个无限循环.<BR>}</P>
                        <P>// 延时子程序,实现用软件循环方式延时 N ms<BR>void DelayNms(unsigned 
                        int uiNms)<BR>{<BR>unsigned int 
                        i,uiCnt_ms;<BR>for(uiCnt_ms=0;uiCnt_ms&amp;lt;uiNms;uiCnt_ms++)<BR>{ 
                        <BR>for(i=0;i&amp;lt;1400;i++) // 
                        1ms延时循环,此数值由MCU的指令执行时间计算而来, 
                        与时钟和MCU有关<BR>{<BR>}<BR>}<BR>}<BR>使用你所熟悉的编译器编译上述程序,将HEX文件下载到小车中,你将会看到所期望的结果,修改 
                        LIGHT_TIME、DARK_TIME 
                        的数值可随意控制闪烁效果。<BR>注意,必须将STC12C5410AD.h文件拷贝到源程序所在的目录下,否则编译器不认识你所选择的MCU,也就无法将看上去基本与MCU无关的C程序翻译成MCU所能执行的程序。<BR>注意,唯一涉及的硬件P3口比标准51有所改进,详情请看STC12C54的数据手册。<BR>上面的程序并不合理,之所以那样设计,是为了避免开始就为硬件所困扰。从程序中可以看出,所用的计时方式类似于人用“数数”方式计时,费力且不准,最好的方式是有一个“带闹”的计时器,到时候提醒操作。</P>
                        <P>看下一个程序:<BR>/*********** 主程序 *****************/<BR>bit 
                        gb_1msFlag; // 1ms中断标志</P>
                        <P>void main(void)<BR>{ <BR>unsigned int guiDisplayTime; 
                        // 显示时间计数器<BR>bit gb_CurDisp; // 记忆当前显示状态<BR><BR>// 
                        初始化硬件<BR>P3M0 = P3MODE0; // 因为只涉及 P3 口,所以此处只初始化 
                        P3<BR>P3M1 = P3MODE1;</P>
                        <P>/* 初始化定时器 */<BR>TMOD = T0MODE1; // Timer0 工作在模式1 
                        ,16位定时<BR>AUXR = AUXR&amp;amp;CLR_T0X12_C; // Timer0 
                        工作在12分频<BR><BR>TCON = 0; /* 未使用外部中断,所以不用定义中断的触发方式 
                        */<BR><BR>TH0 = TIME1msH_C;<BR>TL0 = TIME1msH_C;<BR>TR0 
                        = TRUE;<BR><BR>/* 初始化中断 */<BR>IE = EnT0_C; // 此处只允许 
                        Timer0 中断, <BR>IPH = NOIP_C; // 此处不设优先级,有各功能模块自身设定<BR>IP 
                        = NOIP_C; <BR><BR>// 初始化起始状态 —— 亮<BR>Work_Display = 
                        LIGHT; // 点亮 <BR>gb_CurDisp = LIGHT; // 
                        记忆当前状态,<BR>guiDisplayTime = LIGHT_TIME; // 
                        显示时间<BR><BR>gb_1msFlag = FALSE;<BR>EA = TRUE; // 
                        启动中断,开始正常工作</P>
                        <P>while(1)<BR>{<BR>if(gb_1msFlag == 
                        TRUE)<BR>{<BR>gb_1msFlag = 
                        FALSE;<BR><BR>guiDisplayTime--; // 
                        计时<BR>if(guiDisplayTime ==0)<BR>{<BR>if(gb_CurDisp == 
                        LIGHT)<BR>{<BR>Work_Display = DARK; // 熄灭<BR>gb_CurDisp 
                        = DARK;<BR>guiDisplayTime = 
                        DARK_TIME;<BR>}<BR>else<BR>{<BR>Work_Display = LIGHT; // 
                        点亮<BR>gb_CurDisp = LIGHT;<BR>guiDisplayTime = 
                        LIGHT_TIME;<BR>} <BR>}<BR>}<BR>} // 不断循环, 
                        在所有嵌入式应用的主程序中,都有这样一个无限循环.<BR>}</P>
                        <P>/********************************************/<BR>/* 
                        定时器 0 中断服务 */<BR>/* 说明: 1ms 中断一次, 
                        */<BR>/********************************************/</P>
                        <P>void Timer0_Int(void) interrupt 1 using 1<BR>{<BR>TH0 
                        = TIME1msH_C;<BR>TL0 = TIME1msL_C;</P>
                        <P>gb_1msFlag = TRUE; <BR>}</P>
                        <P>由于篇幅原因,将程序中的宏定义部分略去,可下载YM1_Prog-1A.C看全部内容。<BR>从这个程序可以看出,两个功能完全相同,只是计时任务主要交给了定时器0完成,它通过中断方式设置一个标志,相当于“ALARM”,主程序中只当有了这个标志时才作相应处理,其余时间处于等待状态,为做其它事提供了可能!<BR>至此,我们已可以控制主控工作指示亮、暗了,但似乎单调了些,没有内容。<BR>用一个灯如何表达“hello 
                        World”?<BR>莫尔斯电码(Morse code)!<BR>莫尔斯电码(Morse 
                        code)是美国人莫尔斯于1844年发明的, 由点(.)、划(-)两种符号组成。 <BR>1) 
                        一点为一基本信号单位,一划的长度 = 3点的长度。 <BR>2) 
                        在一个字母或数字内,各点、划之间的间隔应为两点的长度。 <BR>3) 
                        字母(数字)与字母(数字)之间的间隔为7点的长度。<BR>电码表见附件一。</P>
                        <P>我们可以控制主控工作指示灯的亮、暗时间模拟“点”、“划”,实现显示“hello 
                        World”。<BR>因为程序稍长,不在文中列出,可下载附件中的“SbS_Prog-1B.C”参阅。程序是在前面程序的基础上修改的,主要构思基于如下变量的设计:<BR>unsigned 
                        char gucDispBuf[MAX_CHAR_NUM+1]; // 
                        显示缓冲区,存放要显示的字符,为“0”表示结束<BR>unsigned char gucGetCharPtr; 
                        // 从显示缓冲区取字符指针</P>
                        <P>unsigned char gucCharDispBuf[MAX_GAP_NUM]; <BR>// 
                        一个字符显示时亮、暗显示序列,存放显示基本时间单位的个数,为“0”表示结束<BR>unsigned char 
                        gucGetDispNum; // 取亮、暗基本时间数指针</P>
                        <P>unsigned char gucDispNumCnt; // 基本时间数计数器<BR>unsigned 
                        int guiBaseTime; // 基本时间计数器, 1ms 计数</P>
                        <P>unsigned char code DISP_CONTENT[MAX_CHAR_NUM+1] = 
                        {&amp;quot;HELLOWORLD&amp;quot;}; <BR>// 
                        要显示的内容,因为莫尔斯电码没有定义空格</P>
                        <P>从上面变量的设置可以大概看出程序的构思:<BR>使用一个1ms计数器形成莫尔斯电码的信号单位,构建一个数组存放一个字符的亮、暗控制序列,存放信号单位数。构建一个数组作为显示缓冲区,存放要显示的字符。<BR>通过程序将字符翻译为符合莫尔斯电码的亮、暗控制串。注意:翻译程序中设计了一个常数数组 
                        unsigned char code 
                        gucMorseCode[26][9],读者可以比较这个处理与汇编程序的差别,是否可读性大大增强了?<BR>读者可以改变 
                        DISP_CONTENT ,以显示自己想要的内容,还可以修改 BASE_TIME 
,方便的改变发送的速度。</P>
                        <H2>四、 结语</H2>
                        <P>做上述程序主要目的是为了让初学者能够找到驾驭单片机的感觉,让他觉得这一切并不神秘,只要有一定的基础知识并且会PC机操作即可。<BR>在此,我想谈一下对“单片机应用”学习目标的一旦看法:</P>
                        <P>“单片机应用”学习应该是一次实践,它本身没有任何属于自己的知识点,是建筑在“计算机原理”、“C语言编程”、“电子技术基础”等课程基础上的,是这些知识在具体产品(单片机)中的应用。而学习它的目的主要是学会运用上述基础知识看懂某个产品(单片机)的技术资料,并且通过使用之验证自己的理解,培养阅读、设计、实践的能力。<BR>不知大家是否认同?</P>
                        <P>这是一个开始,之二将着眼于MCU与PC的通讯,人需要交流,机器也同样!<BR>————————————</P>
                        <P><BR><A 
                        href="http://www.robotdiy.com/phpbb2/profile.php?mode=viewprofile&amp;u=3954" 
                        target=_blank>Hanker</A><BR>2007年6月10日星期日</P>
                        <H2>资料:</H2><A 
                        href="http://www.robotdiy.com/images/FollowMe_robot/robot_step_by_step/StepbyStep.rar">圆梦小车的第一个程序</A><BR><A 
                        href="http://www.robotdiy.com/images/FollowMe_robot/robot_step_by_step/SOS.wmv">显示“SOS”的视频</A><BR><A 
                        href="http://www.robotdiy.com/images/FollowMe_robot/robot_step_by_step/Followme_robot_StepbyStep-1.pdf">全文PDF下载</A> 

                        <H3>附件一:</H3>
                        <P>莫尔斯电码表:<BR>字符 电码符号   字符 电码符号字符 <BR>A ● —       N —● 
                        <BR>B —●●●     O — — — <BR>C —●—●     P ●— —●<BR>D —●● 
                             Q — —●— <BR>E ●       R  ●—● <BR>F ●●—●     S ●●● 
                        <BR>G — —●●    T — <BR>H ●●●●     U ●●— <BR>I ●●       V 
                        ●●●— <BR>J ●— — —    W ●— — <BR>K —●—     X —●●— <BR>L 
                        ●—●●    Y —●— — <BR>M — —      Z — —●● </P>
                        <P>数字 电码符号     标点符号 电码符号 <BR>1 ●— — — — ? ●●— —●● <BR>2 
                        ●●— — — / —●●—● <BR>3 ●●●— — ( ) —●— —●— <BR>4 ●●●●— — — 
                        ●●●●— <BR>5 ●●●●● 。 ●—●—●— <BR>6 —●●●●     <BR>7 — —●●● 
                           <BR>8 — — —●● <BR>9 — — — —● <BR>0 — — — — — </P>
                        <P></P>
                        <P><BR><BR></P>
                        <H2>提醒:</H2>
                        <P>由于文章是分开多节上传到网站上,为了方便大家讨论,请把相关的问题集中在<A 
                        href="http://www.robotdiy.com/phpbb2/viewtopic.php?p=48671" 
                        target=_blank>这个帖子</A>上,这样可以方便作者回答大家的问题,谢谢!<BR></P>
                        <P></P></TD></TR>
                    <TR>
                      <TD class=type4 align=right>
                        <DIV align=right><A 
                        href="http://www.robotdiy.com/friend.php?op=FriendSend&amp;sid=283"><IMG 
                        alt="Send this announcement to a friend" 
                        src="圆梦小车(寻迹小车 ) Step by Step 之一.files/friend.gif" 
                        align=middle border=0></A> &nbsp;|&nbsp; <A 
                        href="http://www.robotdiy.com/article.php?op=Print&amp;sid=283"><IMG 
                        alt="Printable Version" 
                        src="圆梦小车(寻迹小车 ) Step by Step 之一.files/print.gif" 
                        align=middle 
                    border=0></A>&nbsp;</DIV></TD></TR></TD></TR></TBODY></TABLE><BR><BR>
                  <TABLE style="TEXT-ALIGN: left" cellSpacing=2 cellPadding=4 
                  width="100%" border=0>
                    <TBODY>
                    <TR>
                      <TD class=article-top 
                        style="BACKGROUND-COLOR: #e0e0e0">评论 - <A 
                        href="http://www.robotdiy.com/mod.php?mod=comments&amp;op=reply&amp;cmt_cid=a">张贴你的评论</A></TD></TR>
                    <TR>
                      <TD class=white>
                        <DIV align=center>所有的评论属于张贴者,本网站不对任何内容负责。 
                        <FORM action=mod.php method=post>定制显示方式:显示&nbsp;<SELECT 
                        name=cmt_new_thold><OPTION value=-1>-1 : 
                          0</OPTION><OPTION value=0 selected>0 : 
                          0</OPTION><OPTION value=1>1 : 0</OPTION><OPTION 
                          value=2>2 : 0</OPTION><OPTION value=3>3 : 
                          0</OPTION><OPTION value=4>4 : 0</OPTION><OPTION 
                          value=5>5 : 0</OPTION></SELECT>&nbsp;<SELECT 
                        name=cmt_new_mode> <OPTION value=nocomments>NO 
                          Comments</OPTION> <OPTION value=nested 
                          selected>Nested</OPTION> <OPTION 
                          value=threaded>Threaded</OPTION> <OPTION 
                          value=flat>Flat</OPTION></SELECT>&nbsp; <SELECT 
                        name=cmt_new_order> <OPTION value=4 selected>Oldest 
                          First</OPTION> <OPTION value=1>Newest First</OPTION> 
                          <OPTION value=3>Lowest Scores First</OPTION> <OPTION 
                          value=2>Highest Scores First</OPTION></SELECT> <INPUT 
                        type=hidden value=comments name=mod> <INPUT type=hidden 
                        value=refresh name=op> <BR><BR><INPUT type=submit value=刷新> </FORM>
                        <HR width="50%" SIZE=1>
                        <SPAN class=onebiggerred>还没有任何评论,马上添加你的评论! 
                        </SPAN><BR></DIV></TD></TR></TBODY></TABLE><BR><!-- BEGIN: File: themes/foo/footer.php --></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<DIV class=smalltextatbottom style="TEXT-ALIGN: center">版权所有,2002-2006。<A 
href="http://www.robotdiy.com/">中国机器人社区(机器人发烧友天地) </A>及<A 
href="http://www.robotdiy.com/phpbb2/"> 机器人技术论坛</A><BR><IMG 
src="圆梦小车(寻迹小车 ) Step by Step 之一.files/robot_email.gif"><BR><A 
href="http://www.miibeian.gov.cn/" target=_blank>沪ICP备05037206号</A> 
</DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -