完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我写了一个程序,用PWM控制电机调速,当温度高快转的快温度低快转的慢,12864能显示温度曲线和温度值。但是现在出现这种情况:没按电机启动按键时12864能显示温度曲线和温度值,按下电机启动按键后12864只能显示温度值不能显示温度曲线,电机只能按一个速度转不能按温度来调速。
各位大神这问题怎么解决? |
|
相关推荐
9 个讨论
|
|
主程序
#include #include"dj.h" #include"wdqx.h" ***it RW=P2^1 ; uint new_t; uint tvalue; uint t0,t1; void bijiao() { uint yy; yy=(tvalue%1000/100+0x30)+(tvalue%100/10+0x30); if((yy>20)&&(yy<30)) {t0=40000; t1=10000;} if(yy>30) {t0=20000; t1=30000;} } void main() { uchar wave=0; uchar i=0,a; uchar colour=1; RW=0 ; lcdreset(); ceshi(); clrgdram(); delaynms(2000); clrscreen(); time_init(); //keyscan(); while(1) { read_temp1();//读取温度 read_temp2();//读取温度 ds1820disp1();//显示 ds1820disp2();//显示 wave++; if(wave>=10) { a=64-new_t; if(i>=128) { i=0; clrgdram(); delaynms(2000); clrscreen(); } DrawPoint(i++,a,colour); wave=0; } keyscan(); bijiao(); } } |
|
|
|
|
|
电机程序
#include"dj.h" #define uchar unsigned char #define uint unsigned int ***it PW1=P1^0 ; ***it PW2=P1^1; //控制电机的两个输入 //***it accelerate=P1^4 ;//调速按键 ***it left=P1^6 ; //左转按键 #define right_turn PW1=0;PW2=1//顺时针转动 #define left_turn PW1=1;PW2=0//逆向转动 #define end_turn PW1=1;PW2=1//停转 extern uint t0=45000,t1=5000; //初始时占空比为50% extern uint a=25000; //?? 设置定时器装载初值?? 25ms???? 设定频率为20Hz uchar flag=1; //此标志用于选择不同的装载初值 uchar dflag; //左右转标志 uchar count; //用来标志速度档位 void timer0() interrupt 1 using 0 { if(flag) { flag=0; end_turn; a=t0;//t0的大小决定着低电平延续时间 TH0=(65536-a)/256; TL0=(65536-a)%256;//重装载初值 } else { flag=1;//这个标志起到交替输出高低电平的作用 if(dflag==0) { right_turn;//右转 } else { left_turn;//左转 } a=t1; //t1的大小决定着高电平延续时间 TH0=(65536-a)/256; TL0=(65536-a)%256;//重装载初值 } } void time_init() { TMOD=0x01; //工作方式寄存器??? 软件起动定时器? 定时器功能? 方式1? 定时器0 TH0=(65536-a)/256; TL0=(65536-a)%256;//装载初值 ET0=1;//开启定时器中断使能 EA=1;//? 开启总中断 TR0=0; } /* void delay(uchar z)//在12M下延时z毫秒 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }*/ void keyscan() { //if(stop==0) //{ // TR0=0; //关闭定时器0??? 即可停止转动 //} if(left==0) { TR0=1; dflag=1;//转向标志置位则左转 } /* if(accelerate==0) { delay(5) ;//延时消抖 if(accelerate==0) { while(accelerate==0); //等待松手 count++; if(count==1) { t0=40000; t1=10000;//占空比为百分之20 } if(count==2) { t0=30000; t1=20000;//占空比为百分之40 } if(count==3) { t0=20000; t1=30000;//占空比为百分之60 } if(count==4) { t0=10000; t1=40000;//占空比为百分之80 } if(count==5) { count=0; } } }*/ } |
|
|
|
|
|
温度曲线程序
#include"wdqx.h" #define uchar unsigned char #define uint unsigned int ***it DQ=P3^3;//ds18b20与单片机连接口 //***it PWM=P2^5;//控制信号的输出 unsigned char code str[]={"my name is zs "}; unsigned char code str_[]={"MADE IN NUPT... "}; unsigned char code str1[]={"temper:"}; unsigned char code str2[]={" "}; unsigned char code nul[]={" "}; unsigned char code str3[]={"target: "}; unsigned char str4[6];//设定温度的存储 uchar data disdata[5]; uchar a[4]={0,0,0,0},j,i,k,num=0; //定义变量 //***it js=P3^2; //红外接收端 //uchar zhb_flag=0;//保证一次解码,只执行一次代码 extern uint tvalue;//温度值 uchar tflag;//温度正负标志 //uint count=0;//按键次数初始化为0 uint number=4;//暂时规定输入的温度为xx.x的形式 //uchar j,key; //uint time_flag=0; //bit enterflag=0; // 确认键按下与否标志 extern uint new_t; //转化后的十进制实时温度 //uint target=0; //转化后的十进制的目标温度---有键盘输入 //------------定义接口-------------// ***it RS=P2^0 ; ***it RW=P2^1 ; ***it E=P2^2; ***it PSB= P2^3; //H=并口; L="串口"; #define Lcd_Bus P0 // P0 接 LCM #define uchar unsigned char #define FIRST_ADDR 0 //定义字符/汉字显示起始位置 /*------------------检查忙位-----------------------------*/ void chk_busy() { RS=0 ; RW=1 ; E=1 ; Lcd_Bus=0xff ; while((Lcd_Bus&0x80)==0x80); E=0 ; } /*------------------延时子程序-----------------------------*/ void lcd_delay(unsigned int t) { unsigned int i,j ; for(i=0;i } /*------------------写命令到LCD------------------------------*/ void write_com(unsigned char cmdcode) { chk_busy(); RS=0 ; RW=0 ; E=1 ; Lcd_Bus=cmdcode ; lcd_delay(5); //------------------在数据写入的时候加入适当的延时 E=0 ; lcd_delay(5); } /*-------------------写数据到LCD----------------------------*/ void write_data(unsigned char Dispdata) { chk_busy(); RS=1 ; RW=0 ; E=1 ; Lcd_Bus=Dispdata ; lcd_delay(5); //------------------在数据写入的时候加入适当的延时 E=0 ; lcd_delay(5); } /*------------------初始化LCD屏--------------------------*/ void lcdreset() { PSB = 1; lcd_delay(2000); write_com(0x30); lcd_delay(10); //选择基本指令集 write_com(0x30); //选择8bit数据流 lcd_delay(5); write_com(0x0c); //开显示(无游标、不反白) lcd_delay(10); write_com(0x01); //清除显示,并且设定地址指针为00H lcd_delay(500); write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位 lcd_delay(0); } /*------------------显示字符串--------------------------*/ void hzkdis(unsigned char code*s) { while(*s>0) { write_data(*s); s++; lcd_delay(50); } } /*------------------首屏显示--------------------------*/ void ceshi() { write_com(0x01); //清除显示,并且设定地址指针为00H lcd_delay(5); write_com(0x80); //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示) hzkdis("清华大学"); write_com(0x90); //第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示) hzkdis(str); write_com(0x88); //第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示) hzkdis("自动化专业"); write_com(0x98); //第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示) hzkdis("本科测试程序"); } //------------------清整个GDRAM空间---------------------------- void clrgdram() { unsigned char x,y ; for(y=0;y<64;y++) for(x=0;x<16;x++) { write_com(0x34); write_com(y+0x80); //行地址 write_com(x+0x80); //列地址 write_com(0x30); write_data(0x00); write_data(0x00); } } //------------------------------------------------------------ void clrscreen() { write_com(0x01); lcd_delay(10); } unsigned char ReadByte(void) { unsigned char byReturnValue ; chk_busy(); Lcd_Bus=0xff ; RS=1 ; RW=1 ; E=0 ; E=1 ; byReturnValue=Lcd_Bus ; E=0 ; return byReturnValue ; } /*增加画点子程序 函数功能:在坐标为(x,y)点画一个点 参数意义 X:12864屏幕的横坐标,范围是0到128(从左到右) Y:12864的纵坐标,范围是0到64(从上到下) Color:为1的时候表示为黑点 */ void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color) { unsigned char Row,Tier,Tier_bit ; unsigned char ReadOldH,ReadOldL ; write_com(0x34); write_com(0x36); Tier=X>>4 ; Tier_bit=X&0x0f ; if(Y<32) { Row=Y ; } else { Row=Y-32 ; Tier+=8 ; } write_com(Row+0x80); write_com(Tier+0x80); ReadByte(); ReadOldH=ReadByte(); ReadOldL=ReadByte(); write_com(Row+0x80); write_com(Tier+0x80); if(Tier_bit<8) { switch(Color) { case 0 : ReadOldH&=(~(0x01<<(7-Tier_bit))); break ; case 1 : ReadOldH|=(0x01<<(7-Tier_bit)); break ; case 2 : ReadOldH^=(0x01<<(7-Tier_bit)); break ; default : break ; } write_data(ReadOldH); write_data(ReadOldL); } else { switch(Color) { case 0 : ReadOldL&=(~(0x01<<(15-Tier_bit))); break ; case 1 : ReadOldL|=(0x01<<(15-Tier_bit)); break ; case 2 : ReadOldL^=(0x01<<(15-Tier_bit)); break ; default : break ; } write_data(ReadOldH); write_data(ReadOldL); } write_com(0x30); } void delay_18B20(unsigned int i)//延时1微秒 { while(i--); } void ds1820rst()/*ds1820复位*/ { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd()/*读数据*/ { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar wdata)/*写数据*/ { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } read_temp1()/*读取温度值并转换*/ { ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst(); } read_temp2() { uchar a,b; ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else { tvalue=~tvalue+1; tflag=1; } tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); } /*******************************************************************/ void ds1820disp1()//温度值显示 { uchar flagdat; disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30;//个位数 disdata[3]=tvalue%10+0x30;//小数位 if(tflag==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号:- if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) { disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } } void ds1820disp2() { lcd_delay(5); write_com(0x98); hzkdis("温度:"); lcd_delay(50); write_com(0x9b); write_data(disdata[1]); write_com(0x9c); write_data(disdata[2]); write_com(0x9d); write_data(0x2e); write_com(0x9e); write_data(disdata[3]); write_com(0x9f); hzkdis("℃"); lcd_delay(50); new_t=disdata[1]*10+disdata[2]; } void delaynms(uint us) //delay time { while(us--); } |
|
|
|
|
|
温度曲线程序
#include"wdqx.h" #define uchar unsigned char #define uint unsigned int ***it DQ=P3^3;//ds18b20与单片机连接口 //***it PWM=P2^5;//控制信号的输出 unsigned char code str[]={"my name is zs "}; unsigned char code str_[]={"MADE IN NUPT... "}; unsigned char code str1[]={"temper:"}; unsigned char code str2[]={" "}; unsigned char code nul[]={" "}; unsigned char code str3[]={"target: "}; unsigned char str4[6];//设定温度的存储 uchar data disdata[5]; uchar a[4]={0,0,0,0},j,i,k,num=0; //定义变量 //***it js=P3^2; //红外接收端 //uchar zhb_flag=0;//保证一次解码,只执行一次代码 extern uint tvalue;//温度值 uchar tflag;//温度正负标志 //uint count=0;//按键次数初始化为0 uint number=4;//暂时规定输入的温度为xx.x的形式 //uchar j,key; //uint time_flag=0; //bit enterflag=0; // 确认键按下与否标志 extern uint new_t; //转化后的十进制实时温度 //uint target=0; //转化后的十进制的目标温度---有键盘输入 //------------定义接口-------------// ***it RS=P2^0 ; ***it RW=P2^1 ; ***it E=P2^2; ***it PSB= P2^3; //H=并口; L="串口"; #define Lcd_Bus P0 // P0 接 LCM #define uchar unsigned char #define FIRST_ADDR 0 //定义字符/汉字显示起始位置 /*------------------检查忙位-----------------------------*/ void chk_busy() { RS=0 ; RW=1 ; E=1 ; Lcd_Bus=0xff ; while((Lcd_Bus&0x80)==0x80); E=0 ; } /*------------------延时子程序-----------------------------*/ void lcd_delay(unsigned int t) { unsigned int i,j ; for(i=0;i } /*------------------写命令到LCD------------------------------*/ void write_com(unsigned char cmdcode) { chk_busy(); RS=0 ; RW=0 ; E=1 ; Lcd_Bus=cmdcode ; lcd_delay(5); //------------------在数据写入的时候加入适当的延时 E=0 ; lcd_delay(5); } /*-------------------写数据到LCD----------------------------*/ void write_data(unsigned char Dispdata) { chk_busy(); RS=1 ; RW=0 ; E=1 ; Lcd_Bus=Dispdata ; lcd_delay(5); //------------------在数据写入的时候加入适当的延时 E=0 ; lcd_delay(5); } /*------------------初始化LCD屏--------------------------*/ void lcdreset() { PSB = 1; lcd_delay(2000); write_com(0x30); lcd_delay(10); //选择基本指令集 write_com(0x30); //选择8bit数据流 lcd_delay(5); write_com(0x0c); //开显示(无游标、不反白) lcd_delay(10); write_com(0x01); //清除显示,并且设定地址指针为00H lcd_delay(500); write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位 lcd_delay(0); } /*------------------显示字符串--------------------------*/ void hzkdis(unsigned char code*s) { while(*s>0) { write_data(*s); s++; lcd_delay(50); } } /*------------------首屏显示--------------------------*/ void ceshi() { write_com(0x01); //清除显示,并且设定地址指针为00H lcd_delay(5); write_com(0x80); //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示) hzkdis("清华大学"); write_com(0x90); //第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示) hzkdis(str); write_com(0x88); //第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示) hzkdis("自动化专业"); write_com(0x98); //第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示) hzkdis("本科测试程序"); } //------------------清整个GDRAM空间---------------------------- void clrgdram() { unsigned char x,y ; for(y=0;y<64;y++) for(x=0;x<16;x++) { write_com(0x34); write_com(y+0x80); //行地址 write_com(x+0x80); //列地址 write_com(0x30); write_data(0x00); write_data(0x00); } } //------------------------------------------------------------ void clrscreen() { write_com(0x01); lcd_delay(10); } unsigned char ReadByte(void) { unsigned char byReturnValue ; chk_busy(); Lcd_Bus=0xff ; RS=1 ; RW=1 ; E=0 ; E=1 ; byReturnValue=Lcd_Bus ; E=0 ; return byReturnValue ; } /*增加画点子程序 函数功能:在坐标为(x,y)点画一个点 参数意义 X:12864屏幕的横坐标,范围是0到128(从左到右) Y:12864的纵坐标,范围是0到64(从上到下) Color:为1的时候表示为黑点 */ void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color) { unsigned char Row,Tier,Tier_bit ; unsigned char ReadOldH,ReadOldL ; write_com(0x34); write_com(0x36); Tier=X>>4 ; Tier_bit=X&0x0f ; if(Y<32) { Row=Y ; } else { Row=Y-32 ; Tier+=8 ; } write_com(Row+0x80); write_com(Tier+0x80); ReadByte(); ReadOldH=ReadByte(); ReadOldL=ReadByte(); write_com(Row+0x80); write_com(Tier+0x80); if(Tier_bit<8) { switch(Color) { case 0 : ReadOldH&=(~(0x01<<(7-Tier_bit))); break ; case 1 : ReadOldH|=(0x01<<(7-Tier_bit)); break ; case 2 : ReadOldH^=(0x01<<(7-Tier_bit)); break ; default : break ; } write_data(ReadOldH); write_data(ReadOldL); } else { switch(Color) { case 0 : ReadOldL&=(~(0x01<<(15-Tier_bit))); break ; case 1 : ReadOldL|=(0x01<<(15-Tier_bit)); break ; case 2 : ReadOldL^=(0x01<<(15-Tier_bit)); break ; default : break ; } write_data(ReadOldH); write_data(ReadOldL); } write_com(0x30); } void delay_18B20(unsigned int i)//延时1微秒 { while(i--); } void ds1820rst()/*ds1820复位*/ { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd()/*读数据*/ { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar wdata)/*写数据*/ { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } read_temp1()/*读取温度值并转换*/ { ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst(); } read_temp2() { uchar a,b; ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else { tvalue=~tvalue+1; tflag=1; } tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); } /*******************************************************************/ void ds1820disp1()//温度值显示 { uchar flagdat; disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30;//个位数 disdata[3]=tvalue%10+0x30;//小数位 if(tflag==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号:- if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) { disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } } void ds1820disp2() { lcd_delay(5); write_com(0x98); hzkdis("温度:"); lcd_delay(50); write_com(0x9b); write_data(disdata[1]); write_com(0x9c); write_data(disdata[2]); write_com(0x9d); write_data(0x2e); write_com(0x9e); write_data(disdata[3]); write_com(0x9f); hzkdis("℃"); lcd_delay(50); new_t=disdata[1]*10+disdata[2]; } void delaynms(uint us) //delay time { while(us--); } |
|
|
|
|
|
#include"wdqx.h"
#define uchar unsigned char #define uint unsigned int ***it DQ=P3^3;//ds18b20与单片机连接口 //***it PWM=P2^5;//控制信号的输出 unsigned char code str[]={"my name is zs "}; unsigned char code str_[]={"MADE IN NUPT... "}; unsigned char code str1[]={"temper:"}; unsigned char code str2[]={" "}; unsigned char code nul[]={" "}; unsigned char code str3[]={"target: "}; unsigned char str4[6];//设定温度的存储 uchar data disdata[5]; uchar a[4]={0,0,0,0},j,i,k,num=0; //定义变量 //***it js=P3^2; //红外接收端 //uchar zhb_flag=0;//保证一次解码,只执行一次代码 extern uint tvalue;//温度值 uchar tflag;//温度正负标志 //uint count=0;//按键次数初始化为0 uint number=4;//暂时规定输入的温度为xx.x的形式 //uchar j,key; //uint time_flag=0; //bit enterflag=0; // 确认键按下与否标志 extern uint new_t; //转化后的十进制实时温度 //uint target=0; //转化后的十进制的目标温度---有键盘输入 //------------定义接口-------------// ***it RS=P2^0 ; ***it RW=P2^1 ; ***it E=P2^2; ***it PSB= P2^3; //H=并口; L="串口"; #define Lcd_Bus P0 // P0 接 LCM #define uchar unsigned char #define FIRST_ADDR 0 //定义字符/汉字显示起始位置 /*------------------检查忙位-----------------------------*/ void chk_busy() { RS=0 ; RW=1 ; E=1 ; Lcd_Bus=0xff ; while((Lcd_Bus&0x80)==0x80); E=0 ; } /*------------------延时子程序-----------------------------*/ void lcd_delay(unsigned int t) { unsigned int i,j ; for(i=0;i } /*------------------写命令到LCD------------------------------*/ void write_com(unsigned char cmdcode) { chk_busy(); RS=0 ; RW=0 ; E=1 ; Lcd_Bus=cmdcode ; lcd_delay(5); //------------------在数据写入的时候加入适当的延时 E=0 ; lcd_delay(5); } /*-------------------写数据到LCD----------------------------*/ void write_data(unsigned char Dispdata) { chk_busy(); RS=1 ; RW=0 ; E=1 ; Lcd_Bus=Dispdata ; lcd_delay(5); //------------------在数据写入的时候加入适当的延时 E=0 ; lcd_delay(5); } /*------------------初始化LCD屏--------------------------*/ void lcdreset() { PSB = 1; lcd_delay(2000); write_com(0x30); lcd_delay(10); //选择基本指令集 write_com(0x30); //选择8bit数据流 lcd_delay(5); write_com(0x0c); //开显示(无游标、不反白) lcd_delay(10); write_com(0x01); //清除显示,并且设定地址指针为00H lcd_delay(500); write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位 lcd_delay(0); } /*------------------显示字符串--------------------------*/ void hzkdis(unsigned char code*s) { while(*s>0) { write_data(*s); s++; lcd_delay(50); } } /*------------------首屏显示--------------------------*/ void ceshi() { write_com(0x01); //清除显示,并且设定地址指针为00H lcd_delay(5); write_com(0x80); //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示) hzkdis("清华大学"); write_com(0x90); //第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示) hzkdis(str); write_com(0x88); //第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示) hzkdis("自动化专业"); write_com(0x98); //第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示) hzkdis("本科测试程序"); } //------------------清整个GDRAM空间---------------------------- void clrgdram() { unsigned char x,y ; for(y=0;y<64;y++) for(x=0;x<16;x++) { write_com(0x34); write_com(y+0x80); //行地址 write_com(x+0x80); //列地址 write_com(0x30); write_data(0x00); write_data(0x00); } } //------------------------------------------------------------ void clrscreen() { write_com(0x01); lcd_delay(10); } unsigned char ReadByte(void) { unsigned char byReturnValue ; chk_busy(); Lcd_Bus=0xff ; RS=1 ; RW=1 ; E=0 ; E=1 ; byReturnValue=Lcd_Bus ; E=0 ; return byReturnValue ; } /*增加画点子程序 函数功能:在坐标为(x,y)点画一个点 参数意义 X:12864屏幕的横坐标,范围是0到128(从左到右) Y:12864的纵坐标,范围是0到64(从上到下) Color:为1的时候表示为黑点 */ void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color) { unsigned char Row,Tier,Tier_bit ; unsigned char ReadOldH,ReadOldL ; write_com(0x34); write_com(0x36); Tier=X>>4 ; Tier_bit=X&0x0f ; if(Y<32) { Row=Y ; } else { Row=Y-32 ; Tier+=8 ; } write_com(Row+0x80); write_com(Tier+0x80); ReadByte(); ReadOldH=ReadByte(); ReadOldL=ReadByte(); write_com(Row+0x80); write_com(Tier+0x80); if(Tier_bit<8) { switch(Color) { case 0 : ReadOldH&=(~(0x01<<(7-Tier_bit))); break ; case 1 : ReadOldH|=(0x01<<(7-Tier_bit)); break ; case 2 : ReadOldH^=(0x01<<(7-Tier_bit)); break ; default : break ; } write_data(ReadOldH); write_data(ReadOldL); } else { switch(Color) { case 0 : ReadOldL&=(~(0x01<<(15-Tier_bit))); break ; case 1 : ReadOldL|=(0x01<<(15-Tier_bit)); break ; case 2 : ReadOldL^=(0x01<<(15-Tier_bit)); break ; default : break ; } write_data(ReadOldH); write_data(ReadOldL); } write_com(0x30); } void delay_18B20(unsigned int i)//延时1微秒 { while(i--); } void ds1820rst()/*ds1820复位*/ { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd()/*读数据*/ { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar wdata)/*写数据*/ { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } read_temp1()/*读取温度值并转换*/ { ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst(); } read_temp2() { uchar a,b; ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else { tvalue=~tvalue+1; tflag=1; } tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); } /*******************************************************************/ void ds1820disp1()//温度值显示 { uchar flagdat; disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30;//个位数 disdata[3]=tvalue%10+0x30;//小数位 if(tflag==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号:- if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) { disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } } void ds1820disp2() { lcd_delay(5); write_com(0x98); hzkdis("温度:"); lcd_delay(50); write_com(0x9b); write_data(disdata[1]); write_com(0x9c); write_data(disdata[2]); write_com(0x9d); write_data(0x2e); write_com(0x9e); write_data(disdata[3]); write_com(0x9f); hzkdis("℃"); lcd_delay(50); new_t=disdata[1]*10+disdata[2]; } void delaynms(uint us) //delay time { while(us--); } |
|
|
|
|
|
#include"wdqx.h" #define uchar unsigned char #define uint unsigned int ***it DQ=P3^3;//ds18b20与单片机连接口 //***it PWM=P2^5;//控制信号的输出 unsigned char code str[]={"my name is zs "}; unsigned char code str_[]={"MADE IN NUPT... "}; unsigned char code str1[]={"temper:"}; unsigned char code str2[]={" "}; unsigned char code nul[]={" "}; unsigned char code str3[]={"target: "}; unsigned char str4[6];//设定温度的存储 uchar data disdata[5]; uchar a[4]={0,0,0,0},j,i,k,num=0; //定义变量 //***it js=P3^2; //红外接收端 //uchar zhb_flag=0;//保证一次解码,只执行一次代码 extern uint tvalue;//温度值 uchar tflag;//温度正负标志 //uint count=0;//按键次数初始化为0 uint number=4;//暂时规定输入的温度为xx.x的形式 //uchar j,key; //uint time_flag=0; //bit enterflag=0; // 确认键按下与否标志 extern uint new_t; //转化后的十进制实时温度 //uint target=0; //转化后的十进制的目标温度---有键盘输入 //------------定义接口-------------// ***it RS=P2^0 ; ***it RW=P2^1 ; ***it E=P2^2; ***it PSB= P2^3; //H=并口; L="串口"; #define Lcd_Bus P0 // P0 接 LCM #define uchar unsigned char #define FIRST_ADDR 0 //定义字符/汉字显示起始位置 /*------------------检查忙位-----------------------------*/ void chk_busy() { RS=0 ; RW=1 ; E=1 ; Lcd_Bus=0xff ; while((Lcd_Bus&0x80)==0x80); E=0 ; } /*------------------延时子程序-----------------------------*/ void lcd_delay(unsigned int t) { unsigned int i,j ; for(i=0;i } /*------------------写命令到LCD------------------------------*/ void write_com(unsigned char cmdcode) { chk_busy(); RS=0 ; RW=0 ; E=1 ; Lcd_Bus=cmdcode ; lcd_delay(5); //------------------在数据写入的时候加入适当的延时 E=0 ; lcd_delay(5); } /*-------------------写数据到LCD----------------------------*/ void write_data(unsigned char Dispdata) { chk_busy(); RS=1 ; RW=0 ; E=1 ; Lcd_Bus=Dispdata ; lcd_delay(5); //------------------在数据写入的时候加入适当的延时 E=0 ; lcd_delay(5); } /*------------------初始化LCD屏--------------------------*/ void lcdreset() { PSB = 1; lcd_delay(2000); write_com(0x30); lcd_delay(10); //选择基本指令集 write_com(0x30); //选择8bit数据流 lcd_delay(5); write_com(0x0c); //开显示(无游标、不反白) lcd_delay(10); write_com(0x01); //清除显示,并且设定地址指针为00H lcd_delay(500); write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位 lcd_delay(0); } /*------------------显示字符串--------------------------*/ void hzkdis(unsigned char code*s) { while(*s>0) { write_data(*s); s++; lcd_delay(50); } } /*------------------首屏显示--------------------------*/ void ceshi() { write_com(0x01); //清除显示,并且设定地址指针为00H lcd_delay(5); write_com(0x80); //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示) hzkdis("ABC大学"); write_com(0x90); //第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示) hzkdis(str); write_com(0x88); //第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示) hzkdis("电子信息工程专业"); write_com(0x98); //第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示) hzkdis("本科测试程序"); } //------------------清整个GDRAM空间---------------------------- void clrgdram() { unsigned char x,y ; for(y=0;y<64;y++) for(x=0;x<16;x++) { write_com(0x34); write_com(y+0x80); //行地址 write_com(x+0x80); //列地址 write_com(0x30); write_data(0x00); write_data(0x00); } } //------------------------------------------------------------ void clrscreen() { write_com(0x01); lcd_delay(10); } unsigned char ReadByte(void) { unsigned char byReturnValue ; chk_busy(); Lcd_Bus=0xff ; RS=1 ; RW=1 ; E=0 ; E=1 ; byReturnValue=Lcd_Bus ; E=0 ; return byReturnValue ; } /*增加画点子程序 函数功能:在坐标为(x,y)点画一个点 参数意义 X:12864屏幕的横坐标,范围是0到128(从左到右) Y:12864的纵坐标,范围是0到64(从上到下) Color:为1的时候表示为黑点 */ void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color) { unsigned char Row,Tier,Tier_bit ; unsigned char ReadOldH,ReadOldL ; write_com(0x34); write_com(0x36); Tier=X>>4 ; Tier_bit=X&0x0f ; if(Y<32) { Row=Y ; } else { Row=Y-32 ; Tier+=8 ; } write_com(Row+0x80); write_com(Tier+0x80); ReadByte(); ReadOldH=ReadByte(); ReadOldL=ReadByte(); write_com(Row+0x80); write_com(Tier+0x80); if(Tier_bit<8) { switch(Color) { case 0 : ReadOldH&=(~(0x01<<(7-Tier_bit))); break ; case 1 : ReadOldH|=(0x01<<(7-Tier_bit)); break ; case 2 : ReadOldH^=(0x01<<(7-Tier_bit)); break ; default : break ; } write_data(ReadOldH); write_data(ReadOldL); } else { switch(Color) { case 0 : ReadOldL&=(~(0x01<<(15-Tier_bit))); break ; case 1 : ReadOldL|=(0x01<<(15-Tier_bit)); break ; case 2 : ReadOldL^=(0x01<<(15-Tier_bit)); break ; default : break ; } write_data(ReadOldH); write_data(ReadOldL); } write_com(0x30); } void delay_18B20(unsigned int i)//延时1微秒 { while(i--); } void ds1820rst()/*ds1820复位*/ { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd()/*读数据*/ { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar wdata)/*写数据*/ { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } read_temp1()/*读取温度值并转换*/ { ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst(); } read_temp2() { uchar a,b; ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else { tvalue=~tvalue+1; tflag=1; } tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); } /*******************************************************************/ void ds1820disp1()//温度值显示 { uchar flagdat; disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30;//个位数 disdata[3]=tvalue%10+0x30;//小数位 if(tflag==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号:- if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) { disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } } void ds1820disp2() { lcd_delay(5); write_com(0x98); hzkdis("温度:"); lcd_delay(50); write_com(0x9b); write_data(disdata[1]); write_com(0x9c); write_data(disdata[2]); write_com(0x9d); write_data(0x2e); write_com(0x9e); write_data(disdata[3]); write_com(0x9f); hzkdis("℃"); lcd_delay(50); new_t=disdata[1]*10+disdata[2]; } void delaynms(uint us) //delay time { while(us--); } |
|
|
|
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
3586 浏览 1 评论
1635 浏览 0 评论
3468 浏览 1 评论
【⌈嵌入式机电一体化系统设计与实现⌋阅读体验】+磁力输送机系统设计的创新与挑战
1746 浏览 0 评论
4396 浏览 2 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 16:40 , Processed in 1.904951 second(s), Total 74, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号