找回密码
 立即注册
楼主: 白一宁

《STC最新8051单片机原理及应用-STC8H8K64U》学习打卡

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-12-11 01:03:17

3

主题

21

回帖

142

积分

注册会员

积分
142
发表于 2024-7-7 09:34:16 | 显示全部楼层
本帖最后由 白一宁 于 2024-7-7 09:43 编辑

第十一节 单片机C语言程序设计导入一C51对ANSIC的扩展C51扩展的关键字
C51有以下19个扩展关键字:at、sbit、sfr、bit、sfr16、idata.bdata、xdata、pdata、data、code、alien、small、compact、 large、usingreentrant、interrupt、 task
变量或数据类型[td]
数据类型
含 义
位数/bit
字节数/B
取值范围
bit*
位型
1
1/8
0或1
signed char
带符号字符型
8
1
-128~127
unsigned char
无符号字符型
8
1
0~255
enum
枚举
8/16
1或2
-128~127或-32768~32,767
signed short
带符号短型
16
2
-32,768~32,767
unsigned short
无符号短型
16
2
0~65,535
signed int
带符号整型
16
2
-32,768~32,767
unsigned int
无符号整型
16
2
0~65,535
signed long
带符号长整型
32
4
-2,147,483,648~2,147,483,647
unsigned long
无符号长整型
32
4
0~429,4967.295
float
浮点型
32
4
+1.175,494,E38~3.402,823,E+38
sbit*

1
1/8
0~1
sfr*

8
1
0x80~0xff
sfr16*

16
2
0x80~0xff
注:带*部分为C51所特别支持的变量类型(扩展的数据类型),它们不属于ANSIC,不能用指针对它们存取。包括:
  • bit:位变量,值为0或1。
  • sbit:从字节中定义的位变量(0或1)。
  • sfr:sfr字节地址(0x80~0xff)
  • sfr16:sfr字地址(0x80~0xff,其实是占用两个连续的地址)。
其余的数据类型如char、enum、short、int、long、float等与ANSI C相同.
bit型变量
bit型变量可用于变量类型和函数声明、函数返回值等,存储于内部RAM的20H~2FH单元中。需要注意:
  • 位不能声明为一个指针。如bit *bit poiter;是错误的。
  • 不能有bit数组如bit arr[5];是错误的。
可位寻址区说明
使用sbit声明可独立访问可位寻址对象的位。sbit声明要求基址对象的存储器类型为“bdata”,否则只有绝对的位声明方法是合法的。
位的位置(“^”操作符号后的数字)的最大值依赖于指定的基类型
对char/unsigned char 而言是0~7
对于intunsignedint/short/unsigned short而言是0~15
对于long/unsigned long而言是0~31。
特殊功能寄存器(SFR)
STC8H8K64U单片机的特殊功能寄存器(SFR)寻址区,用来控制定时1计数器、串口、I/0及其他部件。为了支持SFR及其可寻址位的声明,引入了sfr、sbit等关键词
内存区域的指定
  • 程序存储器
    code关键字表示将变量保存到程序存储区。可以使用code定义表格常数,这样可以节省内部RAM的使用。例如,可以使用下面的代码保存共阴极数码LED的显示字模:
  1. unsigned char codeled buf[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
复制代码

  • 内部RAM
    内部数据存储器用以下关键字说明:
    • data:直接寻址区,内部RAM的低128字节,地址范围为00H~7FH。在用户程序中声明变量时,默认都保存在该区域。
    • idata: 间接寻址区,包括整个内部RAM区256字节,地址范围为00H~0FFH。
    • bdata:可位寻址区,地址范围为20H~2FH。
  • 外部数据存储器
    外部RAM视使用情况可由以下关键字标识:
    • xdata:可指定多达64KB的外部直接寻址区,地址范围0000HOFFFFH。在用户程序中,需要声明较大的数组时,可以使用xdata关键字将变量数组保存到扩展RAM中。
    • pdata:能访问1页(256B)的外部RAM(很少用)

Keil C51指针
Keil C51支持一般指针(Generic Pointer)和存储器指针(Memory Specific Pointer)。一般指针的声明和使用均与标准C相同,同时还可以说明指针的存储类型。例如,下面的语句都声明pt为指向保存在外部RAM中unsigned char数据的指针,但pt本身的保存位置却不同:
  1.      unsigned char xdata *pt;            //pt本身依存储模式存放   
  2.   unsigned charxdatadata pt;          //pt被保存在内部RAM中   
  3. unsigned char xdata *xdata pt;      //pt被保存在外部RAM中
复制代码
  1.      char data * str;            //str指向data区中char型数据  
  2.    int xdata *pow;             //pow指向外部RAM的int型整数
复制代码


除了和标准C语言一样使用指针外,指针还可以用来访问外部并行扩展的器件。例如,为了方便地访问外部存储器及I/0端口,在C51中的absacc.h头文件做了如下定义,利用这些定义可以方便地访问外部I/O端口。
  1.     #define CBYTE ((unsigned char volatile code *) 0)   
  2. #define DBYTE ((unsigned char volatile code *) 0)   
  3. #define PBYTE ((unsigned char volatile code *) 0)   
  4. #define XBYTE ((unsigned char volatile code *) 0)
复制代码


其中,volatile影响编译器编译的结果,volatile告诉编译器变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错。这样,如果变量是一个寄存器变量或者表示一个端口,使用volatile可以保证对特殊地址的稳定访问,不会出错。在stc8h.h文件中,对于位于扩展RAM区域的特殊功能寄存器的声明就使用了这样的方法。
例如P0口上拉电阻控制寄存器的声明如下:
   
  1. #define P0PU (*(unsigned char volatile xdata *)0xfe10)
复制代码
[td]
运算符
名称
功能
功能
<
小于
a
大于
>=
大于等于
a>=b
a大于等于b时返回真;否则返回假
==
等于
a==b
a等于b时返回真;否则返回假
!=
不等于
a!=b
a不等于b时返回真;否则返回假
特别注意,判断两个常数或者表达式相等时,使用“==”,不要使用单个的“=”否则,判断两个数是否相等就变成了赋值语句,编译时不会提示错误或警告,但执行结果般是不正确的。
逻辑运算符
逻辑运算符包括与(&&)、或()、非(!)三种,用于对包含关系运算符的表达式进行合并或取非。对于使用逻辑运算符的表达式,返回0表示“假”,返回1表示“真”
位运算符
很多应用程序常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。C语言提供了六种位运算符,分别为按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)和右移(>>)。按位运算的数据长度与参与运算的变量类型有关。
  • 按位与运算
    按位与运算符“&”是双目运算符。其功能是参与运算的两个数或变量对应的二进位相只有对应的两个二进位均为1时,结果位才为1,否则为0。
  • 按位或运算
    按位或运算符“|”是双目运算符。应的两个二进位有一个为1时,结果为1,否则为0。
  • 按位异或运算
    按位异或运算符“^”是双目运算两个对应的二进位相异时,结果为1,否则为0。
  • 求反运算
    求反运算符“~”为单目运算符。其功能是对参与运算的数的各二进位按位求反
  • 左移运算
    左移运算符“<<”是双目运算符。其功能是把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
  • 右移运算
    右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位全部右移若“>>”右边的数指定移动的位数。对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1。## STC8H8K64U单片机C51程序框架
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-12-11 01:03:17

