《长春工业大学生产实习水温控制系统.docx》由会员分享,可在线阅读,更多相关《长春工业大学生产实习水温控制系统.docx(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、总程序#include#define uchar unsigned char# define uint unsigned int# define comm 0指令# define dat 1数据/*MAX186相关函数声明*/sbit maxl86_CLK=PlA0;/ 186 的 19 弓| 脚sbit maxl86_CS=PlAl;/ 186 的 18 引脚sbit maxl86_DIN=PlA2; / 186 的 17 弓|脚sbit maxl86_DOUT=PlA3; / 186 的 15 弓| 脚int ad;uchar qw,ad_high,ad_highl,ad_low,adjo
2、wl,cai; 温度的十位 个位 小数 点后两位定时变量caiuint addata;uchar i;uint adl86(uchar);void maxl86_ad();void delay(uchar ms);void maxl86_adl();/*输入选择的模式*/ AD转换子程序延时程序/*DS1302相关函数声明char TAB_1302= 0x53,0x58,0x23, / 秒分时 0x31,0x12,0x02,0x13; /H 星期年sbit T_CLK=P2A5; /DS1302 时钟 sbitT_IO=P2A6; /DS1302 数据口 sbit T_RST=P2A7; /D
3、S1302 复位uchar bdata datbyte;uchar ge,shi,gel,shil,ge2,shi2,ge3,shi3zge4,shi4,ge5,shi5;sbit datbyteO=datbyteAO;sbit datbyte7=datbyteA7;void w_1302byte(uchar date);void get_1302(void);void init_1302(void);uchar r_1302byte(void);写数据读数据初始化1302读1字节void write_1302(uchar addr;uchar date);写一字节uchar read_130
4、2(uchar addr);/*DS1302 结束*/11.0592M IMS/11.0592M lus基本指令清屏开显示,关游标函数名称:void get_1302(void)功能说明:读取DS1302时钟信息.void get_1302(void) uchar i,addr=0x81;for(i=0;i0;i-);)void delayus (uint us)(while(us-);)/*12864 初始化*/void init_lcd(void)(wr_lcd (comm,0x30);wr_lcd (comm,0x01); delayus(lOO);wr_lcd (comm,0x06);
5、wr_lcd (comm,0x0c);) void wrjcd (uchar dat-comm,uchar content) /LCD 写数据uchar a,ij;delayus(50);a=content;指令或者数据cs=l;发数据sclk=O;std=l;for(i=0;i5;i+) 发5个1作为数据起始位(sclk=l;sclk=O;)std=O;sclk=l;sclk=O;if(dat_comm)std=l;elsestd=O;sclk=l;sclk=O;std=O;sclk=l;sclk=O;for(j=0;j2;j+)(for(i=0;i4;i+)发第六位R/W=O写数据第七位数
6、据还是指令第八位0数据的留两个字节分开发两次a=al;std=CY;sclk=l;sclk=O;)std=O;for(i=0;i0)(wrjcd(dat,*p);P+;)/*12864*/*MAX186*/ void delay(uchar ms)/*maxl86选择通道模式设置,及数据的读uchar i;while(ms-) for(i=0;i200;i+) ()uint adl86(uchar ss)(uchar i,kki,s;uint i_data,i_datatransfer; switch(ss)(case 0:s=0x8e;break;case 1: s=OxCE;break;c
7、ase 2: s=0x9E;break;case 3: s=OxDE;break;case 4: s=OxAE;break;case 5: s=OxEE;break;case 6: s=OxBE;break;case 7: s=OxFE;break;default:s=OxAE;break;maxl86 CS=1;maxl86 CLK=O;maxl86 CS=O;maxl86 CLK=O;for(i=0;i8;i+)(uchar adaddresstransfer;adaddresstransfer=s;adaddresstransfer=(adaddresstransfer(7-i)&0x0
8、1; maxl86_DIN=adaddresstransfer;maxl86 CLK=1;for(kki=0;kki2;kki+);maxl86 CLK=O;maxl86 CS=1;for(i=0;i6;i+);maxl86 CS=O;maxl86 CLK=1;for(i=0;i12;i+)(maxl86_CLK=l;maxl86_CLK=0;i_datatransfer=maxl86_DOUT;i_datatransfer=i_datatransfer(ll-i);i_data=i_data | i_datatransfer;addata=i_data;for(i=0;i4;i+)(maxl
9、86_CLK=l;maxl86_CLK=0;maxl86 CS=1;i data=i datatransfer=O;delay(5);return(addata);AD转换及显示相应LCD地址void maxl86_ad()(ad=adl86(0);ad=ad*2.44;温度是 100,对应 4.096V 字节 4096,即(100/4096)*ad代表输出的温度ad_high=ad/1000;delay ;ad_highl=ad%1000/100;delay ;adjow=ad%1000%100/10;delay ;wr_lcd (comm,0x98);LCDSendWord(“温”);wr
10、_lcd (comm,0x99);LCDSendWord(“度”);wr_lcd (comm,0x9a);LCDSendWord(:n);wr_lcd (comm,0x9b);wr_lcd (dat,0x30+ad_high);温度十位wr_lcd (dat,0x30+ad_highl);温度个位wr_lcd (comm,0x9c);LCDSendWord(,);wr_lcd (comm,0x9d);wr_lcd (dat,0x30+adjow); 温度小数点后一位wr_lcd (comm,0x9E);LCDSendWord(,M);/*12864相关函数声明 sbit cs=P2A2;sbi
11、t std=P2Al;sbit sclk=P2A0;void initjcd(void);/LCD 初始化void wr_lcd (uchar dat_comm,uchar content); /LCD 写数据void Delayms (uchar a);ll,0592 晶振 IMSvoid delayus (uint us);/11.0592 晶振 lusvoid LCDSendWord(unsigned char *p);/12864 显示汉字void disp(void);void year(void); void month(void); void day(void); void ho
12、ur(void); void minute(void); void second(void); void third(void);/*继电器*/ sbit PWM=P0A7;float temp=50; void control(void); float tempce;bit F;uint timepwm;/*void main(void)init_lcd(); init_1302();Delayms ; ad=adl86(0); maxl86_ad();Delayms ;EA=0;TMOD=OX11;显示函数年月日时分秒/P1.7 0 导通 P1.7 1 关温度设定值温度限制程序获得的当前温
13、度显示186的标记位/PWM频率初始化LCD初始化1302延时5ms先显示一次当前温度延时3msTH0=(65535-50000)/256; /TO 50msTL0=(65535-50000)%256;ETO=1;ET1=1;TRO=1;TR1=1;PTO=1;开定时器0EA=1;开总中断PWM=1;最起先关闭继电器while(l)(get_1302();读 1302disp();显示ad=adl86(0);if(F=l)/Is显示一次读取的温度(maxl86_ad();F=0;control();void control(void)(ad=adl86(0);ad=ad*2.44;温度是 10
14、0,对应 4.096V 字节 4096,即(100/4096)*ad代表输出的温度ad_high=ad/1000;delay ;ad_highl=ad%1000/100;delay ;adjow=ad%1000%100/10;delay ;tempce=ad_high*10+ad_high+adjow/10; 获得当前温度值if(tempce(temp-5)温差大于 5之间timepwm=10000;)if(tempce(temp-5)温差在3-5之间timepwm=7000;)if(tempce(temp-3)(timepwm=6000;)if(tempce(temp-2)(timepwm=
15、4000;)if(tempce(temp-l)( timepwm=2000;)if(tempce(temp-0.1)( PWM=O;关加热 TR1=O;) else TR1=1; ) void timeO (void) interrupt 1 using 1 (TLO = (65536-50000)%256;THO = (65536-50000)/256;cai+;if(cai=60) 度温差在2-3之间温差在2-3之间温差在之间/50ms 定时器0设置定时初值设置定时初值计20次满1s显示一次读取的温F=l; cai=0;)void timel (void) interrupt 3 usin
16、g 2 (TF1=O;TLl=(65536-timepwm)%256;THl=(65536-timepwm)/256;qw+;if(qw=30)(PWM=PWM;qw=O;)void disp(void)(year(); month(); day();hour(); minute(); second();third();)void third(void)(wr_lcd (comm,0x88); LCDSendWord(设”); wr_lcd (comm,0x89); LCDSendWord(”定”); wr_lcd (comm,0x8a); LCDSendWord(“温”); wr_lcd (
17、comm,0x8b);显示程序第三行显示设定温度值显示的地址显示的汉字LCDSendWord(度”); wr_lcd (comm,0x8c); LCDSendWord(,1:M); wr_lcd (comm,0x8d);wr_lcd (dat,5+0x30);wr_lcd (dat,0+0x30);wr_lcd (comm,0x8e);LCDSendWordC1.);wr_lcd (comm,0x8d);wr_lcd (dat,0+0x30);)void year(void)(shi=TAB_13026/10;ge=TAB_13026%10;wr_lcd (comm,0x81);wr_lcd
18、(dat,shi+0x30);wr_lcd (dat,ge+0x30);wr_lcd (comm,0x82);LCDSendWord(年”);)void month(void) (shil=TAB_13024/10;gel=TAB_13024%10;wr_lcd (comm,0x83);wr_lcd (dat,shil+0x30);wr_lcd (dat,gel+0x30);wr_lcd (comm,0x84);LCDSendWordC1月);)void day(void)(shi2=TAB_13023/10;ge2=TAB_13023%10;wr_lcd (comm,0x85);wr_lcd
19、 (dat,shi2+0x30);wr_lcd (dat,ge2+0x30);wr_lcd (comm,0x86);LCDSendWord( H);void hour(void)(shi3=TAB_13022/10;ge3=TAB_13022%10;wr_lcd (comm,0x91);wr_lcd (dat,shi3+0x30);wr_lcd (dat,ge3+0x30);wr_lcd (comm,0x92);LCDSendWord(时”);)void minute(void)shi4=TAB_1302l/10;ge4=TAB_1302l%10;wr_lcd (comm,0x93);wr_l
20、cd (dat,shi4+0x30);wr_lcd (dat,ge4+0x30);wr_lcd (comm,0x94);LCDSendWord(分);void second(void)shi5=TAB_13020/10;ge5=TAB_13020%10;wr_lcd (comm,0x95);wr_lcd (dat,shi5+0x30);wr_lcd (dat,ge5+0x30);wr_lcd (comm,0x96);LCDSendWord(“秒”);)/*以下为DS1302相关函数*/t t函数名称:void w_1302byte(uchar date)函数功能:写一个字节(上升沿)void
21、w_1302byte(uchar date) uchar i;datbyte=date;for(i=0;i8;i+)T_IO=datbyteO;T CLK=O;T_CLK=1; datbyte=l;) ,dj ,函数名称:uchar r_1302byte(void)函数功能:读一个字节(下降沿)uchar r_1302byte(void) uchar i;datbyte=O;for(i=0;i8;i+)datbyte7=T_IO;T_CLK=1;T_CLK=O;datbyte=l;)return(datbyte);)f f函数名称:void write_1302(uchar addr,ucha
22、r date)函数功能:指定位置写数据void write_1302(uchar adduchar date) T_RST=0;T_CLK=0;T_RST=1;w_1302byte(addr);w_1302byte(date);T CLK=O;T RST=0;, f*fJ T *T*函数名称:uchar read_1302(uchar addr)函数功能:指定位置读数据uchar read_1302(uchar addr) uchar datl,dat2,temp;T RST=0;T_CLK=O;T RST=1;w_1302byte(addr);temp=r_1302byte();T_RST=0;T CLK=O;datl=temp/16;dat2=temp%16;temp=datl*10+dat2;return(temp);), f函数名称:void init_1302(void)函数功能:初始化T1i* T1*void init_1302(void) uchar i;uchar addr=0x80;write_1302(0x8e,0x00);for(i=0;i7;i+) write_1302(addr,TAB_1302i);addr+=2;)write_1302(0x8e,0x80);)f f