uchar code fz[]= //正转数据 {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; uchar code zz[]= //反转数据 {0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
时间: 2023-10-06 15:11:24 浏览: 206
这段代码定义了两个数组,分别是正转数据和反转数据。这里用到了C语言中的uchar关键字表示unsigned char类型。具体来说,这两个数组存储的是8个十六进制数,可以用来进行数据转换。其中正转数据表示从低位到高位的顺序,而反转数据则表示从高位到低位的顺序。在实际应用中,可以根据需要选择使用哪种数据。
相关问题
#include "stepper_motor.h" uchar loop; //步进电机转动变量 uchar Flag_static = 2; uchar code fz[]= //正转数据 {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; uchar code zz[]= //反转数据 {0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; void proc() //正反转函数 { if(Flag_static == 1) //关 { P2=(P2&0xf0)|zz[loop]; //将正转数据赋值给P2端口,P2接的是步进电机 loop=(loop+1)%8; //循环加,Loop变化范围是 0 - 7,这样结合上一句话就可循环将转动数据送给P2 } } 对这段程序进行逐条注释
```
#include "stepper_motor.h" //引入头文件
uchar loop; //步进电机转动变量
uchar Flag_static = 2; //控制电机正反转的标志位,初始值为2,即不转动
uchar code fz[]= //正转数据 {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //保存步进电机正转时每一步的数据
uchar code zz[]= //反转数据 {0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //保存步进电机反转时每一步的数据
void proc() //函数名称为proc,用于控制步进电机正反转
{
if(Flag_static == 1) //如果Flag_static等于1,即电机正转
{
P2=(P2&0xf0)|zz[loop]; //将反转数据赋值给P2端口,P2接的是步进电机,保持其他数据不变
loop=(loop+1)%8; //循环加,loop变化范围是0-7,这样结合上一句话就可以循环将转动数据送给P2
}
}
```
这段代码是用来控制步进电机正反转的,主要包含以下几个部分:
1. 引入头文件 "stepper_motor.h"
2. 定义变量 `loop`,用于保存步进电机转动的步数
3. 定义变量 `Flag_static`,用于控制电机正反转的标志位,初始值为2,即不转动
4. 定义常量数组 `fz[]` 和 `zz[]`,用于保存步进电机正转和反转时每一步的数据
5. 定义函数 `proc()`,用于控制步进电机正反转。如果 `Flag_static` 等于1,即电机正转,则将反转数据赋值给 `P2` 端口,保持其他数据不变,通过 `loop` 变量实现循环将转动数据送给 `P2` 端口。
#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int uchar code Table_of_Digits[]= { 0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //0 0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //1 0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //2 0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //3 0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //4 0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5 0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6 0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7 0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8 0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00 //9 }; uchar i=0,t=0,Num_Index; //主程序 void main() { P3=0x80; //P3最高位为0,控制位选 Num_Index=0; //从0开始显示 TMOD=0x00; //T0方式0 TH0=(8192-2000)/32; //2ms定时 TL0=(8192-2000)%32; IE=0x82; TR0=1; //启动T0 while(1); } //T0中断函数 void LED_Screen_Display() interrupt 1 { TH0=(8192-2000)/32; //恢复初值 TL0=(8192-2000)%32; P0=0xff; //输出位码和段码 P0=~Table_of_Digits[Num_Index*8+i]; //补码 P3=_crol_(P3,1); if(++i==8) i=0; //每屏一个数字由8个字节构成 if(++t==250) //每个数字刷新显示一段时间 { t=0; if(++Num_Index==10) Num_Index=0; //显示下一个数字 } }
下面是对应的汇编语言代码:
```
; 包含头文件
include reg51.inc
include intrins.inc
; 定义宏
#define uchar unsigned char
#define uint unsigned int
; 数码管显示的数字表
Table_of_Digits: db 0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00 ; 0
db 0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00 ; 1
db 0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00 ; 2
db 0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00 ; 3
db 0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00 ; 4
db 0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00 ; 5
db 0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00 ; 6
db 0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00 ; 7
db 0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00 ; 8
db 0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00 ; 9
; 定义变量
i: db 0 ; i 初始值为 0
t: db 0 ; t 初始值为 0
Num_Index: db 0 ; Num_Index 初始值为 0
; 主程序
main:
mov P3, #0x80 ; P3最高位为0,控制位选
mov Num_Index, #0 ; 从0开始显示
mov TMOD, #0x00 ; T0方式0
mov TH0, #(8192-2000)/32 ; 2ms定时
mov TL0, #(8192-2000)%32
mov IE, #0x82 ; 开启中断
setb TR0 ; 启动T0
loop:
jmp loop ; 无限循环
; T0中断函数
LED_Screen_Display:
mov TH0, #(8192-2000)/32 ; 恢复初值
mov TL0, #(8192-2000)%32
mov P0, #0xff ; 输出位码和段码
mov A, Num_Index
mul AB, #8
add A, i
mov DPTR, #Table_of_Digits
add DPTR, A
mov A, @DPTR
cpl A ; 补码
mov P0, A
mov A, P3
rl A
mov P3, A
inc i
cjne i, #8, no_reset_i ; 每屏一个数字由8个字节构成
mov i, #0 ; 重置 i
inc t
cjne t, #250, no_reset_Num_Index ; 每个数字刷新显示一段时间
mov t, #0 ; 重置 t
inc Num_Index
cjne Num_Index, #10, no_reset_Num_Index
mov Num_Index, #0
no_reset_Num_Index:
no_reset_i:
reti
```
阅读全文