3

主题

21

回帖

142

积分

注册会员

积分
142
发表于 2024-7-8 17:38:10 | 显示全部楼层
第十一节 单片机C语言程序设计导入一C51对ANSIC的扩展C51扩展的关键字
C51有以下19个扩展关键字:at、sbit、sfr、bit、sfr16、idata.bdata、xdata、pdata、data、code、alien、small、compact、 large、usingreentrant、interrupt、 task
变量或数据类型[td]
数据类型
含 义
位数/bit
字节数/B
取值范围
bit*
位型
1
1/8
0或1
signed char
带符号字符型
8
1
-128~127
unsigned char
无符号字符型
8
1
0~255
enum
枚举
8/16
1或2
-128~127或-32768~32,767
signed short
带符号短型
16
2
-32,768~32,767
unsigned short
无符号短型
16
2
0~65,535
signed int
带符号整型
16
2
-32,768~32,767
unsigned int
无符号整型
16
2
0~65,535
signed long
带符号长整型
32
4
-2,147,483,648~2,147,483,647
unsigned long
无符号长整型
32
4
0~429,4967.295
float
浮点型
32
4
+1.175,494,E38~3.402,823,E+38
sbit*

1
1/8
0~1
sfr*

8
1
0x80~0xff
sfr16*

16
2
0x80~0xff
注:带*部分为C51所特别支持的变量类型(扩展的数据类型),它们不属于ANSIC,不能用指针对它们存取。包括:
  • bit:位变量,值为0或1。
  • sbit:从字节中定义的位变量(0或1)。
  • sfr:sfr字节地址(0x80~0xff)
  • sfr16:sfr字地址(0x80~0xff,其实是占用两个连续的地址)。
其余的数据类型如char、enum、short、int、long、float等与ANSI C相同.
bit型变量
bit型变量可用于变量类型和函数声明、函数返回值等,存储于内部RAM的20H~2FH单元中。需要注意:
  • 位不能声明为一个指针。如bit *bit poiter;是错误的。
  • 不能有bit数组如bit arr[5];是错误的。
可位寻址区说明
使用sbit声明可独立访问可位寻址对象的位。sbit声明要求基址对象的存储器类型为“bdata”,否则只有绝对的位声明方法是合法的。
位的位置(“^”操作符号后的数字)的最大值依赖于指定的基类型
对char/unsigned char 而言是0~7
对于intunsignedint/short/unsigned short而言是0~15
对于long/unsigned long而言是0~31。
特殊功能寄存器(SFR)
STC8H8K64U单片机的特殊功能寄存器(SFR)寻址区,用来控制定时1计数器、串口、I/0及其他部件。为了支持SFR及其可寻址位的声明,引入了sfr、sbit等关键词
内存区域的指定
  • 程序存储器
    code关键字表示将变量保存到程序存储区。可以使用code定义表格常数,这样可以节省内部RAM的使用。例如,可以使用下面的代码保存共阴极数码LED的显示字模:
    1. unsigned char code
    2. led buf[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    复制代码

  • 内部RAM
    内部数据存储器用以下关键字说明:
    • data:直接寻址区,内部RAM的低128字节,地址范围为00H~7FH。在用户程序中声明变量时,默认都保存在该区域。
    • idata: 间接寻址区,包括整个内部RAM区256字节,地址范围为00H~0FFH。
    • bdata:可位寻址区,地址范围为20H~2FH。
  • 外部数据存储器
    外部RAM视使用情况可由以下关键字标识:
    • xdata:可指定多达64KB的外部直接寻址区,地址范围0000HOFFFFH。在用户程序中,需要声明较大的数组时,可以使用xdata关键字将变量数组保存到扩展RAM中。
    • pdata:能访问1页(256B)的外部RAM(很少用)

Keil C51指针
Keil C51支持一般指针(Generic Pointer)和存储器指针(Memory Specific Pointer)。一般指针的声明和使用均与标准C相同,同时还可以说明指针的存储类型。例如,下面的语句都声明pt为指向保存在外部RAM中unsigned char数据的指针,但pt本身的保存位置却不同:
  1.    unsigned char xdata *pt;            //pt本身依存储模式存放
  2.      unsigned charxdatadata pt;          //pt被保存在内部RAM中
  3.      unsigned char xdata *xdata pt;      //pt被保存在外部RAM中
复制代码

基于存储器的指针,说明时即指定了存储类型,例如:
  1.      char data * str;            //str指向data区中char型数据
  2.      int xdata *pow;             //pow指向外部RAM的int型整数
复制代码

除了和标准C语言一样使用指针外,指针还可以用来访问外部并行扩展的器件。例如,为了方便地访问外部存储器及I/0端口,在C51中的absacc.h头文件做了如下定义,利用这些定义可以方便地访问外部I/O端口。
  1.     #define CBYTE ((unsigned char volatile code *) 0)
  2.     #define DBYTE ((unsigned char volatile code *) 0)
  3.     #define PBYTE ((unsigned char volatile code *) 0)
  4.     #define XBYTE ((unsigned char volatile code *) 0)
复制代码

其中,volatile影响编译器编译的结果,volatile告诉编译器变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错。这样,如果变量是一个寄存器变量或者表示一个端口,使用volatile可以保证对特殊地址的稳定访问,不会出错。在stc8h.h文件中,对于位于扩展RAM区域的特殊功能寄存器的声明就使用了这样的方法。
例如P0口上拉电阻控制寄存器的声明如下:
  1.     #define P0PU (*(unsigned char volatile xdata *)0xfe10)
复制代码

单片机C语言程序中的常用运算关系运算符
关系运算符用于比较两个常数或者表达式的大小。关系运算的结果只能是0或1。
关系运算符的值为真时,结果值为1:关系运算符的值为假时,结果值为0。
[td]
运算符
名称
功能
功能
<
小于
a
大于
>=
大于等于
a>=b
a大于等于b时返回真;否则返回假
==
等于
a==b
a等于b时返回真;否则返回假
!=
不等于
a!=b
a不等于b时返回真;否则返回假
特别注意,判断两个常数或者表达式相等时,使用“==”,不要使用单个的“=”否则,判断两个数是否相等就变成了赋值语句,编译时不会提示错误或警告,但执行结果般是不正确的。
逻辑运算符
逻辑运算符包括与(&&)、或()、非(!)三种,用于对包含关系运算符的表达式进行合并或取非。对于使用逻辑运算符的表达式,返回0表示“假”,返回1表示“真”
位运算符
很多应用程序常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。C语言提供了六种位运算符,分别为按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)和右移(>>)。按位运算的数据长度与参与运算的变量类型有关。
  • 按位与运算
    按位与运算符“&”是双目运算符。其功能是参与运算的两个数或变量对应的二进位相只有对应的两个二进位均为1时,结果位才为1,否则为0。
  • 按位或运算
    按位或运算符“|”是双目运算符。应的两个二进位有一个为1时,结果为1,否则为0。
  • 按位异或运算
    按位异或运算符“^”是双目运算两个对应的二进位相异时,结果为1,否则为0。
  • 求反运算
    求反运算符“~”为单目运算符。其功能是对参与运算的数的各二进位按位求反
  • 左移运算
    左移运算符“<<”是双目运算符。其功能是把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
  • 右移运算
    右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位全部右移若“>>”右边的数指定移动的位数。对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1。## STC8H8K64U单片机C51程序框架

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-12-11 01:03:17

