|
1金钱
本帖最后由 WWWQIUJIUWA 于 2024-1-9 10:43 编辑
拜托拜托,拜托大佬们看看问题,我做的控制直流电机转速,lcd应该显示转速,这里lcd有亮但是没有显示,没有用上数码管,数码管却变化,是什么问题
仿真是都可以的 用的普中A2 电机有转动,蜂鸣器没响,按钮控制也正常
#define uint unsigned int
#define uchar unsigned char
#define out P0
sbit P1_0=P1^0;
sbit Rs = P2^6; // 位变量 寄存器选择(1-数据,0-命令/状态寄存器)
sbit Rw = P2^5; // 读写操作选择(1-读,0-写)
sbit En = P2^7; // 使能信号
sbit K1 = P3^0; //按钮
sbit K2 = P3^1;
sbit K3 = P3^2;
sbit K4 = P3^3;
sbit BULL = P1^5; //蜂鸣器
uchar time;
uint temp,humi;
enum {TEMP,HUMI};
typedef union //定义共用同类型
{
unsigned int i;
float f;
}value;
void DelayMs(uint t);
void lcd_init();
void lcdwrite(uchar com);
void lcdwritedata(uchar dat);
void str(uchar *str);
void lcdxy(uchar line,uchar column);
void lcdprintnum(uchar num);
void lcd_showinit(void);
//1ms延时函数
void DelayMs(uint t)
{
int x,y;
for(x=0;x<t;x++)
for(y=0;y<112;y++);
}
// LCD初始化函数
void lcd_init()
{
lcdwrite(0x38); // 写入命令六 0x38:8位两行显示,5×7点阵字符 00111000
lcdwrite(0x0c); // 写入命令四 0x0C:开整体显示,光标关,无黑块 00001100
lcdwrite(0x06); //写入命令三 0x06:光标右移 00000110
lcdwrite(0x01); //写入命令一 0x01:清屏 00000001
DelayMs(1);
}
// 写命令函数,cmd就是要写入的命令
void lcdwrite(uchar com)
{
Rs= 0; //命令寄存器
Rw= 0; // RS,E同时为零,才可写入命令
En= 0;
P0=com; //将命令com写入P0口
_nop_(); //空操作一个机器周期,等待硬件反应
En = 1; //写命令是需E为正脉冲,即正跳变 ,所以前面置E=0
DelayMs(1); //延时等待硬件反应
En = 0; //变低电平,LCD执行命令
}
// 写数据函数,dat就是要写入的命令
void lcdwritedata(uchar dat)
{
En = 0; // 写数据需E为正脉冲,先置E=0
Rs = 1; // 数据寄存器
Rw = 0; // RS=1,RW=0可写数据
P0=dat; //将数据dat从P0口输出,即写入LCD
_nop_();
En = 1;
DelayMs(1);
En = 0;
}
// lcd光标定位函数
void lcdxy(uchar line,uchar column)
{
if(line==1) // 第一行
lcdwrite(0x80+column-1);
if(line==2) // 第二行
lcdwrite(0xC0+column-1);
}
// 输出字符串函数
void str(uchar *str)
{
while(*str!='\0')
lcdwritedata(*str++);
}
// lcd输出数字
void lcdprintnum(uchar num)
{
lcdwritedata(num/10+0x30); // 十位
lcdwritedata(num%10+0x30); // 个位
}
// lcd显示初始化
void lcd_showinit(void)
{
lcdxy(2,1);
str("PWM:");
}
//主函数
void main(void)
{
uchar i;
uchar j;
uchar k;
lcd_init(); // 液晶功能初始化
lcd_showinit(); // 液晶显示内容初始化
P1_0=0;
TMOD=0x01; // TO方式1
TH0=(65536-250)/256;
TL0=(65536-250)%256;
ET0=1; // T0中断允许
EA=1; //总中断开启
TR0=1; //T0中断打开
time=0; //
temp=50; //
i=0;
j=0;
k=0;
while(1)
{
if(K1==0) //加速
{
temp=temp+1;
while(!K1);
}
if(K2==0) //减速
{
temp=temp-1;
while(!K2);
}
if(K3==0)
{
BULL=0;
while(!K3);
BULL=1;
DelayMs(2000);
temp=0;
}
if(K4==0) //关闭,启动
{
i++;
if(i%2==1)
{
BULL=0;
temp=0;
while(!K4);
BULL=1;
}
else
{
BULL=0;
temp=50;
while(!K4);
BULL=1;
}
}
lcdxy(2,5);
lcdwritedata(temp/10+'0');
lcdwritedata(temp%10+'0');
}
}
void T0_int(void) interrupt 1 using 1
{
time++;
if(time>=100) //PWM占空比值超过100,变0
{
time=0;
}
if(time<=temp)
{
P1_0=1;
}
else P1_0=0;
TH0=(65536-250)/256; //重新赋值
TL0=(65536-250)%256;
TR0=1; //手动启动T0
}
我知道答案
本帖寻求最佳答案回答被采纳后将获得系统奖励 10 金钱 , 目前已有 1人回答
|
|