![]() |
零度時空 發表于 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; } } } } |