3

主题

21

回帖

142

积分

注册会员

积分
142
发表于 2024-7-8 17:40:12 | 显示全部楼层
本帖最后由 白一宁 于 2024-7-8 17:44 编辑

第十二集 单片机C语言程序设计导入二单片机的C语言程序设计实例通过延时函数,由P2.1输出周期为1s的方波信号,实现实验箱的LED闪烁。
  1. # include "stc8h.h"
  2. void Delay500ms(void);
  3. void main(void)
  4. {
  5.         P2M0=0xff;
  6.         P2M1=0xff;
  7.         
  8.         P21=0;
  9.         while(1)
  10.         {
  11.                 P21=1;
  12.                 Delay500ms();
  13.                 P21=0;
  14.                 Delay500ms();
  15.         }
  16. }
  17. void Delay500ms(void)        //@11.0592MHz
  18. {
  19.         unsigned char data i, j, k;
  20.         i = 29;
  21.         j = 14;
  22.         k = 54;
  23.         do
  24.         {
  25.                 do
  26.                 {
  27.                         while (--k);
  28.                 } while (--j);
  29.         } while (--i);
  30. }
复制代码



通过延时函数,由P2流水灯
  1. # include "stc8h.h"
  2. void Delay500ms(void);
  3. void main(void)
  4. {
  5.         unsigned char LEDdata=0x01,i;
  6.         
  7.         P2M0=0xff;
  8.         P2M1=0xff;
  9.         
  10.         P21=0;
  11.         while(1)
  12.         {
  13.                 for(i=0;i<8;i++)
  14.                 {
  15.                         LEDdata<<=1;
  16.                         P2=~LEDdata;
  17.                         if(LEDdata==0)
  18.                                 LEDdata=0x01;
  19.                         Delay500ms();
  20.                 }
  21.         }
  22. }
  23. void Delay500ms(void)        //@11.0592MHz
  24. {
  25.         unsigned char data i, j, k;
  26.         i = 29;
  27.         j = 14;
  28.         k = 54;
  29.         do
  30.         {
  31.                 do
  32.                 {
  33.                         while (--k);
  34.                 } while (--j);
  35.         } while (--i);
  36. }
复制代码


单片机Flash作为EEPROM使用的基本操作。实现对0x0400单元的擦除和读写操作。
  1. #include "stc8h.h"
  2. #include
  3. void IapIdle();
  4. char IapRead(int addr);
  5. void IapProgram(int addr, char dat);
  6. void IapErase(int addr);
  7. void main(void)
  8. {
  9.         unsigned char dataread = 0 ,datawrite = 0;
  10.         
  11.         IapErase(0x0400);
  12.         dataread = IapRead(0x400);
  13.         IapProgram(0x400,0x12);
  14.         
  15.         while(1);
  16. }
  17. //--------------------------------------------------------------
  18. void IapIdle()
  19. {
  20.         IAP_CONTR = 0;  //关闭IAP功能
  21.         IAP_CMD = 0;    //清除命令寄存器
  22.         IAP_TRIG = 0;   //清除触发寄存器
  23.         IAP_ADDRH = 0x80;  //将地址设置到飞IAP区域
  24.         IAP_ADDRL = 0;  
  25. }
  26. char IapRead(int addr)
  27. {
  28.         char dat;
  29.         
  30.         IAP_CONTR = 0x80;                  //使能IAP
  31.         IAP_TPS = 12;                      //设置等待参数12MHz
  32.         IAP_CMD = 1;                            //设置IAP读命令
  33.         IAP_ADDRL = addr;                  //设置IAP低地址
  34.         IAP_ADDRH = addr>>8;  //设置IAP高地址
  35.         IAP_TRIG = 0x5a;                   //写触发寄命令 0x5a
  36.         IAP_TRIG = 0xa5;                   //写触发寄命令 0xa5
  37.         _nop_();
  38.         dat = IAP_DATA;                                //读IAP数据
  39.         IapIdle();                                                //关闭IAP功能
  40.         
  41.         return dat;
  42. }
  43. void IapProgram(int addr, char dat)
  44. {
  45.         IAP_CONTR = 0x80;                  //使能IAP
  46.         IAP_TPS = 12;                      //设置等待参数12MHz
  47.         IAP_CMD = 2;                            //设置IAP读命令
  48.         IAP_ADDRL = addr;                  //设置IAP低地址
  49.         IAP_ADDRH = addr>>8;  //设置IAP高地址
  50.         IAP_DATA = dat;       //写IAP数据
  51.         IAP_TRIG = 0x5a;                   //写触发寄命令 0x5a
  52.         IAP_TRIG = 0xa5;                   //写触发寄命令 0xa5
  53.         _nop_();
  54.         dat = IAP_DATA;                                //读IAP数据
  55.         IapIdle();                                                //关闭IAP功能
  56. }
  57. void IapErase(int addr)
  58. {
  59.         IAP_CONTR = 0x80;                    //使能IAP
  60.         IAP_TPS = 12;                      //设置等待参数12MHz
  61.         IAP_CMD = 3;                            //设置IAP读命令
  62.         IAP_ADDRL = addr;                  //设置IAP低地址
  63.         IAP_ADDRH = addr>>8;  //设置IAP高地址
  64.         IAP_TRIG = 0x5a;                   //写触发寄命令 0x5a
  65.         IAP_TRIG = 0xa5;                   //写触发寄命令 0xa5
  66.         _nop_();
  67.         IapIdle();                                                //关闭IAP功能
  68. }
  69.         
