我按照教材連得圖和打得程序,結果仿真結果是液晶屏里在不停的跳動
無標題.png (315.9 KB, 下載次數: 101)
下載附件
2017-6-13 16:43 上傳
- #include<reg51.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define lcd_data P0
- sbit DQ = P1^7;
- sbit lcd_RS=P2^0;
- sbit lcd_RW=P2^1;
- sbit lcd_EN=P2^2;
- sbit PWM=P3^7;
- sbit D=P3^6;
- uchar t[2],speed,temperature;
- uchar DS18B20_is_ok;
- uchar TempBuffer1[12]={0x20,0x20,0x20,0x20,0xdf,0x43,'\0'};
- uchar tab[16]={0x20,0x20,0x20,0x54,0x20,0x4d,0x6f,0x6e,0x69,0x74,0x6f,0x72,'\0'};
- /*********LCD顯示子程序**********/
- void delay_20ms(void)
- {
- uint i,temp;
- for(i=20;i>0;i--)
- {
- temp=248;
- while(--temp);
- temp=248;
- while(--temp);
- }
- }
- void delay_38us(void)
- {
- uchar temp;
- temp=18;
- while(--temp);
- }
- void delay_1520us(void)
- {
- uint i,temp;
- for(i=3;i>0;i--)
- {
- temp=252;
- while(--temp);
- }
- }
- uchar lcd_rd_status()
- {
- uchar tmp_sts;
- lcd_data=0xff;
- lcd_RW=1;
- lcd_RS=0;
- lcd_EN=1;
- tmp_sts=lcd_data;
- lcd_EN=0;
- lcd_RW=0;
- return tmp_sts;
- }
- void lcd_wr_com(uchar command)
- {
- while(0x80&lcd_rd_status());
- lcd_RW=0;
- lcd_RS=0;
- lcd_data=command;
- lcd_EN=1;
- lcd_EN=0;
- }
- void lcd_wr_data(uchar sjdata)
- {
- while(0x80&lcd_rd_status());
- lcd_RW=0;
- lcd_RS=1;
- lcd_data=sjdata;
- lcd_EN=1;
- lcd_EN=0;
- lcd_RS=0;
- }
- void Init_lcd(void)
- {
- delay_20ms();
- lcd_wr_com(0x38);
- delay_38us();
- lcd_wr_com(0x0c);
- delay_38us();
- lcd_wr_com(0x01);
- delay_1520us();
- lcd_wr_com(0x06);
- }
- void GotoXY(uchar x, uchar y)
- {
- if(y==0)
- lcd_wr_com(0x80|x);
- if(y==1)
- lcd_wr_com(0xc0|x);
- }
- void Print(uchar *str)
- {
- while(*str!="\0")
- {
- lcd_wr_data(*str);
- str++;
- }
- }
- void LCD_Print(uchar x,uchar y,uchar *str)
- {
- GotoXY (x,y);
- Print(str);
- }
- /**************系統顯示子函數************/
- void covert1()
- {
- uchar x=0x00;
- if(t[1]>0x07)
- {
- TempBuffer1[0]=0x2d;
- t[1]=~t[1];
- t[0]=~t[0];
- x=t[0]+1;
- t[0]=x;
- if(x>255)
- t[1]++;
- }
- else
- TempBuffer1[0]=0x2b;
- t[1]<<=4;
- t[1]=t[1]&0x70;
- x=t[0];
- x>>=4;
- x=x&0x0f;
- t[1]=t[1]|x;
- temperature=t[1];
- TempBuffer1[1]=t[1]/100+0x30;
- if(TempBuffer1[1]==0x30)
- TempBuffer1[1]=0xfe;
- TempBuffer1[2]=(t[1]%100)/10+0x30;
- TempBuffer1[3]=(t[1]%100)%10+0x30;
- }
- /************DS18B20函數***************/
- void delay_DS18B20(uint i)
- {
- while(i--);
- }
- void Init_DS18B20(void)
- {
- uchar x=0;
- DQ= 1;
- delay_DS18B20(8);
- DQ= 0;
- delay_DS18B20(80);
- DQ= 1;
- delay_DS18B20(14);
- x=DQ;
- delay_DS18B20(20);
- }
- uchar ReadOneChar(void)
- {
- unsigned char i=0;
- unsigned char dat0=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- dat0>>=1;
- DQ=1;
- if(DQ)
- dat0|=0x80;
- delay_DS18B20(4);
- }
- return(dat0);
- }
- void WriteOneChar (uchar dat1)
- {
- uchar i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat1&0x01;
- delay_DS18B20(5);
- DQ=1;
- dat1>>=1;
- }
- }
- void ReadTemperature()
- {
- delay_DS18B20(80);
- Init_DS18B20();
- WriteOneChar(0xCC);
- WriteOneChar(0x44);
- delay_DS18B20(80);
- Init_DS18B20();
- WriteOneChar(0xCC);
- WriteOneChar(0xBE);
- delay_DS18B20(80);
- t[0]=ReadOneChar();
- t[1]=ReadOneChar();
- }
- void delay_motor(uchar i)
- {
- uchar j,k;
- for(j=i;j>0;j--)
- for(k=200;k>0;k--);
- }
- /***********電動機轉動程序*************/
- void motor(uchar tmp)
- {
- uchar x;
- if(TempBuffer1[0]==0x2b )
- {
- if(tmp<25)
- {
- D=0;
- PWM=0;
- }
- else if (tmp>50)
- {
- D=0;
- PWM=1;
- x=250;
- delay_motor(x);
- PWM=0;
- x=5;
- delay_motor(x);
- }
- else
- {
- D=0;
- PWM=1;
- x=5*tmp;
- delay_motor(x);
- PWM=0;
- x=255-5*tmp;
- delay_motor(x);
- }
- }
- else if(TempBuffer1[0]==0x2d)
- {
- D=1;
- PWM=0;
- x=5*tmp;
- delay_motor(x);
- PWM=1;
- x=255-5*tmp;
- delay_motor(x);
- }
- }
- void delay(unsigned int x)
- {
- unsigned char i;
- while(x--)
- {
- for(i=0;i<123;i++){;}
- }
- }
- /***********主要功能函數*************/
- void main(void)
- {
- delay_20ms();
- ReadTemperature();
- Init_lcd();
- LCD_Print(0,0,tab);
- delay(1000);
- while(1)
- {
- ReadTemperature();
- delay_DS18B20(100);
- covert1();
- LCD_Print(4,1,TempBuffer1);
- motor(temperature);
- }
- }
復制代碼
|