1:解决keil5软件的乱码问题,修改编码为UTF-8
2:打开keil5使用debug对编写好的程序进行调试
使用stc-isp获取延时函数
将延时函数添加进入创建好的keil5软件,编译烧录进入51单片机板子实现led灯闪烁延迟
单片机工作的基本时序**
单片机的工作时序可以分为以下几个阶段:
需要注意的是,不同的单片机在时序和工作模式上可能会有差异,具体的时序要根据单片机型号和数据手册中的描述来确定。此外,单片机的工作时序还受到外部电路和外部信号的影响,例如外部晶振的稳定性和频率、外部输入/输出的响应时间等。
机器周期和指令周期
1:震荡周期,也称之为时钟周期,指的是为单片机提供时钟脉冲信号的震荡源的周期,TX实验板上为11.0592MHZ。
震荡周期是指单片机系统中的时钟震荡周期,通常用来衡量单片机内部操作的速度和时序。
在单片机系统中,通常会使用一个晶体振荡器或者其他时钟源来提供稳定的时钟信号。这个时钟信号会周期性地产生脉冲,驱动单片机内部的操作和数据传输。
震荡周期取决于时钟源的频率以及单片机的内部时钟分频设置。一般情况下,单片机的工作频率会在数MHz到数十MHz之间,对应的震荡周期则在几十纳秒到几微秒之间。
具体的震荡周期可以根据单片机的型号和时钟设置来计算或查阅相关的技术资料。一般来说,单片机的技术手册或者数据手册会提供时钟频率、时钟分频系数、指令周期等信息,通过这些参数可以计算出具体的震荡周期。
2:状态周期,每个状态周期为时钟周期的2倍,是震荡周期经过二分频后得到的。
状态周期是指在一个周期中,系统或者设备经历的不同状态的数量或者变化次数。
在系统或设备工作过程中,会存在多个状态,比如开关状态、运行状态、等待状态等。状态周期指的是系统从一个状态切换到下一个状态所经历的时间或者次数。
状态周期的长度取决于系统或设备的工作方式和设计。例如,在一个开关设备中,状态周期可能是开-关-开-关这样的循环,每个循环的长度就是一个状态周期。在一个周期内,设备从开到关再到开的过程中,经历了两个状态。
状态周期的长度对于系统的性能和正常运行非常重要。较短的状态周期意味着系统可以更快地响应变化,提高效率。而较长的状态周期可能导致系统响应慢,性能下降。
3:机器周期,一个机器周期包含6个状态周期S1-S6,也就是12个时钟周期,在一个机器周期内,CPU可以完后才能一个独立操作。
机器周期是计算机中一个基本的时间周期,它包括了一条指令的执行所需的所有步骤。每个机器周期的长度是固定的,由计算机的时钟频率决定。
机器周期通常包括以下几个步骤:
这些步骤可能会因为不同的指令而有所差异,但通常每个机器周期都是由这些基本步骤组成的。在一个机器周期内,一条指令完成从取指到写回的整个过程。
机器周期的长度对计算机性能和指令执行速度有影响。较短的机器周期意味着计算机可以更快地执行指令,提高处理速度和效率。计算机的时钟频率越高,机器周期越短,计算机的性能越好。
然而,需要注意的是,不同的指令可能会需要不同的机器周期数才能完成执行。一些复杂的指令可能需要多个机器周期,而简单的指令可能只需要一个机器周期。因此,在实际应用中,需要综合考虑指令的类型和需求,确定合适的机器周期长度。
4:指令周期,它是指CPU完成一条操作后所需要的全部时间,每条指令执行时间都是有一个或几个机器周期组成,MCS-51系统中,有单周期指令,双周期指令和四周期指令。
指令周期是计算机执行一条指令所需的时间周期,它包括了取指、译码、执行、存储和写回等各个阶段。每个指令周期的长度取决于计算机的时钟频率和指令的复杂程度。
指令周期的长度可以通过以下公式计算:
指令周期 = 1 / 时钟频率
其中,时钟频率是计算机时钟的周期,表示单位时间内时钟信号的频率。
指令周期的长度决定了计算机每秒钟能够执行的指令数量。较短的指令周期意味着计算机可以更快地执行指令,提高处理速度和效率。但是,指令周期过短可能导致指令无法完全执行完成,造成错误或不完整的结果。
在实际应用中,为了提高计算机的性能,通常会采用流水线技术来同时执行多条指令。流水线技术将指令的执行过程分割成多个阶段,并在每个阶段中同时执行不同指令的相应操作。这样可以在同一个指令周期内执行多条指令,提高计算机的运算速度。但是,流水线技术也会引入一定的延迟和冲突问题,需要进行合理的设计和优化。
需要注意的是,指令周期和机器周期不完全一样。机器周期是执行一条指令所需的所有步骤,包括取指、译码、执行、存储和写回等。而指令周期仅指执行指令的时间周期,不包括其他步骤。
宏定义: #define uint unsigned int
#define uchar unsigned char
子函数调用程序
#include
#include
// c语言中的宏定义,表示编写uint时相当于编写了unsigned int
#define uint unsigned int
#define uchar unsigned char
// 使用位定义的方式控制发光led管,控制第一个发光二级管
sbit L = P1^0;
// 函数的声明,主函数在调用子函数时需要进行函数的声明
// 编写一个子程序,没有参数没有返回值
void delay(){
// 定义变量
uint x,y;
//使用for循环让x的值自减
for(x = 200; x > 0; x--){
// 嵌套调用
for(y = 2000; y > 0; y--){
}
}
}
/*
含参数子程序设计
*/
void delay02(uint z){
uint x,y;
for(x = 100; x > 0; x --){
for(y = z ; y > 0; y --){
}
}
}
void main(){
while(1){
// 点亮led
L = 0;
//调用子函数 delay02(500)
delay();
// 熄灭led
L = 1;
//调用子函数 delay02(500)
delay();
}
}
#include
#include
// c语言中的宏定义,表示编写uint时相当于编写了unsigned int
#define uint unsigned int
#define uchar unsigned char
// 使用位定义的方式控制发光led管,控制第一个发光二级管
sbit L = P1^0;
// 函数的声明,主函数在调用子函数时需要进行函数的声明
// 编写一个子程序不含参数,没有参数没有返回值
/*
void delay(){
// 定义变量
uint x,y;
//使用for循环让x的值自减
for(x = 200; x > 0; x--){
// 嵌套调用
for(y = 2000; y > 0; y--){
}
}
}
*/
/*
含参数子程序设计
*/
void delay(uint z){
uint x,y;
for(x = z; x > 0; x --){
for(y = 120 ; y > 0; y --){
}
}
}
void main(){
while(1){
// 点亮led
L = 0;
//调用子函数 ,将参数传递进去
delay(100);
// 熄灭led
L = 1;
//调用子函数,将参数传递进去
delay(100);
}
}
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit Led = P1^0;
uchar temp; // 8位
void delay(){
// 定义变量
uint x,y;
//使用for循环让x的值自减
for(x = 200; x > 0; x--){
// 嵌套调用
for(y = 2000; y > 0; y--){
}
}
}
void main(){
/*
位移函数 1010 0101 --- > 向左边移动三位往左边补0
0010 1101
使用循环左移实现流水灯程序
*/
temp = 0xfe;
P1 = temp;
while(1){
//调用库函数循环左移一位
temp = _crol_(temp,1);
// 延时程序
delay();
P1 = temp;
}
}
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit Led = P1^0;
sbit beep = P2^3;
uchar temp; // 8位
void delay(){
// 定义变量
uint x,y;
//使用for循环让x的值自减
for(x = 200; x > 0; x--){
// 嵌套调用
for(y = 2000; y > 0; y--){
}
}
}
void main(){
/*
位移函数 1010 0101 --- > 向左边移动三位往左边补0
0010 1101
使用循环左移实现流水灯程序
*/
temp = 0xfe;
P1 = temp;
//控制风鸣器响
beep = 0;
while(1){
//调用库函数循环左移一位
temp = _crol_(temp,1);
// 延时程序
delay();
P1 = temp;
}
}