复制代码


擦除dataread

Ctrl+F1查看手册






P21闪烁.mp4

903.85 KB, 下载次数: 197

P2流水灯.mp4

851.24 KB, 下载次数: 196

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-12-11 01:03:17

3

主题

21

回帖

142

积分

注册会员

积分
142
发表于 2024-7-9 17:37:08 | 显示全部楼层
第十三节 中断原理及工作机制一1. 中断的相关概念
中断的概念是在20世纪50年代中期提出的,是计算机中的一个很重要的技术,它既和硬件有关,也和软件有关。正是因为有了中断技术,才使得计算机的工作更加灵活、效率更高中断技术的出现使得计算机的发展和应用大大的推进了一步。所以,中断功能的强弱已成为衡量一台计算机功能完善与否的重要指标。
最初引进中断技术的目的是为了提高计算机输入输出的效率,改善计算机的整体性能。当CPU需要与外部设备交换一批数据时,由于CPU的工作速度远远高于外设的工作速度,每传送一组数据后,CPU等待“很长”时间才能传送下一组数据,在等待期间CPU处在空运行状态,造成CPU的浪费。
所谓中断是指计算机在执行其他程序的过程中,当出现了某些异常事件或某种请求时CPU暂时中止正在执行的程序,而转去执行对异常事件或某种请求的服务程序。当服务完毕后,CPU 再回到被暂时中止的程序继续执行。
2. 其他中断相关概念
请示CPU中断的请求源称为中断源
中断源向CPU发出中断申请,CPU暂停当前工作转去处理中断源事件称为中断响应
对整个事件的处理过程称为中断服务
事件处理完毕CPU返回到被中断的地方称头中断返回
3. 中断优先级
计算机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断要求为其服务的时候,就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求,
当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它更高的中断源请求,CPU暂停原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低优先级中断的服务程序,这样的过程称为中断嵌套
4. 中断的优势
计算机采用中断技术,大大提高了工作效率和处理问题的灵活性,主要表现在3个方面
  • 解决了快速CPU和慢速外设之间的矛盾,可使CPU和外设并行工作。
  • 可及时处理控制系统中许多随机参数和信息。
  • 具备了处理故障的能力,提高了机器自身的可靠性。
中断类似于程序设计中的调用子程序,但它们又有区别
[td]
中 断
调用子程序
产生是随机的
程序中事先安排好的
既保护断点,又保护现场
可只保护断点
为外设服务和为处理各种事件服务
为主程序服务(与外设无关)
5. 开中断和关中断(终端使能)
中断的开放(称为开中断或中断允许)和中断的关闭(称为关中断或中断禁止)可以通过指令设置相关特殊功能寄存器的内容来实现,这是CPU能否接受中断请求的关键。只有在开中断的情况下,才有可能接受中断源的请求。
6. 保护现场和恢复现场
在主程序调用子程序或中断处理过程时,分别要保存返回地址(断点地址)和保护现场,以便在返回时能够回到调用前的程序段,继续运行原来的程序。
进入子程序或中断处理程序后保护相关寄存器中的值的操作,叫做保护现场;
子程序返回或中断处理返回前,恢复相关寄存器中的值的操作,叫做恢复现场
保护现场的方法是将现场条件(寄存器的值)先推入(使用PUSH命令)堆栈保存,然后再使用这些寄存器,返回主程序前,弹出(使用POP指令)寄存器的值这些功能都要通过堆栈操作来实现。
其中通用寄存器的保存和恢复需要由堆栈操作指令来完成;返回地址的保存与恢复的堆栈操作都是在相应的子程序的调用和返回指令的操作中自动完成的,无需再用专门的堆栈操作指令。
7. 堆栈
堆栈区是将内部存储器的一部分区域划作专门用于堆栈的区域。堆栈操作有其特定的规则,叫做后进先出(Last In First 0ut,LIF0)规则,即最后存入的数据将被最先取出。堆栈区当前的栈顶地址用堆栈指针寄存器(SP)中的值表示,即SP 始终指向栈顶。
8.中断的撤除
在响应中断请求后,返回主程序之前,该中断请求标志应该撤除,否则,单片机执行完中断服务程序会误判为又发生了中断请求而错误地再次进入中断服务程序。单片机中有些中断请求标志会自动撤除,有些不能自动撤除,必须用户使用相应的指令撤除
STC8H8K64U单片机的中断源1. 中断源
STC8H8K64U单片机共有44个中断源,它们分别是:
  • 5个外部中断(INT0~INT4)
  • 5个定时/计数器溢出中断(T0~T4)
  • 4个异步串口中断(UART1~ UART4)
  • 1个串行外设接口中断(SPI)
  • 1个12C总线中断、1个USB中断
  • 1个模数转换中断(ADC)、1个低压检测中断(LVD)、1个比较器中断(CMP)
  • 2个PWM中断(PWMA和PWMB)
  • 8个端口中断(P0~P7)
  • 12个DMA中断
  • 1个RTC中断
  • 1个LCM中断
