📄 圆梦小车(寻迹小车 ) step by step 之一.htm
字号:
<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&lt;uiNms;uiCnt_ms++)<BR>{
<BR>for(i=0;i&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;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] =
{&quot;HELLOWORLD&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&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&sid=283"><IMG
alt="Send this announcement to a friend"
src="圆梦小车(寻迹小车 ) Step by Step 之一.files/friend.gif"
align=middle border=0></A> | <A
href="http://www.robotdiy.com/article.php?op=Print&sid=283"><IMG
alt="Printable Version"
src="圆梦小车(寻迹小车 ) Step by Step 之一.files/print.gif"
align=middle
border=0></A> </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&op=reply&cmt_cid=a">张贴你的评论</A></TD></TR>
<TR>
<TD class=white>
<DIV align=center>所有的评论属于张贴者,本网站不对任何内容负责。
<FORM action=mod.php method=post>定制显示方式:显示 <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> <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> <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 + -