信息技术教学网站开发,网站设置保存登录密码怎么取消,商品网站源码,杭州杭州网站建设公司一、系统方案
本设计采用52单片机作为主控器#xff0c;液晶1602显示#xff0c;DS18B20检测温度#xff0c;电流检测。 二、硬件设计
原理图如下#xff1a; 三、单片机软件设计
1、首先是系统初始化
void lcd_init() //lcd 初始化设置子函数#xff0c;不带参数 ,0x… 一、系统方案
本设计采用52单片机作为主控器液晶1602显示DS18B20检测温度电流检测。 二、硬件设计
原理图如下 三、单片机软件设计
1、首先是系统初始化
void lcd_init() //lcd 初始化设置子函数不带参数 ,0x38 是显示模式设置 , 其余是显示开 / 关及光标设置无顺序{delay1ms(15);wr_com(0x38); // 调用写控制指令子函数并用实参 0011 1000 代替形参 com//0x38 表示设置为 16*2 显示每个块为 5*7 点阵 8 位数据接口delay1ms(5);wr_com(0x08); // 调用写控制指令子函数并用实参 0000 1000 代替形参 com//0x08 表示设置为关显示、不显示光标、光标不闪烁delay1ms(5);wr_com(0x01); // 调用写控制指令子函数并用实参 0000 0001 代替形参 com//0x01 表示显示数据清屏数据指针清 0所有显示清 0delay1ms(5);wr_com(0x06);// 调用写控制指令子函数并用实参 0000 0110 代替形参 com//0x06 表示当读或写一个字符后地址指针加 1且光标加 1; 当写一个字符时整屏显示不移动delay1ms(5);wr_com(0x0c);// 调用写控制指令子函数并用实参 0000 1100 代替形参 com//0x0c 打开显示、不显示光标、光标不闪烁delay1ms(5);}
2、液晶显示程序
void wr_com(uchar com) //lcd 写控制指令子函数形参为 com{delay1ms(1); // 调用延时子函数并用实参 1 代替延时子函数中的形参 msRS0; //RS0 进入写命令状态即一些 LCD设置命令RW0; //RW0 为写模式EN0; //EN0 时不能完成写操作P2com; // 把要设置的指令码 com送给 P2 口delay1ms(1);EN1; // 给 EN一个高脉冲将数据送入液晶控制器完成写操作delay1ms(1);EN0; }//EN0 时不能完成写操作/******************检测忙标志函数***************************/void check_busy(void){uchar dt;do{dt0xff;EN0;RS0;RW1;EN1;dtP2;}while(dt0x80);EN0;}//*****************写数据*******************************/void wr_dat(uchar dat) //lcd 写显示数据子函数形参为 dat{/* check_busy();*/delay1ms(1);RS1; //RS1 进入写数据状态即要显示的内容RW0; //RW0 为写模式EN0; //EN0 时不能完成写操作P2dat; // 把要显示的数据 dat 送给 P2 口delay1ms(1);EN1; // 给 EN一个高脉冲将数据送入液晶控制器完成写操作delay1ms(1);EN0; //EN0 时不能完成写操作}
3、DS18B20程序
/********************************************************//********************ds18b20 程序 ***********************/void delay_18b20(uint i) // 延时 1 微秒{while(i--);}void ds18b20rst() //ds18b20 初始化子函数// 要求数据线拉高 - 延时 - 数据线拉低 - 延时大于 480 微妙 -数据线拉高 - 延时等待 {uchar x0;DQ 1; // 信号线 DQ复位delay_18b20(4); // 延时DQ 0; //DQ 拉低delay_18b20(100); // 精确延时大于 480usDQ 1; // 拉高delay_18b20(40);}void ds18b20wr(uchar wdata) /* 写数据子函数 , 无返回值含参数 */{uchar i0;for (i8; i0; i--)// 要写完一个字节故需要重复 8 次以下操作{DQ 0; // 数据线拉低DQ wdata0x01;//wdata 是一个形参将其与 0000 0001 进行按位与// 按从低到高的顺序发送数据一次发送一位 )delay_18b20(10);DQ 1; // 最后将数据线拉高wdata1; // 将 wdata 右移 1 位}}uchar ds18b20rd() // 读数据子函数 , 是有返回值 dat{uchar i0;uchar dat 0;for (i8;i0;i--)// 要读完一个字节故需要重复 8 次以下操作{DQ 0; // 给脉冲信号dat1;DQ 1; // 给脉冲信号if(DQ)dat|0x80;delay_18b20(10);}return(dat); // 返回 dat}read_temp() // 读取温度值并转换的子函数有返回值温度值 tvalue{uchar a,b;ds18b20rst(); // 调用 ds18b20 初始化子函数ds18b20wr(0xcc);// 调用写数据子函数向 ds18b20 写命令 0xcc//ccH 表示跳过 ROM读序列号适用于单机工作直接向 18b20 发送温度变换命令ds18b20wr(0x44);// 调用写数据子函数向 ds18b20 写命令 0x44//44H 表示启动 ds18b20 温度转换 , 结果自行存入 9 字节的 RAM中ds18b20rst(); // 调用 ds18b20 初始化子函数ds18b20wr(0xcc);// 同上ds18b20wr(0xbe);// 调用写数据子函数向 ds18b20 写命令 0xbe//beH 表示读取 RAM中 9 字节的温度数据ads18b20rd(); // 调用读数据子函数并将所得数据给 abds18b20rd(); //tvalueb; // 把 b 的值给 tvaluetvalue8; //tvalue 左移 8 位tvaluetvalue|a;//tvalue 与 a 进行按位或if(tvalue0x0fff)//tflag0; // 前五位为 0 时读取的温度为正标志位为 0此时只要// 将测得数值乘以 0.0625 即可得到实际温度else // 前五位为 1 时读取的温度为负标志位为 1此时需要{ // 将测得数值取反后再加 1再乘以 0.0625 即可得到实际温度tflag1; // 此时表示负温度tvalue~tvalue1;}tvaluetvalue*(0.625);// 温度值扩大 10 倍精确到 1 位小数return(tvalue); // 返回温度值}/**********************************************************//************************ 温度值显示 *********************/void ds18b20disp() // 温度值显示{uchar flagdat;disdata[0]tvalue/10000x30; // 百位数disdata[1]tvalue%1000/1000x30;// 十位数disdata[2]tvalue%100/100x30; // 个位数disdata[3]tvalue%100x30; // 小数位if(tflag0)flagdat0x2b; // 正温度显示符号 :elseflagdat0x2d; // 负温度显示负号 :-if(disdata[0]0x30){disdata[0]0x20; // 如果百位为 0不显示if(disdata[1]0x30){disdata[1]0x20; // 如果百位为 0十位为 0 也不显示}}wr_com(0x800x46); // 定位数据指针的位置第二行第五个字符处wr_dat(flagdat); // 显示符号位wr_com(0x800x47); // 定位数据指针的位置第二行第六个字符处wr_dat(disdata[0]); // 显示百位wr_com(0x800x48); // 定位数据指针的位置第二行第七个字符处wr_dat(disdata[1]); // 显示十位wr_com(0x800x49); // 定位数据指针的位置第二行第八个字符处wr_dat(disdata[2]); // 显示个位wr_com(0x800x4A); // 定位数据指针的位置第二行第九个字符处wr_dat(0x2e); // 显示小数点wr_com(0x800x4B); // 定位数据指针的位置第二行第十个字符处wr_dat(disdata[3]); // 显示小数位/**********************显示摄氏度************************/wr_com(0x800x4C); // 定位数据指针的位置第二行第十一个字符处wr_dat(0XDF);wr_com(0x800x4D); // 定位数据指针的位置第二行第十二个字符处wr_dat(0X43);}
4、核心算法程序
uint ReadADC_TLC1543(uchar ain){uchar t;uint adc_value 0;ain 4;CS_1543 0;for (t 0; t 10; t) // 将判断语句改为 temp12{ // 程序可移殖至 TLC2543.adc_value 1;ain 1;ADDR_1543 CY;if (DOUT_1543) adc_value 1;SCLK_1543 1;delayus(1);SCLK_1543 0;}CS_1543 1;return adc_value;}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况这样就可以通过软件仿真来验证我们设计的方案有没有问题如果有问题可以重新选择器件连接器件直到达到我们设定的目的避免我们搭建实物的时候如果当初选择的方案有问题我们器件都已经焊接好了再去卸载下去再去焊接新的方案的器件测试这样会浪费人力和物力也给开发者带来一定困惑Proteus仿真软件就很好的解决这个问题我们在设计之初就使用该软件进行模拟仿真测试选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸焊接实物调试最终完成本设计的作品。 资料扣作者