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

📄 用单片机进行串并行数据转化及其在家用电器控制中的应用.htm

📁 100M网卡驱动芯片资料
💻 HTM
📖 第 1 页 / 共 3 页
字号:
</NOBR></DIV>
<DIV style="LEFT: 216px; POSITION: absolute; TOP: 6953px"><NOBR>}</NOBR></DIV>
<DIV style="LEFT: 419px; POSITION: absolute; TOP: 6953px"><NOBR>//模块结束 
</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 7000px"><NOBR>上述程序用到一个新的变量:serial_data_control,该变量定义为 
PA.1 的控制位 PAC.1,</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 7023px"><NOBR>即控制 PA.1 
是处于输入还是输出状态。 </NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 7074px"><NOBR>2. 确定按键是否按下 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 7126px"><NOBR>在上述程序中,虽然我们可以通过 
serial_data(PA.1)处于输入状态下是否为高电平来判</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 7149px"><NOBR>断按键是否按下,但是在实际应用过程中还是存在一些问题。由于用户按下按键的时间比较</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 7173px"><NOBR>长,远超过单片机程序执行的周期,所以上述程序在扫描键盘的时候,每一个程序周期都会</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 7196px"><NOBR>把用户按下的按键理解为一次按键事件,当经过了几万个时钟周期以后,单片机就认为用户</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 7220px"><NOBR>已经按下该按键达到了几万次了,其结果将触发单片机相应的功能被启动几万次。如果用户</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 7243px"><NOBR>按下的是“增加”或者“减少”按键,这将导致用户所设定的时间或者功率参数在用户按下</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 7266px"><NOBR>按键的时间内变化了几万个数据,当然这种情况是我们不希望发生的。 
</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 7313px"><NOBR>为了解决这一问题,我们可以设置一个参数 
key_down,每当一个按键被按下,并且用户一</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 7337px"><NOBR>直按着该按键则 key_down 
变量被置为 1,如果键盘扫描模块程序检测到该变量为 1,则不再</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 7360px"><NOBR>处理用户的按键事件,直到用户松开按键再重新将 
key_down 重新置为零等待下一次按键事</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 7383px"><NOBR>件的发生。 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 7430px"><NOBR>添加了 key_down 
变量以后整个程序的流程图更改如下: </NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN 
style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV 
style="LEFT: 751px; POSITION: absolute; TOP: 7663px"><NOBR>6</NOBR></DIV></SPAN></FONT>
<DIV style="LEFT: 0px; POSITION: absolute; TOP: 7753px">
<HR>

<TABLE width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=right bgColor=#eeeeee><FONT face=arial,sans-serif><A 
      name=7><B>Page 7</B></A></FONT></TD></TR></TBODY></TABLE></DIV><FONT face=Times 
