#include<reg51.h>
unsigned char code table[]="speed:"; //想要显示的字符
unsigned char code table_error[]="error!";
unsigned char code table_none[]="none";
unsigned char code table_unit[]="rps";
unsigned char code table_set[]="set";
unsigned char code table_high_tem[]="high_tem!";
unsigned int speed; //数据
unsigned int setspeed=96;
unsigned int control=0;
unsigned int count=0; //计数
unsigned char ms=0; //定时
unsigned int o_f=0; //开关
float pwm1=25.0;
float pwm2=75.0;
sbit IN0=P2^3; //电机控制
sbit IN1=P2^4; //电机控制
sbit E=P2^5; //电机控制
sbit RS=P2^0; //寄存器选择引脚
sbit RW=P2^1; //读写引脚
sbit EN=P2^2; //片选引脚
sbit tem=P1^1; //过温断路
sbit key1 = P1^5; //加速按钮
sbit key2 = P1^6; //减速按钮
sbit key3 = P1^7; //程序开关
//sbit p=P2^7; //测试口
sbit P2_6=P2^6;
void delay(unsigned int x){ //延时函数
unsigned int i;
for(i=x;i>0;i--);
}
void write_com(unsigned char com){ //写指令函数
P0 = com; //送出指令
RS=0;RW=0;EN=1; //写指令时序
delay(10);
EN=0;
}
void write_dat(unsigned char dat){ //写数据函数
P0 = dat; //送出数据
RS=1;RW=0;EN=1; //写数据时序
delay(10);
EN=0;
}
void init(){ //初始化
//write_com(0x01); //清屏
write_com(0x38); //设置16*2显示,5*7点阵
//write_com(0x0f); //开显示,显示光标且闪烁
write_com(0x0c); //开显示,光标不显示
write_com(0x06); //地址加1,写入数据时光标右移一位
}
void interrupt_int() { //转速测量-开计数器
TMOD=0x21; //启动T0,定时方式一
TH0=0x3C; //装载计数初值
TL0=0xb0;
TH1=0xe7;
TL1=0xe7;
ET0=1; //开T0中断
TR0=1; //启动T0
ET1=1;
TR1=1;
EX0=1; //开INT0
IT0=1; //设置INT0为边沿触发
EA=1; //开总中断
}
void int0() interrupt 0{
count++;
}
void key(){ //按钮控制
if (key1 == 0){
delay(10); //消抖
if (key1 == 0){
if (setspeed < 9999)
setspeed++;
while (key1 == 0);
}
}
if (key2 == 0){
delay(10);
if (key2 == 0){
if (setspeed>0)
setspeed--;
while (key2 == 0);
}
}
}
void t0() interrupt 1{
TH0=0x3C;
TL0=0xb0;
ms++; //定时变量,每50ms加一
key();
if(ms>=20){ //1S定时
ms=0; //清除计时
speed=count/2; //每秒转动的圈数
count=0; //重新计数
}
}
void t1() interrupt 3{
control++;
if(control==5){
P2_6=!P2_6;
control=0;
}
}
void high_tem(){
unsigned char i;
write_com(0x01);
for(i=0;i<9;i++){
write_dat(table_high_tem[i]);
}
while(tem==0)
write_com(0x02);
}
void print(){
unsigned char i;
init();
write_com(0x80); //起点为第一行第一列
for(i=0;i<6;i++){ //写入第一行,speed:
write_dat(table[i]);
}
for(i=0;i<3;i++){
write_dat(' ');
}
if(speed>9999) //超过4位数时输出“error”
for(i=0;i<6;i++){
write_dat(table_error[i]);
}
else{
if(speed>999) //数据部分speed
write_dat(0x30+speed/1000%10); //输入千位
else
write_dat(' ');
if(speed>99)
write_dat(0x30+speed/100%10); //输入百位
else
write_dat(' ');
if(speed>9)
write_dat(0x30+speed/10%10); //输入十位
else
write_dat(' ');
if(speed>0)write_dat(0x30+speed%10); //输入个位
if(speed==0) //静止时输出“none”
for(i=0;i<4;i++){
write_dat(table_none[i]);
}
}
for(i=0;i<3;i++){ //输入单位
write_dat(table_unit[i]);
}
write_com(0xc0); //起点为第二行第一列
for(i=0;i<3;i++){
write_dat(table_set[i]);
}
for(i=0;i<6;i++){
write_dat(table[i]);
}
if(setspeed>9999) //超过4位数时输出“error”
for(i=0;i<6;i++){
write_dat(table_error[i]);
}
else{
if(setspeed>999) //数据部分setspeed
write_dat(0x30+setspeed/1000%10); //输入千位
else
write_dat(' ');
if(setspeed>99)
write_dat(0x30+setspeed/100%10); //输入百位
else
write_dat(' ');
if(setspeed>9)
write_dat(0x30+setspeed/10%10); //输入十位
else
write_dat(' ');
write_dat(0x30+setspeed%10); //输入个位
}
for(i=0;i<3;i++){ //输入单位
write_dat(table_unit[i]);
}
}
void delay_deal(unsigned int n){ //转速控制延时
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++){
}
}
}
void deal(){ //转速控制
pwm1=setspeed*100/192; //周期内高电平持续的时间
pwm2=100-pwm1; //周期内低电平持续的时间
IN0=0;
IN1=1;
delay_deal(pwm1);
IN1=0;
delay_deal(pwm2);
E=1;
}
void key_o(){ //开关控制
if (key3 == 0){
delay(20);
if(key3==0){
write_com(0x01);
}
while(key3==0);
}
}
void main(){
interrupt_int();
tem=1;
if(key3==0) key_o(); //关机按钮
while(tem==0)high_tem(); //过温断路
while(tem==1&&key3==1){
print(); //显示函数
//转速控制函数
}
while(1){
deal();
}
}
pwm运算前加两个过渡变量,把setspeed和speed转换成float型,再用这两个float型数据去计算pwm1,pwm2试试
51 单片机,RAM有限,确认RAM下是否够用?
之前是可以正常运行的吗?