零度时空 发表于 2017-7-28 10:30 嗯 不错的 |
我这个是1604显示温度,按键控制步进电机的程序 #include<reg51.h> #include"lcd.h" #include"temp.h" #define uchar unsigned char #define uint unsigned int typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; unsigned char keyval; unsigned char ID; uchar CNCHAR[6] = "摄氏度"; void LcdDisplay(int); void UsartConfiguration(); sbit IN1=P1^0; /*第一个电机*/ sbit IN2=P1^1; /*第一个电机*/ sbit IN3=P1^2; /*第一个电机*/ sbit IN4=P1^3; /*第一个电机*/ sbit IN5=P1^4;//高电位 使能口 sbit IN6=P1^5;//高电位 使能口 uint j=100; uint g; sbit k1=P3^6; //定义P31口是k1 sbit k2=P3^5; //按键 sbit k3=P1^7; //按键 sbit k4=P1^6; //按键 void delay(uint i); // void Go(); // void zhong(); // void fan(); // void Go( ) //一档 { IN1=1;IN2=0;IN3=0;IN4=0; delay(150); IN1=1;IN2=1;IN3=0;IN4=0; delay(150); IN1=0;IN2=1;IN3=0;IN4=0; delay(150); IN1=0;IN2=1;IN3=1;IN4=0; delay(150); IN1=0;IN2=0;IN3=1;IN4=0; delay(150); IN1=0;IN2=0;IN3=1;IN4=1; delay(150); IN1=0;IN2=0;IN3=0;IN4=1; delay(150); IN1=1;IN2=0;IN3=0;IN4=1; delay(150); } void zhong(void) //二档 { IN1=1;IN2=0;IN3=0;IN4=0; delay(300); IN1=1;IN2=1;IN3=0;IN4=0; delay(300); IN1=0;IN2=1;IN3=0;IN4=0; delay(300); IN1=0;IN2=1;IN3=1;IN4=0; delay(300); IN1=0;IN2=0;IN3=1;IN4=0; delay(300); IN1=0;IN2=0;IN3=1;IN4=1; delay(300); IN1=0;IN2=0;IN3=0;IN4=1; delay(300); IN1=1;IN2=0;IN3=0;IN4=1; delay(300); } void fan( ) //反转 { IN1=1;IN2=0;IN3=0;IN4=1; delay(150); IN1=0;IN2=0;IN3=0;IN4=1; delay(150); IN1=0;IN2=0;IN3=1;IN4=1; delay(150); IN1=0;IN2=0;IN3=1;IN4=0; delay(150); IN1=0;IN2=1;IN3=1;IN4=0; delay(150); IN1=0;IN2=1;IN3=0;IN4=0; delay(150); IN1=1;IN2=1;IN3=0;IN4=0; delay(150); IN1=1;IN2=0;IN3=0;IN4=0; delay(150); } void LcdDisplay(int temp) //lcd显示 { unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组 float tp; if(temp< 0) //当温度值为负数 { LcdWriteCom(0x80); //写地址 80表示初始地址 SBUF='-';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 LcdWriteData('-'); //显示负 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算由?.5,还是在小数点后面。 } else { LcdWriteCom(0x80); //写地址 80表示初始地址 LcdWriteData('+'); //显示正 SBUF='+';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } datas[0] = temp / 10000; datas[1] = temp % 10000 / 1000; datas[2] = temp % 1000 / 100; datas[3] = temp % 100 / 10; datas[4] = temp % 10; LcdWriteCom(0x82); //写地址 80表示初始地址 LcdWriteData('0'+datas[0]); //百位 SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x83); //写地址 80表示初始地址 LcdWriteData('0'+datas[1]); //十位 SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x84); //写地址 80表示初始地址 LcdWriteData('0'+datas[2]); //个位 SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x85); //写地址 80表示初始地址 LcdWriteData('.'); //显示 ‘.’ SBUF = '.';//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x86); //写地址 80表示初始地址 LcdWriteData('0'+datas[3]); //显示小数点 SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x87); //写地址 80表示初始地址 LcdWriteData('0'+datas[4]); //显示小数点 SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; for(i=0; i<6; i++) { SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; } } /******************************************************************************* * 函 数 名 :UsartConfiguration() * 函数功能 :设置串口 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void UsartConfiguration() { SCON=0X50; //设置为工作方式1 TMOD=0X20; //设置计数器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //计数器初始值设置,注意波特率是4800的 TL1=0XF3; // ES=1; //打开接收中断 // EA=1; //打开总中断 TR1=1; //打开计数器 } void wendu() { // UsartConfiguration(); LcdInit(); //初始化LCD1602 LcdWriteCom(0x88); //写地址 80表示初始地址 LcdWriteData('C'); // while(1) // { LcdDisplay(Ds18b20ReadTemp()); // Delay1ms(100);//1s钟刷一次 // } } /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *******************************************************************************/ void delay(u16 i) { while(i--); } /******************************************************************************* * 函 数 名 : keypros * 函数功能 : 按键处理函数,判断按键K1是否按下 *******************************************************************************/ void Time0_serve(void)interrupt 1 using 1 { TH0=(65536-200)/256; TL0=(65536-200)%256; if(k1==0) keyval=1; if(k2==0) keyval=2; if(k3==0) keyval=3; if(k4==0) keyval=4; } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { IN5=1; IN6=1; // // if(k1==0){g=1;} // if(k2==0){g=2;} // if(k3==0){g=3;} // if(k4==0){g=4;} // if(g==1){zhong();} // if(g==2){Go();} // if(g==3){fan();} // if(g==4){wendu();} //} IN5=1; IN6=1; while(1) { // TMOD=0x01; // EA=1; // ET0=1; // TR0=1; // TH0=(65536-200)/256; // TL0=(65536-200)%256; // keyval=0; // ID=0; keyval = 0; while(1) { if(k1==0) keyval=1; if(k2==0) keyval=2; if(k3==0) keyval=3; if(k4==0) keyval=4; switch(keyval) { case 1 :zhong(); break; case 2 :Go(); break; case 3 :fan(); break; case 4 :wendu(); break; } } } } |