从单片机基础到程序框架(全集 2019pdf版).pdf - 第742页

P1_4=0; //第 1 个灯 亮 P1_5=1; //第 2 个灯 灭 P1_6=1; //第 3 个灯 灭 P3_3=1; //第 4 个灯 灭 //根据 当前的速度档 位 Gu8RunSpeed ,来初始化 速度时间参数 G u16RunSpe edTimeDate if(1==Gu 8RunSpeed) { Gu16RunS peedTimeDat e=RUN_TIME _SLOW; //赋值 “慢”档的 时间参数 } els…

100%1 / 836
{
P3_4=1;
}
void T0_time() interrupt 1
{
VoiceScan(); //蜂鸣器的驱动函数
KeyScan(); //按键底层的驱动扫描函数
DisplayScan(); //数码管底层的驱动扫描函数
if(1==vGu8ScanTimerFlag&&vGu16ScanTimerCnt>0)
{
vGu16ScanTimerCnt--;
}
if(1==vGu8RunTimerFlag&&vGu16RunTimerCnt>0) //用于控制跑马灯跑动速度的定时
{
vGu16RunTimerCnt--;
}
TH0=0xfd; //此参数可根据具体的时间来修改,尽量确保每定时中断一次接近 1ms
TL0=0x40; //此参数可根据具体的时间来修改,尽量确保每定时中断一次接近 1ms
}
void SystemInitial(void)
{
P0=0x00;
P1_0=1;
P1_1=1;
P1_2=1;
P1_3=1;
TMOD=0x01;
TH0=0xfd; //此参数可根据具体的时间来修改,尽量确保每定时中断一次接近 1ms
TL0=0x40; //此参数可根据具体的时间来修改,尽量确保每定时中断一次接近 1ms
EA=1;
ET0=1;
TR0=1;
//上电初始化一些关键的数
Gu8Wd=1; //窗口 1。开机默认处于正常工作的窗口
Gu8WdUpdate=1; //整屏更新变量
//跑马灯处于初始化的状态
P1_4=0; //第 1 个灯
P1_5=1; //第 2 个灯
P1_6=1; //第 3 个灯
P3_3=1; //第 4 个灯
//根据当前的速度档 Gu8RunSpeed,来初始化速度时间参数 Gu16RunSpeedTimeDate
if(1==Gu8RunSpeed)
{
Gu16RunSpeedTimeDate=RUN_TIME_SLOW; //赋值“慢”档的时间参数
}
else if(2==Gu8RunSpeed)
{
Gu16RunSpeedTimeDate=RUN_TIME_MIDDLE; //赋值“中”档的时间参数
}
else
{
Gu16RunSpeedTimeDate=RUN_TIME_FAST; //赋值“快”档的时间参数
}
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
}
第一百二十五节: “双线”的肢体接触通信。
【125.1 “双线”的肢体接触通信。
芯片之间通信,都离不开“数据信号”和“时钟信号”,缺一不可。“数据信号”和“时钟信号”是什么
关系,它们是怎样相互配合来实现通信的功能?其实原理也很简单。打个比喻,甲乙两个人,规定只能靠
手”和一只“脚”进行肢体接触的通信,们之间如何传输数据“手”可以产生“两种”状态握紧
和“松开”“脚”可以产生“一种”状态“踢一脚”。他们之间约定,甲发送数据给乙,乙每被甲“踢一脚”
就去记录一次手的状态是“握紧”还是“松开”“握紧”代表二进制的 0,“松开”代表二进制 1,这样,
如果他们之间想传输一个字节的十六进制数据 0x59,只需把十六进制的数据 0x59 展开成二进 01011001,
从右到左(从低位到高位)以“位”为单位挨个发送,过程如下:
第一次“踢一脚”:手的状态是“松开”,记录 1。
第二次“踢一脚”:手的状态是“握紧”,记录 0。
第三次“踢一脚”:手的状态是“握紧”,记录 0。
第四次“踢一脚”:手的状态是“松开”,记录 1。
第五次“踢一脚”:手的状态是“松开”,记录 1。
第六次“踢一脚”:手的状态是“握紧”,记录 0。
第七次“踢一脚”:手的状态是“松开”,记录 1。
第八次“踢一脚”:手的状态是“握紧”,记录 0。
上述肢体接触的通信过程其实一只手”就代表了一“数据线”以产生高电平“1”和低电平“0”
这两种状态,而一“脚”代表了一“时钟线”但是“踢一脚”代表了“时钟线”的一种什么状态呢
注意,“踢一脚”既不是高电平“1”也不是低电平“0”,而是瞬间只产生一次的“上升沿”或者“下降沿”
何谓“上升沿”何谓“下降沿”?“上升沿”是代表“时钟线从低电平跳变到高电平的瞬间“下升沿”是
代表“时钟线从高电平跳变到低电平的瞬间”“踢一脚”“上升沿”“下降沿”此三者都可以统一理解成“节
拍”
芯片之间通信,“时钟信号”只需 1 个足矣,“数据信号”却可以不止 1 个。1 “数据信号”往往叫
“串行”通信,一个节拍只能传输 1 位数据。8 个以上并列的“数据信号”往往叫“并行”通信,一个节拍
能传输 8 位以上的数据。可见,并行的“数据信号”越多,传输的速率越快。
IICSPI USBCAN 32
nandflash,norflash,sdram,sram 这些信往“并信,号多 8 16
32 个。
本节标题之所以强调“双线”是因为“手”代表数据线,“脚”代表时钟线,一共两条线因此为“双线”
现在把上述的肢体通信过程翻译成 C 语言代码,甲发送数据的代码如下:
sbit Hand_DATA=P2^6; //手的数据线
sbit Foot_CLK=P2^7; //脚的时钟线
void SendByte(unsiged char u8Data) //甲发送数据的发送函数
{
static unsigned char i;
for(i=0;i<8;i++) //一个字节包 8 个位数据,需要循环 8
{
if(0==(u8Data&0x01)) //根据数据的每一位状态,发送对应的位数据。