📋 全部记录
2026-10-22 08:46:43
sk-ws-H.PXXMDIL.oDJW.MEUCIBmSlPxQmZKaaE_IaC2yf44rk0aO-BEAJIsAr4WA1VWWAiEAsLEP_A4z2RLGHi8H1IFh5T87EZgDMgbOFilEXWmg5JA
2026-10-12 22:07:38
31213132
2026-10-12 22:06:07
31213132
2026-10-12 22:04:19
31213132
2026-10-12 22:00:59
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
// 1602引脚定义
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
#define LCD_DATA P0
// 按键与电机
sbit K1 = P3^0;
sbit MOTOR = P1^0;
uchar duty = 0;
uint show_rpm = 0;
uint pwm_cnt = 0;
/**************** LCD1602底层驱动 ****************/
void DelayMs(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void LcdWriteCmd(uchar cmd)
{
RS = 0;
RW = 0;
LCD_DATA = cmd;
E = 1;
DelayMs(1);
E = 0;
}
void LcdWriteDat(uchar dat)
{
RS = 1;
RW = 0;
LCD_DATA = dat;
E = 1;
DelayMs(1);
E = 0;
}
void LcdInit(void)
{
LcdWriteCmd(0x38); //16*2,8bit
LcdWriteCmd(0x0C); //开显示,无光标
LcdWriteCmd(0x06); //写入后地址自动+1
LcdWriteCmd(0x01); //清屏
DelayMs(2);
}
// 在指定位置显示字符串
void LcdShowStr(uchar pos, uchar *str)
{
LcdWriteCmd(0x80 + pos);
while(*str)
{
LcdWriteDat(*str++);
}
}
// 在第二行指定位置显示数字(0~999)
void LcdShowNum(uchar pos, uint num)
{
uchar buf[4];
buf[0] = num/100 + '0';
buf[1] = (num%100)/10 + '0';
buf[2] = num%10 + '0';
buf[3] = '\0';
LcdWriteCmd(0x80 + 0x40 + pos); //0x40=第二行起始地址
LcdShowStr(0,buf);
}
/**************** 定时器0 PWM电机调速 ****************/
void Timer0_Init(void)
{
TMOD |= 0x01;
TH0 = 0xF5;
TL0 = 0xF5;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void Timer0_ISR() interrupt 1
{
TH0 = 0xF5;
TL0 = 0xF5;
pwm_cnt++;
if(pwm_cnt >= 100)
pwm_cnt = 0;
if(pwm_cnt < duty * 20)
MOTOR = 0;
else
MOTOR = 1;
}
/**************** 按键扫描 ****************/
void KeyScan(void)
{
uint i;
if(K1 == 0)
{
DelayMs(10); //消抖
if(K1 == 0)
{
duty++;
if(duty >= 5) duty = 0;
switch(duty)
{
case 0: show_rpm = 0; MOTOR = 1; break;
case 1: show_rpm = 200; break;
case 2: show_rpm = 400; break;
case 3: show_rpm = 600; break;
case 4: show_rpm = 800; break;
}
while(K1 == 0); //等待松开
}
}
}
void main(void)
{
Timer0_Init();
LcdInit();
LcdShowStr(0,"Motor Speed:"); //第一行
while(1)
{
KeyScan();
LcdShowNum(0, show_rpm); //第二行刷新转速
DelayMs(100);
}
}
2026-10-12 21:58:23
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
// 1602引脚定义
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
#define LCD_DATA P0
// 按键与电机
sbit K1 = P3^0;
sbit MOTOR = P1^0;
uchar duty = 0;
uint show_rpm = 0;
uint pwm_cnt = 0;
/**************** LCD1602底层驱动 ****************/
void DelayMs(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void LcdWriteCmd(uchar cmd)
{
RS = 0;
RW = 0;
LCD_DATA = cmd;
E = 1;
DelayMs(1);
E = 0;
}
void LcdWriteDat(uchar dat)
{
RS = 1;
RW = 0;
LCD_DATA = dat;
E = 1;
DelayMs(1);
E = 0;
}
void LcdInit(void)
{
LcdWriteCmd(0x38); //16*2,8bit
LcdWriteCmd(0x0C); //开显示,无光标
LcdWriteCmd(0x06); //写入后地址自动+1
LcdWriteCmd(0x01); //清屏
DelayMs(2);
}
// 在指定位置显示字符串
void LcdShowStr(uchar pos, uchar *str)
{
LcdWriteCmd(0x80 + pos);
while(*str)
{
LcdWriteDat(*str++);
}
}
// 在第二行指定位置显示数字(0~999)
void LcdShowNum(uchar pos, uint num)
{
uchar buf[4];
buf[0] = num/100 + '0';
buf[1] = (num%100)/10 + '0';
buf[2] = num%10 + '0';
buf[3] = '\0';
LcdWriteCmd(0x80 + 0x40 + pos); //0x40=第二行起始地址
LcdShowStr(0,buf);
}
/**************** 定时器0 PWM电机调速 ****************/
void Timer0_Init(void)
{
TMOD |= 0x01;
TH0 = 0xF5;
TL0 = 0xF5;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void Timer0_ISR() interrupt 1
{
TH0 = 0xF5;
TL0 = 0xF5;
pwm_cnt++;
if(pwm_cnt >= 100)
pwm_cnt = 0;
if(pwm_cnt < duty * 20)
MOTOR = 0;
else
MOTOR = 1;
}
/**************** 按键扫描 ****************/
void KeyScan(void)
{
uint i;
if(K1 == 0)
{
DelayMs(10); //消抖
if(K1 == 0)
{
duty++;
if(duty >= 5) duty = 0;
switch(duty)
{
case 0: show_rpm = 0; MOTOR = 1; break;
case 1: show_rpm = 200; break;
case 2: show_rpm = 400; break;
case 3: show_rpm = 600; break;
case 4: show_rpm = 800; break;
}
while(K1 == 0); //等待松开
}
}
}
void main(void)
{
Timer0_Init();
LcdInit();
LcdShowStr(0,"Motor Speed:"); //第一行
while(1)
{
KeyScan();
LcdShowNum(0, show_rpm); //第二行刷新转速
DelayMs(100);
}
}
2026-10-12 21:55:01
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
// 1602引脚定义
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
#define LCD_DATA P0
// 按键与电机
sbit K1 = P3^0;
sbit MOTOR = P1^0;
uchar duty = 0;
uint show_rpm = 0;
uint pwm_cnt = 0;
/**************** LCD1602底层驱动 ****************/
void DelayMs(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void LcdWriteCmd(uchar cmd)
{
RS = 0;
RW = 0;
LCD_DATA = cmd;
E = 1;
DelayMs(1);
E = 0;
}
void LcdWriteDat(uchar dat)
{
RS = 1;
RW = 0;
LCD_DATA = dat;
E = 1;
DelayMs(1);
E = 0;
}
void LcdInit(void)
{
LcdWriteCmd(0x38); //16*2,8bit
LcdWriteCmd(0x0C); //开显示,无光标
LcdWriteCmd(0x06); //写入后地址自动+1
LcdWriteCmd(0x01); //清屏
DelayMs(2);
}
// 在指定位置显示字符串
void LcdShowStr(uchar pos, uchar *str)
{
LcdWriteCmd(0x80 + pos);
while(*str)
{
LcdWriteDat(*str++);
}
}
// 在第二行指定位置显示数字(0~999)
void LcdShowNum(uchar pos, uint num)
{
uchar buf[4];
buf[0] = num/100 + '0';
buf[1] = (num%100)/10 + '0';
buf[2] = num%10 + '0';
buf[3] = '\0';
LcdWriteCmd(0x80 + 0x40 + pos); //0x40=第二行起始地址
LcdShowStr(0,buf);
}
/**************** 定时器0 PWM电机调速 ****************/
void Timer0_Init(void)
{
TMOD |= 0x01;
TH0 = 0xF5;
TL0 = 0xF5;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void Timer0_ISR() interrupt 1
{
TH0 = 0xF5;
TL0 = 0xF5;
pwm_cnt++;
if(pwm_cnt >= 100)
pwm_cnt = 0;
if(pwm_cnt < duty * 20)
MOTOR = 0;
else
MOTOR = 1;
}
/**************** 按键扫描 ****************/
void KeyScan(void)
{
uint i;
if(K1 == 0)
{
DelayMs(10); //消抖
if(K1 == 0)
{
duty++;
if(duty >= 5) duty = 0;
switch(duty)
{
case 0: show_rpm = 0; MOTOR = 1; break;
case 1: show_rpm = 200; break;
case 2: show_rpm = 400; break;
case 3: show_rpm = 600; break;
case 4: show_rpm = 800; break;
}
while(K1 == 0); //等待松开
}
}
}
void main(void)
{
Timer0_Init();
LcdInit();
LcdShowStr(0,"Motor Speed:"); //第一行
while(1)
{
KeyScan();
LcdShowNum(0, show_rpm); //第二行刷新转速
DelayMs(100);
}
}
2026-10-12 21:48:52
123
2026-10-12 10:22:46
#include <REGX52.H>
sbit BEEP = P2^5;
void Delay_us(unsigned int t)
{
unsigned int i,j;
for(i=t;i>0;i--)
for(j=11;j>0;j--);
}
void main(void)
{
while(1)
{
BEEP = 0;
Delay_us(227); //2200Hz方波
BEEP = 1;
Delay_us(227);
}
}
2026-10-12 10:21:08
#include <REGX52.H>
sbit BEEP = P2^5;
void Delay(unsigned int ms)
{
unsigned int i,j;
for(i=ms;i>0;i--)
for(j=120;j>0;j--);
}
void main(void)
{
BEEP = 0; //ULN导通,有源蜂鸣器长鸣
while(1)
{
}
}
2026-10-12 10:20:10
#include <REGX52.H>
sbit BEEP = P2^5;
void Delay_us(unsigned int t)
{
unsigned int i,j;
for(i=t;i>0;i--)
for(j=11;j>0;j--);
}
void main(void)
{
while(1)
{
BEEP = 0; //ULN导通
Delay_us(500);
BEEP = 1; //ULN关断
Delay_us(500);
}
}