今天家里洗衣機壞了,花了半天時間,說做就做,改手動定時任意時長洗衣服
,附上效果圖和程序
IMG_20190720_184012.jpg (4.83 MB, 下載次數: 67)
下載附件
2019-7-20 21:25 上傳
接口說明:
IMG_20190720_202627.jpg (3.39 MB, 下載次數: 58)
下載附件
2019-7-20 21:26 上傳
IMG_20190720_154747.jpg (3.34 MB, 下載次數: 60)
下載附件
2019-7-20 21:25 上傳
IMG_20190720_203556.jpg (4.18 MB, 下載次數: 69)
下載附件
2019-7-20 21:26 上傳
IMG_20190720_154242.jpg (5.69 MB, 下載次數: 61)
下載附件
2019-7-20 21:25 上傳
IMG_20190720_111203.jpg (2.88 MB, 下載次數: 70)
下載附件
2019-7-20 21:25 上傳
單片機源程序如下:
- #include <stc15xx.h>
- #include <stdio.h>
- //#include <intrins.h>
- //#include <Ctype.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- /* 按鍵*/
- sbit key1=P2^3;
- sbit key2=P2^4;
- sbit key3=P2^5;
- sbit key4=P2^6;
- /*繼電器*/
- sbit jiALL=P3^0;
- sbit ji1=P3^1;
- sbit ji2=P3^5;
- sbit ji3=P3^3;
- sbit ji4=P3^4;
- /*19264引腳定義*/
- sbit cs1=P1^1;
- sbit reset=P1^0;
- sbit rs=P1^7;
- sbit sclk=P1^6;
- sbit sid=P0^7;
- sbit Rom_SCK=P1^3;
- sbit Rom_OUT=P1^4;
- sbit Rom_IN=P1^5;
- sbit Rom_CS=P1^2;
- int timer;
- int timer_s;
- char startflag=0;
- char bbuf[100];
- uchar code ascii_table_5x8[95][5];
- uchar code ascii_table_8x16[10][16];
- uchar code bmp1[];
- uchar code bmp2[];
- uchar code z[];
- uchar code k[];
- uchar code y[];
- uchar code b[];
- uchar code yi[];
- void display_graphic_192x64(uchar *dp);
- void display_string_5x8(uint page,uint column,uchar reverse,uchar *text);
- void display_GB2312_string(uchar y,uchar x,uchar *text);
- void clear_screen();
- //19264液晶屏配置
- //LCD模塊 寫指令
- void transfer_command(int data1)
- {
- char i;
- cs1=0;
- rs=0;
- for(i=0;i<8;i++)
- {
- sclk=0;
- if(data1&0x80) sid=1;
- else sid=0;
- sclk=1;
- data1=data1<<=1;
- }
- cs1=1;
- }
- //寫數據到LCD模塊
- void transfer_data(int data1)
- {
- char i;
- cs1=0;
- rs=1;
- for(i=0;i<8;i++)
- {
- sclk=0;
- if(data1&0x80) sid=1;
- else sid=0;
- sclk=1;
- data1=data1<<=1;
- }
- cs1=1;
- }
- //延時
- void delay(int i)
- {
- int j,k;
- for(j=0;j<i;j++)
- for(k=0;k<110;k++);
- }
- void delay_ms(int i)
- {
- int j,k;
- for(j=0;j<i;j++)
- for(k=0;k<900;k++);
- }
- //LCD 初始化
- void initial_lcd()
- {
- reset=0; //地點評復位
- delay(100);
- reset=1; //復位完畢
- delay(100);
- transfer_command(0xe2); //軟復位
- delay(500);
- transfer_command(0x2f); //打開內部生壓
- delay(500);
- transfer_command(0x81); //微調對比度
- transfer_command(0x45); //對比度值0x00~0xFF
- transfer_command(0xeb); //1/9 偏壓比(bias)
- transfer_command(0xc4); //?????:???? oxc2
- transfer_command(0xa0); //?????:????
- transfer_command(0xaf); //開顯示
- }
- //19264地址
- void lcd_address(uchar page,uchar column)//行 列
- {
- column=column-1; //????????1 ?,?LCD ??IC ???0 ?????????1.
- page=page-1;
- transfer_command(0xb0+page); //?????????8 ???????64 ????8 ???????????1 ?,?LCD ??IC ???0 ?,???????1
- transfer_command(((column>>4)&0x0f)+0x10); //???????4 ?
- transfer_command(column&0x0f); //???????4 ?
- }
- //19264清屏
- void clear_screen()
- {
- unsigned char i,j;
- for(i=0;i<9;i++)
- {
- lcd_address(1+i,1);
- for(j=0;j<192;j++)
- {
- transfer_data(0x00);
- }
- }
- }
- //19264滿屏顯示圖像
- void display_graphic_192x64(uchar *dp)
- {
- uchar i,j;
- for(i=0;i<9;i++)
- {
- lcd_address(1+i,1);
- for(j=0;j<192;j++)
- {
- transfer_data(*dp);
- dp++;
- }
- }
- }
- //19264顯示32*32的字
- void display_graphic_32x32(uchar page,uchar column,uchar *dp)
- {
- uchar i,j;
- for(j=0;j<4;j++)
- {
- lcd_address(page+j,column);
- for (i=0;i<31;i++)
- {
- transfer_data(*dp); //????LCD,?????8 ???????????1
- dp++;
- }
- }
- }
- //19264顯示16*16字
- void display_graphic_16x16(uchar page,uchar column,uchar *dp)
- {
- uchar i,j;
- for(j=0;j<2;j++)
- {
- lcd_address(page+j,column);
- for (i=0;i<16;i++)
- {
- transfer_data(*dp); //????LCD,?????8 ???????????1
- dp++;
- }
- }
- }
- //19264顯示8*16的字
- void display_graphic_8x16(uchar page,uchar column,uchar *dp)
- {
- uchar i,j;
- for(j=0;j<2;j++)
- {
- lcd_address(page+j,column);
- for (i=0;i<8;i++)
- {
- transfer_data(*dp); //????LCD,?????8 ???????????1
- dp++;
- }
- }
- }
- //顯示8*16的數字數據
- void display_string_8x16_1(uint page,uint column,uchar text)
- {
- uint k,j;
- for(j=0;j<2;j++)
- {
- lcd_address(page+j,column);
- if(text==0){if(j==0){for(k=0;k<8;k++){transfer_data(ascii_table_8x16[0][k]);}}else{for(k=8;k<16;k++){transfer_data(ascii_table_8x16[0][k]);}}}
- if(text==1){if(j==0){for(k=0;k<8;k++){transfer_data(ascii_table_8x16[1][k]);}}else{for(k=8;k<16;k++){transfer_data(ascii_table_8x16[1][k]);}}}
- if(text==2){if(j==0){for(k=0;k<8;k++){transfer_data(ascii_table_8x16[2][k]);}}else{for(k=8;k<16;k++){transfer_data(ascii_table_8x16[2][k]);}}}
- if(text==3){if(j==0){for(k=0;k<8;k++){transfer_data(ascii_table_8x16[3][k]);}}else{for(k=8;k<16;k++){transfer_data(ascii_table_8x16[3][k]);}}}
- if(text==4){if(j==0){for(k=0;k<8;k++){transfer_data(ascii_table_8x16[4][k]);}}else{for(k=8;k<16;k++){transfer_data(ascii_table_8x16[4][k]);}}}
- if(text==5){if(j==0){for(k=0;k<8;k++){transfer_data(ascii_table_8x16[5][k]);}}else{for(k=8;k<16;k++){transfer_data(ascii_table_8x16[5][k]);}}}
- if(text==6){if(j==0){for(k=0;k<8;k++){transfer_data(ascii_table_8x16[6][k]);}}else{for(k=8;k<16;k++){transfer_data(ascii_table_8x16[6][k]);}}}
- if(text==7){if(j==0){for(k=0;k<8;k++){transfer_data(ascii_table_8x16[7][k]);}}else{for(k=8;k<16;k++){transfer_data(ascii_table_8x16[7][k]);}}}
- if(text==8){if(j==0){for(k=0;k<8;k++){transfer_data(ascii_table_8x16[8][k]);}}else{for(k=8;k<16;k++){transfer_data(ascii_table_8x16[8][k]);}}}
- if(text==9){if(j==0){for(k=0;k<8;k++){transfer_data(ascii_table_8x16[9][k]);}}else{for(k=8;k<16;k++){transfer_data(ascii_table_8x16[9][k]);}}}
- }
- }
- //19264顯示5*8的字
- void display_string_5x8(uint page,uint column,uchar reverse,uchar *text)
- {
- uchar i=0,j,k,data1;
- while(text[i]>0x00)
- {
- if((text[i]>=0x20)&&(text[i]<=0x7e))
- {
- j=text[i]-0x20;
- lcd_address(page,column);
- for(k=0;k<5;k++)
- {
- if(reverse==1) data1=~ascii_table_5x8[j][k];
- else data1=ascii_table_5x8[j][k];
- transfer_data(data1);
- }
- if(reverse==1) transfer_data(0xff);
- else transfer_data(0x00);
- i++;
- column+=6;
- }
- else
- i++;
- }
- }
- //顯示動態5*8數據
- void display_string_5x8_1(uint page,uint column,uchar text)
- {
- uint k;
- lcd_address(page,column);
- if(text==0){for(k=0;k<5;k++){transfer_data(ascii_table_5x8[16][k]);}}
- if(text==1){for(k=0;k<5;k++){transfer_data(ascii_table_5x8[17][k]);}}
- if(text==2){for(k=0;k<5;k++){transfer_data(ascii_table_5x8[18][k]);}}
- if(text==3){for(k=0;k<5;k++){transfer_data(ascii_table_5x8[19][k]);}}
- if(text==4){for(k=0;k<5;k++){transfer_data(ascii_table_5x8[20][k]);}}
- if(text==5){for(k=0;k<5;k++){transfer_data(ascii_table_5x8[21][k]);}}
- if(text==6){for(k=0;k<5;k++){transfer_data(ascii_table_5x8[22][k]);}}
- if(text==7){for(k=0;k<5;k++){transfer_data(ascii_table_5x8[23][k]);}}
- if(text==8){for(k=0;k<5;k++){transfer_data(ascii_table_5x8[24][k]);}}
- if(text==9){for(k=0;k<5;k++){transfer_data(ascii_table_5x8[25][k]);}}
- }
- //發送數據到19264rom
- void send_command_to_ROM( uchar datu )
- {
- uchar i;
- for(i=0;i<8;i++ )
- {
- if(datu&0x80)
- Rom_IN = 1;
- else
- Rom_IN = 0;
- datu = datu<<1;
- Rom_SCK=0;
- Rom_SCK=1;
- }
- }
- //從19264rom取出數據
- static uchar get_data_from_ROM( )
- {
- uchar i;
- uchar ret_data=0;
- Rom_SCK=1;
- for(i=0;i<8;i++)
- {
- Rom_OUT=1;
- Rom_SCK=0;
- ret_data=ret_data<<1;
- if( Rom_OUT )
- ret_data=ret_data+1;
- else
- ret_data=ret_data+0;
- Rom_SCK=1;
- }
- return(ret_data);
- }
- //取n字節19264rom
- void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen )
- {
- uchar i;
- Rom_CS = 0;
- cs1=1;
- Rom_SCK=0;
- send_command_to_ROM(0x03);
- send_command_to_ROM(addrHigh);
- send_command_to_ROM(addrMid);
- send_command_to_ROM(addrLow);
- for(i = 0; i < DataLen; i++ )
- *(pBuff+i) =get_data_from_ROM();
- Rom_CS = 1;
- }
- /******************************************************************/
- ulong fontaddr=0;
- void display_GB2312_string(uchar y,uchar x,uchar *text)
- {
- uchar i= 0;
- uchar addrHigh,addrMid,addrLow ;
- uchar fontbuf[32];
- while((text[i]>0x00))
- {
- if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1))
- {
- /*????(GB2312)?????IC ????????????:*/
- /*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/
- /*????8 ???????????,????????*/
- fontaddr = (text[i]- 0xb0)*94;
- fontaddr += (text[i+1]-0xa1)+846;
- fontaddr = (ulong)(fontaddr*32);
- addrHigh = (fontaddr&0xff0000)>>16; /*????8?,?24?*/
- addrMid = (fontaddr&0xff00)>>8; /*????8?,?24?*/
- addrLow = fontaddr&0xff; /*????8?,?24?*/
- get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*?32 ??????,??
- "fontbuf[32]"*/
- display_graphic_16x16(y,x,fontbuf);/*?????LCD?,y ????,x ????,fontbuf[]?
- ??*/
- i+=2;
- x+=16;
- }
- else if((text[i]>=0x20) &&(text[i]<=0x7e))
- {
- unsigned char fontbuf[16];
- fontaddr = (text[i]- 0x20);
- fontaddr = (unsigned long)(fontaddr*16);
- fontaddr = (unsigned long)(fontaddr+0x3b7c0);
- addrHigh = (fontaddr&0xff0000)>>16;
- addrMid = (fontaddr&0xff00)>>8;
- addrLow = fontaddr&0xff;
- get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16 );/*?16 ??????,??
- "fontbuf[32]"*/
- display_graphic_8x16(y,x,fontbuf);/*??8x16?ASCII??LCD?,y ????,x ????,
- fontbuf[]???*/
- i+=1;
- x+=8;
- }
- else
- i++;
- }
- }
- void tim0_isr (void) interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(startflag){
- timer++;
- if(timer>20){
- timer=0;
- timer_s--;
- }
- if(timer_s<=0){
- timer_s=0;
- startflag=0;
- jiALL=ji1=ji2=ji3=ji4=1;
- initial_lcd();//初始化lcd
- clear_screen();
- display_GB2312_string(1,1,"請設置洗滌時間:");
- sprintf(bbuf,"%d分鐘",timer_s/60);
- display_GB2312_string(5,80,bbuf);
- }
- }
- }
- void TIM0init(void)//定時器0初始化
- {
- TMOD=0x01; //模式設置,00000001,可見采用的是定時器0,工作與模式1(M1=0,M0=1)。
- TR0=1; //打開定時器
- TH0=(65536-50000)/256;// 由于晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發起一次中斷。
- TL0=(65536-50000)%256;//46080的來歷,為50000*11.0592/12
- ET0=1; //開定時器0中斷
- EA=1; //開總中斷
- }
- void EX0_ISR (void) interrupt 0 //外部中斷0服務函數
- {
- /*startflag=0;
- jiALL=ji1=ji2=ji3=ji4=1;
- initial_lcd();//初始化lcd
- clear_screen();
- display_GB2312_string(1,1,"請設置洗滌時間:");
- sprintf(bbuf,"%d分鐘",timer_s/60);
- display_GB2312_string(5,80,bbuf); */
- }
- void EX0init(void)
- {
- IT0 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
- EX0 = 1; //使能外部中斷
- EA = 1; //開總中斷
- }
- void main(void)
- {
- P0M1=0; //設置P0全部為準雙向io
- P0M0=0;
- P1M1=0; //設置P1全部為準雙向io
- P1M0=0;
- P2M0=0;
- P2M1=0;
- P3M1=0; //設置P3全部為準雙向io
- P3M0=0;
- P4M1=0; //設置P4全部為準雙向io
- P4M0=0;
- jiALL=ji1=ji2=ji3=ji4=1;
- initial_lcd();//初始化lcd
- EX0init(); //初始化外部中斷
- TIM0init();//初始化定時器
- timer=0;
- timer_s=0;
- startflag=0;
- clear_screen(); //clear all dots清屏
- display_string_5x8(1,1,0,"welcome use");
- display_graphic_32x32(3,10,z);
- display_graphic_32x32(3,45,k);
- display_graphic_32x32(3,80,y);
- display_graphic_32x32(3,115,b);
- display_graphic_32x32(3,150,yi);
- display_string_5x8(8,157,0,"key in");
- delay_ms(1000);
- display_graphic_192x64(bmp1);
- delay_ms(1000);
-
- clear_screen();
- timer_s=10*60;//初始化定時10分鐘
- display_GB2312_string(1,1,"請設置洗滌時間:");
- display_GB2312_string(5,80,"10分鐘");
- while(1)
- {
- if(key4==0){
- delay_ms(50);
- if(key4==0){
- if(startflag==0){
- startflag=0;
- initial_lcd();//初始化lcd
- clear_screen();
- timer_s+=60;
- if(timer_s>=100*60)timer_s=100*60;
- display_GB2312_string(1,1,"請設置洗滌時間:");
- sprintf(bbuf,"%d分鐘",timer_s/60);
- display_GB2312_string(5,80,bbuf);
- }
- }
- }
-
- if(key2==0){
- delay_ms(50);
- if(key2==0){
- if(startflag==0){
- startflag=0;
- initial_lcd();//初始化lcd
- clear_screen();
- timer_s-=60;
- if(timer_s<=0)timer_s=0;
- display_GB2312_string(1,1,"請設置洗滌時間:");
- sprintf(bbuf,"%d分鐘",timer_s/60);
- display_GB2312_string(5,80,bbuf);
- }
- }
- }
- if(key3==0){
- delay_ms(100);
- if(key3==0){
- if(startflag==0){
- startflag=1;
- initial_lcd();//初始化lcd
- clear_screen();
- display_GB2312_string(1,1,"洗滌中:");
- display_GB2312_string(5,1,"倒計時:");
- sprintf(bbuf,"%d分鐘",timer_s/60);
- display_GB2312_string(5,80,bbuf);
- }
- }
- }
-
- if(startflag==1){
- initial_lcd();//初始化lcd
- clear_screen();
-
- display_GB2312_string(1,1,"洗滌中:");
- display_GB2312_string(5,1,"倒計時:");
- sprintf(bbuf,"%d分鐘",timer_s/60);
- display_GB2312_string(5,80,bbuf);
-
- sprintf(bbuf,"%ds",timer_s);
- display_GB2312_string(7,150,bbuf);
-
- jiALL=0;
- ji1=ji2=ji3=ji4=1;delay_ms(10);
- ji1=0;delay_ms(1000);
- ji2=0;delay_ms(5000);
- ji1=1;delay_ms(5000);
- ji2=1;delay_ms(1500);
-
- ji3=0;delay_ms(1000);
- ji4=0;delay_ms(5000);
- ji3=1;delay_ms(5000);
- ji4=1;delay_ms(1500);
- }
-
- sprintf(bbuf,"%ds",timer_s);
- display_GB2312_string(7,150,bbuf);
-
- }
- }
- uchar code ascii_table_5x8[95][5]={
- /*??ASCII ??:5x8 ??*/
- 0x00,0x00,0x00,0x00,0x00,//- - //space
- 0x00,0x00,0x4f,0x00,0x00,//-!-
- 0x00,0x07,0x00,0x07,0x00,//-"-
- 0x14,0x7f,0x14,0x7f,0x14,//-#-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
19264屏幕5繼電器控制洗衣機洗滌定時.rar
(870.45 KB, 下載次數: 140)
2019-7-20 21:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|