除外部中断2、外部中断3、定时器2、定时器3、定时器4固定是最低优先级中断外,其他的中断都具有4个优先级,可实现四级中断嵌套。
2. 中断源及控制
3. 中断标志位外部中断和定时器的中断请求标志
外部中断0(INTO)和外部中断1(INT1)既可双边沿触发(即上升沿和下降沿都可以触发)也可以只有下降沿触发。这两个外部中断的请求标志位分别是寄存器TCON中的IEO/TCON1和IE1/TCON.3。当外部中断服务程序被响应后,中断标志位亚0和正1会自动清0。外部中断0(INTO)和外部中断1(INT1)还可以用于将单片机从掉电模式唤醒。TCON的各个位含义如下:
  • IT0:外部中断INT0触发方式控制位。可由软件置1或清0。
    0:上升沿和下降沿均可触发外部中断。当INT0引脚出现上升沿或者下降沿时,置位IE0。
    1:下降沿触发方式。INT0引脚上电平由高到低的负跳变时,置位0。
  • IE0:外部中断INTO请求标志。
  • IT1:外部中断INT1触发方式控制位,与IT0类似。
  • IE1:外部中断INT1请求标志,其意义和IE0相同。
  • TR0:定时/计数器T0启动/停止控制位。
  • TF0:定时/计数器T0的溢出中断标志。若CPU响应中断,在进入中断后,CPU自动将TFO清0。TF0也可用软件清0(查询方式)
  • TR1:定时/计数器T1启动/停止控制位。
  • TF1定时/计数器T1的中断标志,功能和TFO类似:
中断标志辅助寄存器AUXINTIF用于保存外部中断24和定时器24的中断请求标志。
串口的中断请求标志
串口1、串口2、串口3和串口4的中断请求标志分别锁存在特殊功能寄存器SCON、S2CONS3CON和S4CON中。这些中断请求标志都不能自动清0,需要用户在中断服务程序中使用软件清0。各位的定义如下:

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-12-11 01:03:17

3

主题

21

回帖

142

积分

注册会员

积分
142
发表于 2024-7-10 09:57:13 | 显示全部楼层
第十四节 中断原理及工作机制二中断标志位电源控制寄存器PCON中的标志位

LVDF是低电压检测标志位,同时也是低电压检测中断请求标志位。在正常工作和空闲工作状态时,如果内部工作电压VCC低于低电压检测门槛电压,低电压中断请求标志位(LVDF/PCON.5)自动置1,与低电压检测中断是否被允许无关。即在内部工作电压VCC低于低电压检测门槛电压时,不管有没有允许低电压检测中断,LVDFIPCON.5都自动为1该位要用软件清0,清0后,如内部工作电压VCC低于低电压检测门槛电压,该位又被自0动设置为1。
SPI状态寄存器SPSTAT中的标志位

SPIF是SPI传输完成标志。当一次传输完成时,SPIF被置位。此时,如果SPI中断被打开(ESPI=1,EA=1),将产生中断。
ADC控制寄存器ADC CONTR中的标志位

ADC FLAG是A/D转换结束标志位。AD转换完成后,ADC FLAG=1。此时,若允许A/D转换中断(EADC=1,EA=1),则由该位申请产生中断。也可以由软件查询该标志位判断ADD转换是否结束。不管是AD转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转换是否结束,当AD转换完成后,ADCFLAG=1,一定要软件清0。
中断的允许、禁止及优先级中断的开放和禁止
STC8H8K64U单片机中断的开放和禁止是通过设置相关寄存器的控制位实现的,对中断源的开放和禁止由两级控制组成的,即总控制和对每个中断源的分别控制。总控制用于决定整个中断系统是开放还是关闭,当整个中断系统关闭时,CPU不响应任何中断请求。对于每个中断源的分别控制是在中断系统开放的前提下,决定某一个中断源是开放还是禁止。
中断允许总控制位
0:关闭中断系统,所有中断源的中断请求均被禁止,称为关中断,
1:开放中断系统,所有中断源的中断请求均被开放,称为开中断,但某一个中断源的请求是否开放,还要由该中断源所对应的中断允许控制位所决定。
ELVD:低压检测中断允许位。
0:禁止低压检测中断
1:允许低压检测中区
EADC:A/D转换中断允许位。
0:禁止A/D转换中断
1:允许A/D转换中断
ES:串行口允许位。
0:禁止串行口1中断
1:允许串行口1中断
ET1:定时1计数器T1的溢出中断允许位。
0:禁止T1中断
1:允许T1中断
EX1:外部中断1中断允许位。
0:禁止INT1中断
1:允许INT1中断
ETO:定时1计数器T0的溢出中断允许位。
0:禁止T0中断
1:允许T0中断
EX0:外部中断0中断允许位。
0:禁止INTO中断
1:允许INTO中断
中断优先级

00:中断优先级为0级(最低级)
01:中断优先级为1级(较低级)
10:中断优先级为2级(较高级)
11:中断优先级为3级(最高级)
单片机中断处理过程1. 中断响应的条件及过程
当中断源向CPU发出中断请求时,如果中断的条件满足,CPU将进入中断响应周期。单片机响应中断的条件是:
  • 中断源有请求。
  • 中断允许寄存器征相应位置1。
  • CPU中断开放(EA=1)
CPU响应中断时,将相应的优先级状态触发器置1,然后由硬件自动产生一个长调用指令LCALL此指令首先把断点地址压入堆栈保护,再将中断服务程序的入口地址送入到程序计数器PC,使程序转向相应的中断服务程序。
单片机对中断优先级的处理原则是
  • 不同级的中断源同时申请中断时,先高后低
  • 处理低级中断又收到高级中断请求时,停低转高
  • 处理高级中断却收到低级中断请求时,高不睬低
  • 同一级的中断源同时申请中断时,事先规定
在程序的运行过程中,并不是任何时刻都可以响应中断请求。当出现下列情况时,CPU不会响应中断请求:
  • 中断允许总控制位EA=0或发出中断请求的中断所对应的中断允许控制位为0
  • CPU正在执行一个同级或高一级的中断服务程序
  • 当前执行的机器周期不是指令周期的最后一个机器周期
  • 正在执行的指令是中断返回指令RETI或者是访问专用寄存器IE或IP的指令时,CPU至少要再执行一条指令才能响应中断请求
