void DisplayScan() { static uchar i; { { P0 = 0xff; //ÏûÒþ smg_we_switch(i); //λѡ P0 = ChangeFor(dis_smg[i]); //¶ÎÑ¡ delay_1ms(3); } i++; if(i>=4) i=0; } }优化这段代码、LED与单片机连接的工作原理、按键与单片机连接的工作原理,的
时间: 2023-06-17 14:06:50 浏览: 76
1. 优化DisplayScan()函数:
void DisplayScan() {
static uchar i = 0;
P0 = 0xff; //先将P0置为高电平
smg_we_switch(i); //选择第i个数码管
P0 = ChangeFor(dis_smg[i]); //端口P0输出第i个数码管应显示的数值
delay_1ms(3); //延时3ms,使数码管显示稳定
i++; //更新i值
if (i >= 4) i = 0; //i值在0-3之间循环
}
2. LED与单片机连接的工作原理:
LED与单片机连接一般采用LED的正极连接单片机的IO口,LED的负极连接单片机的GND。单片机输出高电平时,LED灯亮;单片机输出低电平时,LED灯灭。
3. 按键与单片机连接的工作原理:
按键与单片机连接一般采用一个引脚连接按键的一端,另一个引脚连接单片机的IO口,按键的另一端连接单片机的GND。当按键没按下时,IO口为高电平;当按下按键时,IO口变为低电平。
相关问题
对下面代码进行注释秒信号从0-9的程序如下,请将语句后面带“//”加上文字注释说明并试运行 #include <reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit DU = P2^6;//数码管段选 sbit WE = P2^7;//数码管位选 uchar mSec, Sec;//毫秒和秒储存变量 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};// void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); // } void xianshi(uchar i) { P0 = 0XFF;// WE = 1;// P0 = 0XFE; // WE = 0;// DU = 1;// P0 = tabel[Sec];// DU = 0; // delay(5);} void timer0Init() // { EA=1; // ET0=1; // TR0 = 1; // TMOD = 0X01; // TH0 = 0x3C; TL0 = 0xB0; // } void timer0( ) interrupt 1 // { TH0 = 0x3C; TL0 = 0xB0; // mSec++; // if(mSec == 20) { mSec = 0; Sec++;// } } void main()// { timer0Init();// while(1) { xianshi(Sec); // if(Sec>9) Sec=0;// }
注释如下:
```
#include <reg52.h> // 引入单片机头文件
#include <intrins.h>
#define uint unsigned int // 定义无符号整型变量
#define uchar unsigned char // 定义无符号字符型变量
sbit DU = P2^6; // 数码管段选引脚
sbit WE = P2^7; // 数码管位选引脚
uchar mSec, Sec; // 毫秒和秒的储存变量
uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
// 数码管显示0-9的编码
void delay(uint z) {
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--); // 延时函数,用于控制数码管显示时间
}
void xianshi(uchar i) {
P0 = 0XFF; // 数码管清零
WE = 1; // 数码管位选引脚置高
P0 = 0XFE;
WE = 0; // 数码管位选引脚置低
DU = 1; // 数码管段选引脚置高
P0 = tabel[Sec]; // 显示当前秒数
DU = 0; // 数码管段选引脚置低
delay(5); // 延时5毫秒
}
void timer0Init() // 初始化定时器0
{
EA = 1; // 开启总中断
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
TMOD = 0X01; // 设置定时器0为模式1
TH0 = 0x3C;
TL0 = 0xB0; // 定时器0初值
}
void timer0() interrupt 1 // 定时器0中断函数
{
TH0 = 0x3C;
TL0 = 0xB0; // 定时器0初值
mSec++; // 每次中断,毫秒数+1
if(mSec == 20) { // 如果毫秒数达到20,即一秒钟
mSec = 0;
Sec++; // 秒数加1
}
}
void main()
{
timer0Init(); // 初始化定时器0
while(1) {
xianshi(Sec); // 数码管显示当前秒数
if(Sec > 9)
Sec = 0; // 如果秒数大于9,则重新从0开始计数
}
}
```
该代码实现了一个0-9秒数的数码管显示程序,通过定时器0中断,每秒钟数码管显示的秒数加1,同时进行延时控制。注意:该代码仅适用于51单片机。
#include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit IN1=P1^0; sbit IN2=P1^1; sbit ENA=P1^2; sbit k0=P2^0;//正转 sbit k1=P2^1;//反转 sbit k2=P2^2;//加速 sbit k3=P2^3;//减速 sbit k4=P2^4;//停止 uchar Counter=0,Compare=0; void delay(uint n) { uint i=0,j=0; for(i=0;i<n;i++) { for(j=0;j<120;j++); } } void Timer0_init()//100us { TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x9C; //设置定时初值 TH0 = 0xFF; //设置定时初值 ET0=1; EA=1; TR0=1; } void main() { ENA=0; IN1=0; IN2=0;//一开始让电机停止 Timer0_init(); Compare=50; while(1) { if(k0==0)//正转 { delay(100); while(!k0); ENA=1; IN1=1; IN2=0; } else if(k1==0)//反转 { delay(100); while(!k1); ENA=1; IN1=0; IN2=1; } else if(k2==0)//加速 { delay(100); while(!k2); Compare=Compare+20; } else if(k3==0)//减速 { delay(100); while(!k3); Compare=Compare-20; } if(k4==0)//停止 { delay(100); while(!k4); ENA=0; TR0=0; IN1=0; IN2=0; } } } void Timer0() interrupt 1 { TL0 = 0x9C; //设置定时初值 TH0 = 0xFF; //设置定时初值 Counter++; Counter%=100; if(Counter<Compare)//如果小于占空比 { IN1=1; } else { IN1=0; } }优化代码
以下是对代码进行优化后的版本:
```
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit ENA = P1^2;
sbit k0 = P2^0; //正转
sbit k1 = P2^1; //反转
sbit k2 = P2^2; //加速
sbit k3 = P2^3; //减速
sbit k4 = P2^4; //停止
uchar Compare = 50; //占空比
bit isRunning = 0; //电机是否正在运行
bit isForward = 1; //电机方向是否为正转
void delay(uint n) {
uint i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < 120; j++);
}
}
void Timer0_init() {
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
ET0 = 1;
EA = 1;
TR0 = 1;
}
void motorStop() {
ENA = 0;
TR0 = 0;
IN1 = 0;
IN2 = 0;
isRunning = 0;
}
void motorStart() {
ENA = 1;
TR0 = 1;
isRunning = 1;
}
void motorForward() {
IN1 = 1;
IN2 = 0;
isForward = 1;
}
void motorBackward() {
IN1 = 0;
IN2 = 1;
isForward = 0;
}
void main() {
ENA = 0;
IN1 = 0;
IN2 = 0;
Timer0_init();
while (1) {
if (k0 == 0) { //正转
delay(100);
while (!k0);
motorStop();
motorForward();
motorStart();
} else if (k1 == 0) { //反转
delay(100);
while (!k1);
motorStop();
motorBackward();
motorStart();
} else if (k2 == 0) { //加速
delay(100);
while (!k2);
Compare += 20;
} else if (k3 == 0) { //减速
delay(100);
while (!k3);
Compare -= 20;
} else if (k4 == 0) { //停止
delay(100);
while (!k4);
motorStop();
}
}
}
void Timer0() interrupt 1 {
TL0 = 0x9C;
TH0 = 0xFF;
if (isRunning) {
if (Counter < Compare) {
IN1 = 1;
} else {
IN1 = 0;
}
Counter++;
Counter %= 100;
}
}
```
此版本代码对程序进行了如下优化:
- 使用 `bit` 类型定义了三个变量,可以减少内存的使用。
- 将电机停止、启动、正转、反转等操作封装为函数,提高代码的可读性和可维护性。
- 删除了无用的 `Counter` 变量初始化,减少了内存的使用。
- 在 `Timer0()` 函数中,只有在电机正在运行时才进行控制,减少了不必要的计算。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)