壹拾贰:单片机与芯片164的通信

xiaoxiao2021-02-28  64

本篇之后都是提高篇 1)只为学习,不讨论现实意义 2)与实物电路会有差距(以实物为准) 3)讲解范围:串行通信、数码管、1602、12864、点阵、直流电机、AD、DA等基础电路。 高级内容暂不讲(USB、CAN、DMA、Wifi、网络、真彩大液晶、触摸屏、GPS、GPRS、Zigbee、NandFlash、Camera等等)(ARM11上讨论这些)

#基础知识 通信分为两种:并行通信和串行通信。 并行通信是将要所传送的数据的各位同时发送或接受,在该通信中,使用几条数据线,将数据分段同时进行传输,传输速度快,信息率高。 串行通信时使用很少的数据线,将要传送数据各个位按顺序一位一位地发送或接收,每一位都需要固定的时间长度,在串行通信中仅少量的传输线即可。

并行口 串行口

1)串行通信的几种制式

单工 半双工 全双工

2)串行通信标准

常见的串行通信标准

串行通信标准 引脚 引脚说明 通信方式 通信制失 UARTTXD、RXD、GND(三线)TXD:发送端RXD:接收端异步全双工1-WireDQ(一线)DQ:发送/接收端异步半双工SPISCK、MISO、MOSI(三线)SCK:同步时钟MISO:主机输入,从机输出MIOSI:主机输出,从机输入同步全双工I2CSCL、SDA(二线)SCL:同步时钟SDA:数据输入/输出端同步半双工

#实验

1)了解164芯片引脚 A、B:串行数据输入端。 Clock:时钟输入端。 Clear:清零端。当次引脚为低电平时,并行输出引脚将全部为低电平。 QAQH:数据输出引脚。这八个引脚为bit0bit8,8位数据输出引脚。

2)通信过程 74HC164真值表

单工 半双工 Clear Clock A和B QA QB … QH L X X L L … L H L X H ↑ H QH=QG… QB=QA、QA=H H ↑ L QH=QG… QB=QA、QA=L

******************************************************************/ * 【课程13】 ****单片机与164的通信*********** * 【说 明】 ****74HC164串行单工通信 * 【描 述】 ****用IO口模拟时序,实现单片机与164的通信 ******************************************************************/ #include<reg51.h> // 对51特殊功能寄存器进行定义 //---------常用的两个宏定义-------------- #define uint8 unsigned char #define uint16 unsigned int sbit Data=P0^0; // 定义P0.0为数据输入端口 sbit Clr=P0^2; // 定义P0.2为清零端口 sbit Clk=P0^1; // 定义P0.1为时钟端口 //------------函数的声明----------------- void DelayMS(uint16 dly); void Data_Send(uint8 num); /********************************************** 函数名:main() 主函数 **********************************************/ void main() { while(1) { //显示数字1 Data_Send(0x00); //发送数据0x9f进行显示 DelayMS(100); //适当延长,延时过短二极管会出现闪烁现象 while(1) ; } } /******************************************************** ** 名称 :void DelayMS(uint16 dly) ** 功能 :毫秒级延时(24M的晶振) ** 入口参数 :dly 用户的延时参数 ** 出口参数 :无 *********************************************************/ void DelayMS(uint16 dly) { uint16 x,y; for(x=dly;x>0;x--) for(y=10;y>0;y--); } /******************************************* 名称:Data_Send() 功能:用164实现数字显示 入口参数:uchar num 为要传送的数据变量 出口参数:无 *******************************************/ void Data_Send(uint8 num) { uint8 i; Clr=1; for(i=0;i<8;i++) { Clk=0; if((num&0x01)!=0) Data = 1; else Data = 0; // Data=num&0x01; //先传送要发送数据的最低位 num=num>>1; //右移1位,再传数据的高位 DelayMS(5); Clk=1; DelayMS(5); } }
转载请注明原文地址: https://www.6miu.com/read-2632204.html

最新回复(0)