2. 中断服务
中断服务程序从入口地址开始执行,直到执行返回指令RETI为止。RETI指令表示中断服务程序的结束,CPU执行该指令,一方面清除中断响应时所置位的优先级有效触发器,一方面由栈顶弹出断点地址送程序计数器PC,从而返回主程序。中断服务程序由四个部分组成,即保护现场、中断服务、恢复现场以及中断返回。
由于在主程序中一般都会用到累加器A和程序状态字寄存器PSW,所以在现场保护时一般都需要保护A和PSW,其他寄存器根据使用情况决定是否需要保护。
由于在主程序中一般都会用到累加器A和程序状态字寄存器PSW,所以在现场保护时一般都需要保护A和PSW,其他寄存器根据使用情况决定是否需要保护。在编写中断服务程序时应注意以下两点:
  • 单片机响应中断后,不会自动关闭中断系统。如果用户程序不希望出现中断嵌套,则必须在中断服务程序的开始处关闭中断,从而禁止更高优先级的中断请求中断当前的服务程序。
  • 为了保证保护现场和恢复现场能够连续进行,在保护现场和恢复现场之前应先关中断,当现场保护或现场恢复结束后,再根据实际需要决定是否需要开中断。
3. 中断请求的撤除
当某个中断源的请求被CPU响应后,应将相应的中断请求标志清除,否则CPU会再一次响应该中断源的请求,这将使CPU进入死循环。对于不同的中断源清除中断请求的方法不同。
  • 有些中断请求由硬件自动清除,在处理这些中断时,用户无需关心清除中断请求标志的问题。
  • 有些中断请求不能自动清除,在处理这些中断时,用户需要通过指令清除。
演示C语言
  1. # include "stc8h.h"
  2. void main(void)
  3. {
  4.        
  5.         P2M0=0xff;
  6.         P2M1=0xff;
  7.         P3M1 = 0x50;
  8.         P3M0 = 0X50;
  9.        
  10.         IT0=1;
  11.         EX0=1;
  12.         EA=1;
  13.        
  14.         P20=1;
  15.         while(1);
  16. }
  17. void INT0_ISR(void) interrupt INT0_VECTOR
  18. {
  19.         P20=~P20;
  20. }
复制代码


汇编
  1. $include(stc8h.inc)
  2.         ORG                0000H
  3.         LJMP         MAIN
  4.         ORG         0003H
  5.         LJMP         INT0_ISR
  6.         ORG         0200h
  7. MAIN:               
  8.         MOV         SP,#80H
  9.         MOV                P2M0,#0xff
  10.         MOV                P2M1,#0xff
  11.         MOV                P3M1,#0x50
  12.         MOV                P3M0,#0X50
  13.        
  14.        
  15.         SETB         IT0
  16.         SETB         EX0
  17.         SETB         EA
  18.        
  19.         SETB         P2.1
  20.         SJMP         $
  21.        
  22. INT0_ISR:
  23.         CPL         P2.1
  24.         RETI
  25.         END
复制代码



C语言中断 P20.mp4

1.2 MB, 下载次数: 114

汇编 中断 P21.mp4

891.68 KB, 下载次数: 196

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-12-11 01:03:17

3

主题

21

回帖

142

积分

注册会员

积分
142
发表于 2024-7-11 10:56:41 | 显示全部楼层
第十五节 定时器原理及STC拓展STC8H8K64U单片机的定时/计数器结构定时/计数器的应用
在自动控制系统或者自动检测系统中,经常要用到定时器或者计数器,用于定时完成相关的任务,或者对外部事件进行计数,这可以通过单片机集成的定时/计数器实现。
例如交通领域 家电领域
1. 定时/计数器的作用
(TO、T1、T2、STC8H8K64U单片机内部集成了五个16位的定时1计数器T3和T4),作用如下:
  • 方便地用于定时控制 *
  • 用作分频器和用于事件记录
  • 可编程时钟输出功能,用于给外部器件提供时钟
  • 可用作串口的波特率发生器 *
2. 定时/计数器的一般结构

定时1计数器的核心是一个加1计数器,加1计数器的脉冲有两个来源,一个是外部脉冲源Tx,另一个是系统的时钟振荡器OSC。计数器对两个脉冲源之一进行输入计数,每输入一个脉冲,计数值加1。当计数到计数器为全1时,再输入一个脉冲就使计数值回零,同时从最高位溢出一个脉冲使溢出标志位TFx置1,该位同时作为计数器的溢出中断标志。当脉冲源为定时时钟振荡器OSC(等间隔脉冲序列)时为定时功能。当脉冲源为间隔不等的外部脉冲发生器时,在Tx端有一个1一0的跳变时加1,就是外部事件的计数器,因此为计数功能。
3. 单片机CPU和定时器相关寄存器
STC8H8K64U集成了5个16位的通用定时/计数器T0、T1、T2、T3和T4,分别由两个8位的特殊功能寄存器THn和TLn组成(n=0、1、2、3、4)单片机中的微处理器、定时器相关特殊功能寄存器之间的关系框图。

作为定时器使用时,STC8H8K64U的定时/计数器脉冲源可以选择是否12分频,定时器1计数器T0、T1及T2分别由辅助寄存器AUXR中的TOx12、T1x12和T2x12三个控制位进行设置,定时器/计数器T3、T4由特殊功能寄存器T4T3M中的T3x12和T4x12两个控制位进行设置。
4. 定时/计数器的工作模式T0和T1的工作模式

STC8H8K64U的定时器/计数器T0有4种工作模式:
模式0(16位自动重装载模式)
模式1(16位不可重装载模式)
模式2(8位自动重装模式)
模式3(不可屏蔽中断的16位自动重装载模式)【与模式0相同,不可屏蔽中断,中断优先级最高,高于其他所有中断的优先级,并且不可关闭,可用作操作系统的系统节拍定时器,或者系统监控定时器。】。
定时器/计数器T1除模式3外,其他工作模式与定时器/计数器0相同。T1在模式3时无效,停止计数。
T0和T1工作方式0的原理图
T2的工作模式

