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

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

📁 100M网卡驱动芯片资料
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 3070px"><NOBR>hc164_data 的第 7 
位</NOBR></DIV>
<DIV style="LEFT: 189px; POSITION: absolute; TOP: 3094px"><NOBR>………… 
</NOBR></DIV>
<DIV style="LEFT: 189px; POSITION: absolute; TOP: 3117px"><NOBR>unsigned char 
hc164_data @0x45; //定义无符号变量 hc164_data 对应地址</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 3140px"><NOBR>45H 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 3187px"><NOBR>在程序 1 中,PA.1 
端口始终等于 hc164_data 的最高位,每经过一次循环,hc164_data 变量</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 3211px"><NOBR>将左移一位,直到 8 
次循环结束,所有 8 位数据可全部从 PA.1 端口输出。注意到在该程序</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 3234px"><NOBR>中,每当单片机 PA.1 
端口赋值了一个数据以后,都将顺序执行_pa2=0 和_pa2=1,由于单片</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 3257px"><NOBR>机 PA.2 连接的是 <B 
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 
锁存器的时钟输入端,所以这样的程序执行顺序相当于提供锁存</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 3281px"><NOBR>器时钟信号一次从低电平到高电平变化的机会,这种变化直接导致的结果就是将 
PA.1 中的</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 3304px"><NOBR>数据输出到锁存器的 D0 位。 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 3356px"><NOBR>二、键盘扫描中的应用 
</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 3407px"><NOBR>各种家用电器中常用的按键通常有这么一些,电源开关、定时/预约、功能、增加、减少等。</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 3431px"><NOBR>其中电源开关实现电源的开启和关闭,注意用单片机控制的家用电器电源的开关并非真正切</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 3454px"><NOBR>断电源,而是停止某些功能被启动,单片机本身还是在工作的。一般的家电产品采用轻触型</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 3477px"><NOBR>按键,这些按键使用寿命长,性能可靠,用户按下按键的手感也好。 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 3529px"><NOBR>1. 扫描按键 
</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 3580px"><NOBR>扫描按键的基本过程通常是这样的,首先通过移位锁存器输出 
00000001B,由于移位锁存器</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 3604px"><NOBR>将串行信号转换成并行信号的过程受到时钟信号的控制,这样在移位锁存器时钟信号输入端</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 3627px"><NOBR>依次输入时钟信号的周期变化将导致在数据输出端每一位都有机会被置为 
1(高电平),从</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 3650px"><NOBR>而实现对所有按键的扫描过程。具体的时序如图 
3 所示。 </NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN 
style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV 
style="LEFT: 751px; POSITION: absolute; TOP: 3874px"><NOBR>3</NOBR></DIV></SPAN></FONT>
<DIV style="LEFT: 0px; POSITION: absolute; TOP: 3964px">
<HR>

<TABLE width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=right bgColor=#eeeeee><FONT face=arial,sans-serif><A 
      name=4><B>Page 4</B></A></FONT></TD></TR></TBODY></TABLE></DIV><FONT face=Times 
