本篇之后都是提高篇
1)只为学习,不讨论现实意义
2)与实物电路会有差距(以实物为准)
3)讲解范围:串行通信、数码管、1602、12864、点阵、直流电机、AD、DA等基础电路。
高级内容暂不讲(USB、CAN、DMA、Wifi、网络、真彩大液晶、触摸屏、GPS、GPRS、Zigbee、NandFlash、Camera等等)(ARM11上讨论这些)
#基础知识
通信分为两种:并行通信和串行通信。
并行通信是将要所传送的数据的各位同时发送或接受,在该通信中,使用几条数据线,将数据分段同时进行传输,传输速度快,信息率高。
串行通信时使用很少的数据线,将要传送数据各个位按顺序一位一位地发送或接收,每一位都需要固定的时间长度,在串行通信中仅少量的传输线即可。
并行口
串行口
1)串行通信的几种制式
单工
半双工
全双工
2)串行通信标准
常见的串行通信标准
UART | TXD、RXD、GND (三线) | TXD:发送端 RXD:接收端 | 异步 | 全双工 |
1-Wire | DQ (一线) | DQ:发送/接收端 | 异步 | 半双工 |
SPI | SCK、MISO、MOSI (三线) | SCK:同步时钟 MISO:主机输入,从机输出 MIOSI:主机输出,从机输入 | 同步 | 全双工 |
I2C | SCL、SDA (二线) | SCL:同步时钟 SDA:数据输入/输出端 | 同步 | 半双工 |
#实验
1)了解164芯片引脚
A、B:串行数据输入端。
Clock:时钟输入端。
Clear:清零端。当次引脚为低电平时,并行输出引脚将全部为低电平。
QAQH:数据输出引脚。这八个引脚为bit0bit8,8位数据输出引脚。
2)通信过程
74HC164真值表
******************************************************************/
* 【课程13】 ****单片机与164的通信***********
* 【说 明】 ****74HC164串行单工通信
* 【描 述】 ****用IO口模拟时序,实现单片机与164的通信
******************************************************************/
#include
//---------常用的两个宏定义--------------
#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);
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』