定时器T2的工作模式固定为16位自动重装载模式。
T3和T4的原理图与T2类似
T2、T3和T4的工作方式与T0的工作方式0类似
STC8H8K64U的定时/计数器相关寄存器
与定时/计数器相关的特殊功能寄存器有TMOD、TCON、AUXR、INTCLKO、T4T3M。其中,TMOD用于控制定时/计数器的工作方式;TCON用于控制T0、T1的启动和停止,并包含了定时器的状态;AUXR用于设置定时器T0、T1、T2的速度和T2的功能选择和启动/停止控制;T4T3M用于设置T4和T3的功能、速度和启动/停止控制。
1. 定时器工作方式控制寄存器(TMOD)
M1和M0:
C/T:功能选择位。
1:计数器功能(对T0或T1端的负跳变进行计数)
0:定时器功能。
GATE:门控位。GATE用于选通控制。
GATE=1时,同时INTn为高电平HTRn置位时,启动定时器工作
GATE=0时,每当TRn置位时,就启动定时器工作。
2. 定时器控制寄存器(TCON)
TF1:定时器1溢出中断标志。当定时器1溢出时,由内部硬件置位,当单片机转向中断服务程序时,由内部硬件清除。TR1:定时器1运行控制位。
1:启动定时器1
0:停止定时器1
TF0:定时器0溢出中断标志。当定时器0溢出时由内部硬件置位,当单片机进入中断服务程序时,由内部硬件清除。TR0:定时器0运行控制位。
1:启动定时器0
0:停止定时器0
TCON的0~3位与外部中断有关。
3. 辅助寄存器(AUXR)
AUXR主要用来设置T0和T1的速度、T2的功能以及串口UART的波特率控制等。
TOx12:T0速度控制位。
0:12分频(FOSC/12)
1:不分频(FOSC)
T1x12:T1速度控制位。
0:12分频(FOSC/12)
1:不分频(FOSC)。
如果UART串口用T1作为波特率发生器,T1x12位决定UART串口是12T还是1T。
TR2:定时器2的运行控制位。
0:定时器2停止计数;
1:定时器2开始计数
T2 C/T:控制T2用作定时器或计数器。
0:T2用作定时器
1:T2用作计数器。
T2x12:T2速度控制位。
0:T2每12个时钟计数一次
1:T2每1个时钟计数一次。
T2除了作为一般定时器使用外,主要用于串行口的波特率发生器。如果UART用T2作为波特率发生器T2x12位决定UART串日是12T还是1T.
4. 中断与时钟输出控制寄存器(INTCLKO)
T2CLKO:定时器2时钟输出控制。
0:关闭T2时钟输出
1:使能T2时钟输出功能。当T2计数发生溢出时,P1.3口的电平自动发生翻转
T1CLKO:定时器1时钟输出控制。
0:关闭T1时钟输出
1:使能T1时钟输出功能。当T1计数发生溢出时,P3.4口的电平自动发生翻转
TOCLKO:定时器0时钟输出控制。
0:关闭T0时钟输出
1:使能TO时钟输出功能。当T0计数发生溢出时,P3.5口的电平自动发生翻转1
5.T4/T3控制寄存器:(T4T3M)
T4R:T4的运行控制位。
0:T4停止计数
1:允许T4计数
T4 C/T:控制T4用作定时器或计数器。
0:T4用作定时器
1:T4用作计数器
T4x12:定时器4速度控制位。
0:12分频(FOSC/12)
1:不分频(FOSC)
T4CLKO:T4时钟输出控制
0:关闭T4时钟输出
1:使能T4时钟输出功能(由P0.7输出)
T3R:T3的运行控制位。
0:T3停止计数
1:允许T3计数
T3 C/T:控制T3用作定时器或计数器。
0:T3用作定时器
1:T3用作计数器
T3x12:定时器3速度控制位。
0:12分频(FOSC/12)
1:不分频(FOSC)
T3CLKO:T3时钟输出控制。
0:关闭T3时钟输出:
1:使能T3时钟输出功能(由P0.5输出)。
除了上述特殊功能寄存器外,还有各个定时器的重装载寄存器,这些寄存器复位值均为00H,包括:
  • TO重装值寄存器高字节TH0(地址为8CH)、TO重装值寄存器低字节TLO(地址为8AH)
  • T1重装值寄存器高字节TH1(地址为8DH)、T1重装值寄存器低字节TL1(地址为8BH)
  • T2重装值寄存器高字节TH2(地址为D6H)、T2重装值寄存器低字节TL2(地址为D7H)
  • T3重装值寄存器高字节TH3(地址为D4H)、T3重装值寄存器低字节TL3(地址为D5H)
  • T4重装值寄存器高字节TH4(地址为D2H)、T4重装值寄存器低字节TL4(地址为D3H)
定时器T2~T4还另外设置了时钟预分频器,分别为:TM2PS(地址为FEA2H)、TM3PS(地址为FEA3H)和TM4PS(地址为FEA4H)

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-12-11 01:03:17

3

主题

21

回帖

142

积分

注册会员

积分
142
发表于 2024-7-12 23:50:28 | 显示全部楼层
第十六节 定时器应用及STC拓展STC8H8K64U的定时/计数器应用举例1.定时/计数器量程的扩展定时器的最大定时能力
当工作于定时状态时,定时/计数器的计数脉冲是对系统振荡器时钟OSC或者OSCI12。若晶振频率为11.0592MHz,12分频,则
1个计数周期=12品振频率=1211059200s≈1μs1个计数周期=品振频率12​=1105920012​s≈1μs

定时时间为:T。-XTP。其中,T,为计数周期,T为定时时间则应装入计数/定时器的初值为
N=M=TcTpN=M=TpTc​

注:M =2",n为定时器的位数,T为计数周期,T为定时时间
对于具有预分频功能的定时器T2~T4,当工作于定时状态时,定时/计数器的计数脉冲是对系统振荡器时钟OSC或者OSC/12。若晶振频率为11.0592MHz,12分频,则定时器的最大定时能力为:
T=(224−0)x12000000/11059200us≈18204444us≈18204ms≈18sT=(224−0)x12000000/11059200us≈18204444us≈18204ms≈18s

定时器定时量程的扩展
定时器定时量程的扩展可分为软件扩展和硬件扩展两种方法。
  • 软件扩展方法
    软件扩展方法是在定时器中断服务程序中对定时器中断请求进行计数,当中断请求的次数达到要求的值时才进行相应的处理。例如,某事件的处理周期为1s,由于受到最大定时时间的限制,无法一次完成定时,此时可以将定时器的定时时间设为以10ms为一个单位,启动定时器后的每一次定时器溢出中断产生10ms的定时,进入中断服务程序后,对定时器的中断次数进行统计,每100次定时器溢出中断进行一次事件的处理然后再以同样的方式进入下一个周期的事件处理。
  • 硬件扩展方法
    硬件扩展方法可以使用外接通用定时器芯片对单片机的定时能力进行扩展,如使用定时/计数器芯片8253也可以利用单片机两个定时器串联起来实现对定时能力进行扩展。具体方法,请读者自行思考采用硬件扩展方法时,占用较多的硬件或者CPU资源,因此,在工程应用中通常采用软件扩展的方法。