size=3><SPAN style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV 
style="LEFT: 331px; POSITION: absolute; TOP: 7884px"><NOBR>模块开始</NOBR></DIV>
<DIV style="LEFT: 254px; POSITION: absolute; TOP: 7942px"><NOBR>设置锁存器输出状态为 T0 
周期</NOBR></DIV>
<DIV style="LEFT: 314px; POSITION: absolute; TOP: 8109px"><NOBR>检测 PA.1 
是否</NOBR></DIV>
<DIV 
style="LEFT: 331px; POSITION: absolute; TOP: 8133px"><NOBR>为低电平</NOBR></DIV>
<DIV 
style="LEFT: 311px; POSITION: absolute; TOP: 8012px"><NOBR>循环开始及继续</NOBR></DIV>
<DIV 
style="LEFT: 311px; POSITION: absolute; TOP: 8223px"><NOBR>扫描下一个按键</NOBR></DIV>
<DIV style="LEFT: 529px; POSITION: absolute; TOP: 8281px"><NOBR>设置键值为 
i,key_down</NOBR></DIV>
<DIV style="LEFT: 562px; POSITION: absolute; TOP: 8305px"><NOBR>变量设置为 1 
</NOBR></DIV>
<DIV 
style="LEFT: 324px; POSITION: absolute; TOP: 8305px"><NOBR>循环结束?</NOBR></DIV>
<DIV style="LEFT: 301px; POSITION: absolute; TOP: 8386px"><NOBR>key_down 
设置为零</NOBR></DIV>
<DIV style="LEFT: 557px; POSITION: absolute; TOP: 8179px"><NOBR>key_down 
是否</NOBR></DIV>
<DIV style="LEFT: 589px; POSITION: absolute; TOP: 8203px"><NOBR>为 0</NOBR></DIV>
<DIV style="LEFT: 459px; POSITION: absolute; TOP: 8112px"><NOBR>否</NOBR></DIV>
<DIV style="LEFT: 365px; POSITION: absolute; TOP: 8346px"><NOBR>是</NOBR></DIV>
<DIV style="LEFT: 230px; POSITION: absolute; TOP: 8299px"><NOBR>否</NOBR></DIV>
<DIV style="LEFT: 365px; POSITION: absolute; TOP: 8182px"><NOBR>是</NOBR></DIV>
<DIV style="LEFT: 702px; POSITION: absolute; TOP: 8205px"><NOBR>否</NOBR></DIV>
<DIV style="LEFT: 581px; POSITION: absolute; TOP: 8240px"><NOBR>是</NOBR></DIV>
<DIV 
style="LEFT: 344px; POSITION: absolute; TOP: 8480px"><NOBR>结束</NOBR></DIV></SPAN></FONT><FONT 
face=Times size=3><SPAN style="FONT-SIZE: 13px; FONT-FAMILY: Times">
<DIV style="LEFT: 299px; POSITION: absolute; TOP: 8543px"><NOBR>图 5 利用 key_down 
检测按键是否一直按下 </NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 8590px"><NOBR>加了 key_down 
这个变量以后,整个程序也会有所更改,下面是 C 语言程序清单,其中黑体</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 8614px"><NOBR>表示是新添加的程序。 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 8660px"><NOBR>程序 4: 
</NOBR></DIV>
<DIV style="LEFT: 216px; POSITION: absolute; TOP: 8707px"><NOBR>void 
scankey_module(){ </NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 8707px"><NOBR>//键盘扫描子程序 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 8731px"><NOBR>display_switch=1 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 8731px"><NOBR>//关闭显示 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 8754px"><NOBR>hc164_data=0xff; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 8754px"><NOBR>//首先给 D0 输出一个 
1,其他位为零,进入</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 8777px"><NOBR>T0 周期 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 8801px"><NOBR>serial_output(); 
</NOBR></DIV>
<DIV style="LEFT: 481px; POSITION: absolute; TOP: 8801px"><NOBR>//通过 <B 
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 输出上述串行信号 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 8824px"><NOBR>serial_data=0; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 8824px"><NOBR>//向 PA.1 
输出一个比特,其值为零 </NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 8848px"><NOBR>serial_clock=0; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 8848px"><NOBR>//<B 
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 时钟信号为零(即 PA.2 为零) 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 8871px"><NOBR>serial_clock=1; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 8871px"><NOBR>//时钟信号为 1 
</NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN 
style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV 
style="LEFT: 751px; POSITION: absolute; TOP: 8926px"><NOBR>7</NOBR></DIV></SPAN></FONT>
<DIV style="LEFT: 0px; POSITION: absolute; TOP: 9016px">
<HR>

<TABLE width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=right bgColor=#eeeeee><FONT face=arial,sans-serif><A 
      name=8><B>Page 8</B></A></FONT></TD></TR></TBODY></TABLE></DIV><FONT face=Times 
size=3><SPAN style="FONT-SIZE: 13px; FONT-FAMILY: Times">
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 9128px"><NOBR>key_downval 
=0b00000001; </NOBR></DIV>
<DIV style="LEFT: 481px; POSITION: absolute; TOP: 9128px"><NOBR>//首先给 D0 输出一个 
1,其他位为零,</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 9151px"><NOBR>进入 T0 周期 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 9175px"><NOBR>serial_output(); 
</NOBR></DIV>
<DIV style="LEFT: 481px; POSITION: absolute; TOP: 9175px"><NOBR>//通过 <B 
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 输出上述串行信号 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 9198px"><NOBR>for (i=0; 
i&lt;8; i++){ </NOBR></DIV>
<DIV style="LEFT: 481px; POSITION: absolute; TOP: 9198px"><NOBR>//循环 8 次 
</NOBR></DIV>
<DIV 
style="LEFT: 243px; POSITION: absolute; TOP: 9221px"><NOBR>serial_data_control=1; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 9221px"><NOBR>//设置 PA.1 
为输入,可检查是否有按键按下 </NOBR></DIV>
<DIV style="LEFT: 248px; POSITION: absolute; TOP: 9245px"><NOBR>_nop(); _nop(); 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 9245px"><NOBR>//输出两个空操作 
</NOBR></DIV>
<DIV style="LEFT: 264px; POSITION: absolute; TOP: 9268px"><NOBR>if(!serial_data) 
{ </NOBR></DIV>
<DIV style="LEFT: 482px; POSITION: absolute; TOP: 9268px"><NOBR>//如果 PA.1 
为高电平,则说明有按键按</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 9292px"><NOBR>下 </NOBR></DIV>
<DIV 
style="LEFT: 279px; POSITION: absolute; TOP: 9315px"><NOBR>serial_data_control=0; 
</NOBR></DIV>
<DIV style="LEFT: 481px; POSITION: absolute; TOP: 9315px"><NOBR>//设置 PA.1 
为输出,可以进行键盘扫描 </NOBR></DIV>
<DIV style="LEFT: 280px; POSITION: absolute; TOP: 9338px"><NOBR>if(!key_down){ 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 9338px"><NOBR>//如果 key_down 
为零,则处理键值 </NOBR></DIV>
<DIV style="LEFT: 295px; POSITION: absolute; TOP: 9362px"><NOBR>first_press=1; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 9362px"><NOBR>//说明刚刚按下按键 
</NOBR></DIV>
<DIV style="LEFT: 296px; POSITION: absolute; TOP: 9385px"><NOBR>key_down=1; 
</NOBR></DIV>
<DIV style="LEFT: 419px; POSITION: absolute; TOP: 9385px"><NOBR>//说明用户正在按下按键 
</NOBR></DIV>
<DIV 
style="LEFT: 295px; POSITION: absolute; TOP: 9409px"><NOBR>key_val=key_downval; 
</NOBR></DIV>
<DIV style="LEFT: 481px; POSITION: absolute; TOP: 9409px"><NOBR>//key_val 即为按键值 
</NOBR></DIV>
<DIV style="LEFT: 280px; POSITION: absolute; TOP: 9432px"><NOBR>} </NOBR></DIV>
<DIV style="LEFT: 279px; POSITION: absolute; TOP: 9455px"><NOBR>break; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 9455px"><NOBR>//跳出循环 
</NOBR></DIV>
<DIV style="LEFT: 264px; POSITION: absolute; TOP: 9479px"><NOBR>} </NOBR></DIV>
<DIV style="LEFT: 248px; POSITION: absolute; TOP: 9502px"><NOBR>key_downval 
&lt;&lt;=1; </NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 9502px"><NOBR>//左移 1 位 
</NOBR></DIV>
<DIV 
style="LEFT: 243px; POSITION: absolute; TOP: 9526px"><NOBR>serial_data_control=0; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 9526px"><NOBR>//设置 PA.1 
为输出,可以进行键盘扫描 </NOBR></DIV>
<DIV style="LEFT: 243px; POSITION: absolute; TOP: 9549px"><NOBR>serial_data=1; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 9549px"><NOBR>//向 PA.1 
输出一个比特,其值为 1 </NOBR></DIV>
<DIV style="LEFT: 243px; POSITION: absolute; TOP: 9572px"><NOBR>serial_clock=0; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 9572px"><NOBR>//<B 
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 时钟信号为零(即 PA.2 为零) 
</NOBR></DIV>
<DIV style="LEFT: 243px; POSITION: absolute; TOP: 9596px"><NOBR>serial_clock=1; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 9596px"><NOBR>//PA.2 为 
1,这样获得一个时钟信号的上升沿 </NOBR></DIV>
<DIV style="LEFT: 243px; POSITION: absolute; TOP: 9619px"><NOBR>if(i==7) 
key_down=0; </NOBR></DIV>
<DIV 
style="LEFT: 450px; POSITION: absolute; TOP: 9619px"><NOBR>//说明整个扫描过程中用户没有按下按键或</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 9643px"><NOBR>已释放按键 
</NOBR></DIV>
<DIV style="LEFT: 230px; POSITION: absolute; TOP: 9666px"><NOBR>}</NOBR></DIV>
<DIV style="LEFT: 419px; POSITION: absolute; TOP: 9666px"><NOBR>//for 结束 
</NOBR></DIV>
<DIV style="LEFT: 216px; POSITION: absolute; TOP: 9689px"><NOBR>}</NOBR></DIV>
<DIV style="LEFT: 419px; POSITION: absolute; TOP: 9689px"><NOBR>//模块结束 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 9736px"><NOBR>在上述程序中,key_down 
只有 0 和 1 的变化,所以我们可以设置一个位变量,即利用某个</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 9760px"><NOBR>存储器地址中的一个比特位表示即可。这样显著地节约了单片机宝贵的资源。 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 9806px"><NOBR>在 C 
语言中该变量可以这样定义: </NOBR></DIV>
<DIV style="LEFT: 162px; POSITION: absolute; TOP: 9853px"><NOBR>#define key_down 
_7f_0 </NOBR></DIV>
<DIV style="LEFT: 418px; POSITION: absolute; TOP: 9853px"><NOBR>//定义变量为地址 7fh 的第 
0 位</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 9900px"><NOBR>利用上面的程序可以判断按键是否按下并且解决了用户按下按键时间较长的问题。但最终我</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 9923px"><NOBR>们还是要判断究竟用户按下的是哪一个按键,上述程序中有一个变量 
key_val,该变量反映</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 9947px"><NOBR>了键盘扫描的顺序。实际上电磁炉按键的编码就是利用 
key_val 完成的。 </NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 9994px"><NOBR>作者:程智,广州大学教育信息技术系 
</NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN 
style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV 
style="LEFT: 751px; POSITION: absolute; TOP: 10189px"><NOBR>8</NOBR></DIV></SPAN></FONT></BODY></HTML>

⌨️ 快捷键说明

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