size=3><SPAN style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV style="LEFT: 268px; POSITION: absolute; TOP: 4105px"><NOBR>T0</NOBR></DIV>
<DIV style="LEFT: 322px; POSITION: absolute; TOP: 4105px"><NOBR>T1</NOBR></DIV>
<DIV style="LEFT: 376px; POSITION: absolute; TOP: 4105px"><NOBR>T2</NOBR></DIV>
<DIV style="LEFT: 430px; POSITION: absolute; TOP: 4105px"><NOBR>T3</NOBR></DIV>
<DIV style="LEFT: 484px; POSITION: absolute; TOP: 4105px"><NOBR>T4</NOBR></DIV>
<DIV style="LEFT: 538px; POSITION: absolute; TOP: 4105px"><NOBR>T5</NOBR></DIV>
<DIV style="LEFT: 592px; POSITION: absolute; TOP: 4105px"><NOBR>T5</NOBR></DIV>
<DIV style="LEFT: 646px; POSITION: absolute; TOP: 4105px"><NOBR>T7</NOBR></DIV>
<DIV style="LEFT: 187px; POSITION: absolute; TOP: 4129px"><NOBR>时钟</NOBR></DIV>
<DIV style="LEFT: 187px; POSITION: absolute; TOP: 4164px"><NOBR>D0 </NOBR></DIV>
<DIV style="LEFT: 187px; POSITION: absolute; TOP: 4199px"><NOBR>D1 </NOBR></DIV>
<DIV style="LEFT: 187px; POSITION: absolute; TOP: 4234px"><NOBR>D2 </NOBR></DIV>
<DIV style="LEFT: 187px; POSITION: absolute; TOP: 4269px"><NOBR>D3 </NOBR></DIV>
<DIV style="LEFT: 187px; POSITION: absolute; TOP: 4304px"><NOBR>D4 </NOBR></DIV>
<DIV style="LEFT: 187px; POSITION: absolute; TOP: 4339px"><NOBR>D5 </NOBR></DIV>
<DIV style="LEFT: 187px; POSITION: absolute; TOP: 4374px"><NOBR>D6 </NOBR></DIV>
<DIV style="LEFT: 187px; POSITION: absolute; TOP: 4409px"><NOBR>D7 
</NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN 
style="FONT-SIZE: 13px; FONT-FAMILY: Times">
<DIV style="LEFT: 381px; POSITION: absolute; TOP: 4450px"><NOBR>图 3 锁存器时序图 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 4497px"><NOBR>上图表明,在 T0 
周期中锁存器输出端输出的信号为 00000001B,而当时钟周期变化到 T7 的</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 4520px"><NOBR>时候,输出端的信号已经变成 
10000000B。在整个 T0T7 时钟周期中,每一个数据输出端都</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 4544px"><NOBR>有一次机会变为 1(即高电平)。 
</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 4591px"><NOBR>如果有某一个按键被按下了,将接通该按键对应的锁存器输出端某一位和单片机 
PA.1 输入</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 4614px"><NOBR>端的电路,从而在 PA.1 
端口可以检测到一个高电平信号。一旦单片机检测到该信号,就可</NOBR></DIV>
<DIV 
style="LEFT: 135px; POSITION: absolute; TOP: 4637px"><NOBR>以通过程序记录下具体是哪一个时钟周期(相当于程序 
1 中的局部变量 i),从而确定哪一</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 4661px"><NOBR>个按键被按下了。 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 4708px"><NOBR>图 4 是按键扫描的流程图。 
</NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN 
style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV 
style="LEFT: 751px; POSITION: absolute; TOP: 5137px"><NOBR>4</NOBR></DIV></SPAN></FONT>
<DIV style="LEFT: 0px; POSITION: absolute; TOP: 5227px">
<HR>

<TABLE width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=right bgColor=#eeeeee><FONT face=arial,sans-serif><A 
      name=5><B>Page 5</B></A></FONT></TD></TR></TBODY></TABLE></DIV><FONT face=Times 