定时/计数器应用举例
定时/计数器是一种可编程器部件,在开始工作之前,CPU必须将一些命令(称为控制字)写入定时/计数器。将控制字写入定时/计数器的过程称为定时/计数器初始化。在初始化过程中,要将工作方式控制字写入方式寄存器,赋定时/计数初值,启动或停止定时器。定时/计数器的应用编程主要有两点:一是能正确初始化,包括写入控制字,进行时间常数的计算并装入;二是中断服务程序的编写,即在中断服务程序中编写实现需要定时完成的任务代码。一般情况下,定时/计数器初始化部分的步骤大致如下:
  • 设置工作方式,将控制字写入方式寄存器
  • 把定时/计数初值装入TLn、THn寄存器
  • 置位TRn以启动定时/计数
  • 置位ETn允许定时/计数器中断(如果需要)
  • 置位EA使CPU开放中断。
例:设系统时钟频率为11.0592MHz,利用定时器T0定时,每隔0.5s将P6.0的状态取反。
解:由于所要求的定时时间0.5s超过了定时器的定时能力(16位定时器的最长定时时间约为71.111ms),所以无法采用定时器直接实现0.5s的定时。这时可以将定时器的定时时间设为50ms在中断服务程序中对定时器溢出中断请求进行计数,当计够10次时,将P2.0的状态取反,否则直接返回主程序。
选择定时器T0的工作方式:软件启动、定时方式、16位定时器,方式字为00日。系统时钟频率为11.0592MHz,定时器T0的装入初值为
N=M=TcTp=216−50×10−31200000011059200×10−6N=M=TpTc​=216−1105920012000000​×10−650×10−3​

  1. # include "stc8h.h"
  2. unsigned char t0cnt;
  3. void Timer0_Init(void);
  4. void main(void)
  5. {       
  6.         P2M0=0xff;
  7.         P2M1=0xff;
  8.        
  9.         P23=0;
  10.         Timer0_Init();
  11.         t0cnt = 10;
  12.         ET0=1;
  13.         EA=1;
  14.         while(1);
  15. }
  16. void Timer0_Init(void)                //100微秒@11.0592MHz
  17. {
  18.         AUXR |= 0x80;                        //定时器时钟1T模式
  19.         TMOD &= 0xF0;                        //设置定时器模式
  20.         TL0 = 0xAE;                                //设置定时初始值
  21.         TH0 = 0xFB;                                //设置定时初始值
  22.         TF0 = 0;                                //清除TF0标志
  23.         TR0 = 1;                                //定时器0开始计时
  24. }
  25. void INT0_ISR(void) interrupt INT0_VECTOR
  26. {
  27.         t0cnt--;
  28.         if(t0cnt==0)
  29.         {
  30.                 P23=~P23;
  31.                 t0cnt = 10;
  32.         }
  33. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-12-11 01:03:17

3

主题

21

回帖

142

积分

注册会员

积分
142
发表于 2024-7-13 23:19:15 | 显示全部楼层
第十七节 串行口原理一串行通信的相关概念
基本的数据通信方式有两种:
并行通信 : 数据的各位同时传送
串行通信 : 数据一位一位地顺序传送
串行通信的分类1. 按照通信格式的同步方式分类
按照该分类方法,串行通信可分为异步通信和同步通
异步通信
在异步传送中,每一个字符要用起始位(0)和停止位(1)作为字符开始和结束的标志,它们是以字符位为单位一个个地发送和接收的。
异步通讯的数据帧格式
7个二进制数据位,0000 000 ~ 1111 111
8个二进制数据位,0000 0000 ~ 1111 1111
在异步数据传送中,CPU与外设之间事先必须约定好以下内容:
  • 字符格式
    双方要设定好字符的编码形式、奇偶校验形式、起始位和停止位的规定。
  • 通讯速率
    通信速率通常使用波特率来表示。典型的表示方法:如,9600,n,8,1
同步通讯
同步通信效率高,但线路复杂,适合于近距离通信,
同步传送时需要注意的是:同步通信的收/发双方必须使用相同的同步字符在同步传送中要求用同步时钟来实现发送端和接收端之间的严格同步,而且对同步时钟脉冲信号的相位一致性要求非常严格
2. 按照数据的传送方向分类
  • 单工方式
    只允许数据按一个固定的方向传送。
  • 半双工方式
    数据可以从A发送到B,也可以从B发送到A。但同一时刻只能向一个方向传送。
  • 全双工方式
    数据可同时在两个方向上传送。
  • 多终端通信方式

通用异步接收器/发送器UART1. 串行接口
在串行传送中,数据是一位一位按顺序进行传送的,而计算机内部的数据是并行传送的。因此当计算机向外发送数据时,必须将并行的数据转换为串行的数据再行传送。反之,又必须将串行数据转换为并行数据输入计算机中。上述并→串或串一并的转换既可以用软件实现,也可用硬件实现。但由于用软件实现会使CPU的负担增加,降低了其利用率,故目前往往用硬件完成这种转换。通用的异步接收器1发送器(UART,UniversalAsynchronous Receiver/Transmitter)i就可实现上述“串行-并行转换是串行接口的核心部件。
串行接口通过系统总线和CPU相连
硬件UART的结构

UART是用外部时钟的方法与数据进行同步的。外部的时钟周期Tc和数据中每一位数据所占的时间Td有如下关系:
𝑇𝑐=𝑇𝑑/𝐾Tc=Td/K
其中,K=16或64。若K=16,在每一个时钟脉冲的上升沿采样接收数据线,当发现了第-个“0”(即起始位的开始),以后又连续采样8个“0”,则确定它为起始位(不是干扰信号),然后开始读出接收数据的每个数位值,如下图所示。

由于每个数据位时间Td为外部时钟的16倍,所以每16个外部时钟脉冲读一次数据位。从下图中可以看出,取样时间正好在数据位时间的中间时刻,这就避开了信号在上升或下降时可能产生的不稳定状态,保证了采样数值的正确。




回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 02:06 , Processed in 1.005921 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表