size=3><SPAN style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV 
style="LEFT: 398px; POSITION: absolute; TOP: 5358px"><NOBR>模块开始</NOBR></DIV>
<DIV style="LEFT: 333px; POSITION: absolute; TOP: 5416px"><NOBR>设置锁存器输出状态为 T0 
周期</NOBR></DIV>
<DIV style="LEFT: 382px; POSITION: absolute; TOP: 5583px"><NOBR>检测 PA.1 
是否</NOBR></DIV>
<DIV 
style="LEFT: 392px; POSITION: absolute; TOP: 5606px"><NOBR>为低高电平</NOBR></DIV>
<DIV 
style="LEFT: 378px; POSITION: absolute; TOP: 5486px"><NOBR>循环开始及继续</NOBR></DIV>
<DIV 
style="LEFT: 378px; POSITION: absolute; TOP: 5697px"><NOBR>扫描下一个按键</NOBR></DIV>
<DIV style="LEFT: 563px; POSITION: absolute; TOP: 5650px"><NOBR>设置键值对应 i 
</NOBR></DIV>
<DIV 
style="LEFT: 581px; POSITION: absolute; TOP: 5674px"><NOBR>跳出循环</NOBR></DIV>
<DIV 
style="LEFT: 392px; POSITION: absolute; TOP: 5779px"><NOBR>循环结束?</NOBR></DIV>
<DIV style="LEFT: 405px; POSITION: absolute; TOP: 5820px"><NOBR>是</NOBR></DIV>
<DIV style="LEFT: 432px; POSITION: absolute; TOP: 5656px"><NOBR>是</NOBR></DIV>
<DIV style="LEFT: 297px; POSITION: absolute; TOP: 5773px"><NOBR>否</NOBR></DIV>
<DIV style="LEFT: 554px; POSITION: absolute; TOP: 5586px"><NOBR>否</NOBR></DIV>
<DIV 
style="LEFT: 412px; POSITION: absolute; TOP: 5884px"><NOBR>结束</NOBR></DIV></SPAN></FONT><FONT 
face=Times size=3><SPAN style="FONT-SIZE: 13px; FONT-FAMILY: Times">
<DIV style="LEFT: 374px; POSITION: absolute; TOP: 5947px"><NOBR>图 4 按键扫描流程图 
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 5994px"><NOBR>下面的 C 
语言程序可以完成这样的按键扫描工作: </NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 6041px"><NOBR>程序 3: 
</NOBR></DIV>
<DIV style="LEFT: 216px; POSITION: absolute; TOP: 6088px"><NOBR>void 
scankey_module(){ //键盘扫描子程序 </NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 6111px"><NOBR>display_switch=1 
</NOBR></DIV>
<DIV style="LEFT: 418px; POSITION: absolute; TOP: 6111px"><NOBR>//关闭显示 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 6134px"><NOBR>hc164_data=0xff; 
</NOBR></DIV>
<DIV style="LEFT: 418px; POSITION: absolute; TOP: 6134px"><NOBR>//首先给 D0 输出一个 
1,其他位为零,进入 T0 周</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 6158px"><NOBR>期 </NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 6181px"><NOBR>serial_output(); 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6181px"><NOBR>//通过 <B 
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 输出上述串行信号 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 6205px"><NOBR>serial_data=0; 
</NOBR></DIV>
<DIV style="LEFT: 419px; POSITION: absolute; TOP: 6205px"><NOBR>//向 PA.1 
输出一个比特,其值为零 </NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 6228px"><NOBR>serial_clock=0; 
</NOBR></DIV>
<DIV style="LEFT: 418px; POSITION: absolute; TOP: 6228px"><NOBR>//<B 
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 时钟信号为零(即 PA.2 为零) 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 6251px"><NOBR>serial_clock=1; 
</NOBR></DIV>
<DIV style="LEFT: 418px; POSITION: absolute; TOP: 6251px"><NOBR>//时钟信号为 1 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 6275px"><NOBR>key_downval 
=0b00000001; </NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6275px"><NOBR>//首先给 D0 输出一个 
1,其他位为零,进入</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 6298px"><NOBR>T0 周期 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 6322px"><NOBR>serial_output(); 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6322px"><NOBR>//通过 <B 
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 输出上述串行信号 
</NOBR></DIV>
<DIV style="LEFT: 232px; POSITION: absolute; TOP: 6345px"><NOBR>for (i=0; 
i&lt;8; i++){ </NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6345px"><NOBR>//循环 8 次 
</NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN 
style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV 
style="LEFT: 751px; POSITION: absolute; TOP: 6400px"><NOBR>5</NOBR></DIV></SPAN></FONT>
<DIV style="LEFT: 0px; POSITION: absolute; TOP: 6490px">
<HR>

<TABLE width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=right bgColor=#eeeeee><FONT face=arial,sans-serif><A 
      name=6><B>Page 6</B></A></FONT></TD></TR></TBODY></TABLE></DIV><FONT face=Times 
size=3><SPAN style="FONT-SIZE: 13px; FONT-FAMILY: Times">
<DIV 
style="LEFT: 243px; POSITION: absolute; TOP: 6602px"><NOBR>serial_data_control=1; 
//设置 PA.1 为输入,可检查是否有按键按下 </NOBR></DIV>
<DIV style="LEFT: 248px; POSITION: absolute; TOP: 6625px"><NOBR>_nop(); _nop(); 
</NOBR></DIV>
<DIV style="LEFT: 418px; POSITION: absolute; TOP: 6625px"><NOBR>//输出两个空操作 
</NOBR></DIV>
<DIV style="LEFT: 264px; POSITION: absolute; TOP: 6649px"><NOBR>if(!serial_data) 
{ </NOBR></DIV>
<DIV style="LEFT: 482px; POSITION: absolute; TOP: 6649px"><NOBR>//如果 PA.1 
为高电平,则说明有按键按</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 6672px"><NOBR>下 </NOBR></DIV>
<DIV 
style="LEFT: 279px; POSITION: absolute; TOP: 6695px"><NOBR>serial_data_control=0; 
</NOBR></DIV>
<DIV style="LEFT: 481px; POSITION: absolute; TOP: 6695px"><NOBR>//设置 PA.1 
为输出,可以进行键盘扫描 </NOBR></DIV>
<DIV style="LEFT: 295px; POSITION: absolute; TOP: 6719px"><NOBR>first_press=1; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6719px"><NOBR>//说明刚刚按下按键 
</NOBR></DIV>
<DIV 
style="LEFT: 295px; POSITION: absolute; TOP: 6742px"><NOBR>key_val=key_downval; 
</NOBR></DIV>
<DIV style="LEFT: 481px; POSITION: absolute; TOP: 6742px"><NOBR>//key_val 即为按键值 
</NOBR></DIV>
<DIV style="LEFT: 279px; POSITION: absolute; TOP: 6766px"><NOBR>break; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6766px"><NOBR>//跳出循环 
</NOBR></DIV>
<DIV style="LEFT: 264px; POSITION: absolute; TOP: 6789px"><NOBR>} </NOBR></DIV>
<DIV style="LEFT: 248px; POSITION: absolute; TOP: 6812px"><NOBR>key_downval 
&lt;&lt;=1; </NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6812px"><NOBR>//左移 1 位 
</NOBR></DIV>
<DIV 
style="LEFT: 243px; POSITION: absolute; TOP: 6836px"><NOBR>serial_data_control=0; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6836px"><NOBR>//设置 PA.1 
为输出,可以进行键盘扫描 </NOBR></DIV>
<DIV style="LEFT: 243px; POSITION: absolute; TOP: 6859px"><NOBR>serial_data=1; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6859px"><NOBR>//向 PA.1 
输出一个比特,其值为 1 </NOBR></DIV>
<DIV style="LEFT: 243px; POSITION: absolute; TOP: 6883px"><NOBR>serial_clock=0; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6883px"><NOBR>//<B 
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 时钟信号为零(即 PA.2 为零) 
</NOBR></DIV>
<DIV style="LEFT: 243px; POSITION: absolute; TOP: 6906px"><NOBR>serial_clock=1; 
</NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 6906px"><NOBR>//PA.2 为 
1,这样获得一个时钟信号的上升沿 </NOBR></DIV>
<DIV style="LEFT: 230px; POSITION: absolute; TOP: 6929px"><NOBR>}</NOBR></DIV>
<DIV style="LEFT: 419px; POSITION: absolute; TOP: 6929px"><NOBR>//for 结束 

⌨️ 快捷键说明

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