资源描述
智能测控系统课程大作业作业题目 : 环境温度测量及湿度检测 学院名称 : 电气工程学院 专业班级 : 测控1303班 学生姓名 : 杜栋梁 学 号 : 23030320 完毕时间: -6 任课教师 : 王威 目录1 课程大作业内容21.1 课题设计背景21.2 课题设计的意义31.3 设计目的32 系统设计方案32.1 温湿度传感器选型与论证42.2 显示屏的选择与论证42.2 信号采集电路52.3 供电电源的选择63 硬件设计63.1 构造框图73.2 温度信号采集电路73.2.1传感器简介73.3单片机的最小电路图84 软件设计94.1 程序模块94.2 软件设计流程图105调试106总结11参照文献11附件12程序12 1 课程大作业内容1.1 课题设计背景随着科技的发展对对检测技术规定的不断增高,迫使新材料的开发及寻找检测能力的不断提高。传感器的种类与测量精度以及测量稳定性也发生了巨大的变化,从最初的接触式测温到非接触式测温,膨胀式、热电阻式以及热电偶式测温,使温度检测领域得到了迅速发展。再加上单片机技术的不断发展,测量检测变得更加以便。温湿度传感器除电阻式、电容式湿敏元件之外,尚有电解质离子型湿敏元件、重量型湿敏元件(运用感湿膜重量的变化来变化振荡频率)、光强型湿敏元件、声表面波湿敏元件等。湿敏元件的线性度及抗污染性差,在检测环境湿度时,湿敏元件要长期暴露在待测环境中,很容易被污染而影响其测量精度及长期稳定性。在公共工作场合为了达到让人感到舒服的环境温度及湿度,往往需要对温度、湿度进行检测已达到最佳的效果。本课题以ds18b20温度传感器为温度检测器件,设计了一种对单点温度实时检测的单片机温度检测系统。以bsp_dht11湿度传感器为湿度检测器件。1.2 课题设计的意义(1)、该设计具有如下长处:制作简朴,便于使用,价格便宜,稳定可靠,功耗低省电。(2)通过设计与制作可以达到这些目的:熟悉MSP430单片机技术的应用范畴;掌握MSP430单片机编程的特点,提高实践操作能力可以在制作过程中发现并改正错误。达到一定的解决问题的能力。提高了动手的能力。1.3 设计目的使用ds18b20温度传感器测量环境温度并完毕A/D转换。bsp_dht11湿度传感器测量湿度,把数据发送到MSP430中进行转换用LCD进行显示。2 系统设计方案系统设计方案的选择是决定设计作品完整度与精度的重要前提,一种好的作品的完毕需要选择比较多种方案,从多种方案中选择最优方案,才干使设计作品精度更高。本次设计重要从实用性,稳定性,精度级别,可靠性,经济性等方面进行考虑。在完毕本次课程设计规定、目的的状况下尽量的精确和经济的条件下进行选择。2.1 温湿度传感器选型与论证本设计采用测量精度高,性能稳定可靠的ds18b20温度传感器作为温度检测器件和bsp_dht11温湿度传感器作为湿度监测器件。尽管bsp_dht11也可以检测出环境温度,但该传感器的测温范畴窄,精度不够,和规定测量的环境较为苛刻。因此选用较为精确的ds18b20来测量温度。该传感器具有适应性强检测迅速,受环境影响较小。且对温度可以接触和非接触测量均可。而其她传感器价格和测量条件较为苛刻因此不建议选用。2.2 显示屏的选择与论证方案一:采用LCD1602显示。LCD1602是一种专门用于显示字母、数字、符号等点阵式LCD,可以同步显示16x02即32个字符。它由若干个5X7或者5X11等点阵字符位构成,每个点阵字符位都可以显示一种字符,每位之间有一种点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。由于它不能显示中文,而温度湿度的显示需要显示中文,因此此方案不可行。方案二:采用LCD5110显示。LCD5110采用串行接口与主解决器进行通信,接口信号线数量大幅度减少,支持多种串行通信合同,传播速率高达4Mbps,可全速写入显示数据,无等待时间。它由84x48的点阵LCD构成,可显示中文和字符。LCD5110工作电压3.3V,正常显示时工作电流200uA如下,并且接口简朴,体积小便于安装携带,速度快,价格便宜。因此采用此方案,显示模块选择用LCD 5110。但屏幕色彩较暗,在光线较强的地方无法清晰的辨别。方案三:采用TFT彩屏显示。TFT-LCD采用低压应用,低驱动电压,固体化使用安全性和可靠性提高;平板化,又轻薄,节省了大量原材料和使用空间;低功耗,它的功耗约为CRT显示屏的十分之一,反射式TFT-LCD甚至只有CRT的百分之一左右,节省了大量的能源;高亮度,高对比度,高响应速度。无辐射、无闪烁,对使用者的健康无损害。合用范畴宽,从-20到+50的温度范畴内都可以正常使用,寿命超过3万小时,且价格便宜因此本次设计采用TFT-LCD作为显示屏。2.2 信号采集电路ds18b20是一种64 位只读存储器储存器件的唯一片序列号。高速暂存器具有两个字节的温度寄存器,这两个寄存器用来存储温度传感器输出的数据。除此之外,高速暂存器提供一种直接的温度报警值寄存器(TH和TL),和一种字节的配备寄存器。配备寄存器容许顾客将温度的精度设定为9,10,11 或12 位。TH,TL 和配备寄存器是非易失性的可擦除程序寄存器(EEPROM),因此存储的数据在器件掉电时不会消失。ds18b20通过达拉斯公司独有的单总线合同依托一种单线端口通讯。当所有器件经由一种3态端口或者漏极开路端口(DQ引脚在ds18b20上的状况下)与总线连接的时候,控制线需要连接一种上拉电阻。在这个总线系统中,微控制器(主器件)依托每个器件独有的64位片序列号辨认总线上的器件和记录总线上的器件地址。由于每个装置有一种独特的片序列码,总线可以连接的器件数目事实上是无限的。ds18b20的另一种功能是可以在没有外部电源供电的状况下工作。当总线处在高电平状态,DQ与上拉电阻连接通过单总线对器件供电。同步处在高电平状态的总线信号对内部电容(Cpp)充电,在总线处在低电平状态时,该电容提供能量给器件。这种提供能量的形式被称为“寄生电源”。作为替代选择,ds18b20同样可以通过VDD引脚连接外部电源供电。如下图2.1s18b20的工作原理图2.1顾客单片机发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出 40bit 的数据,并触发一次信采集。信号发送如图所示。数据时序图2.2bsp_dht11时序原理图2.22.3 供电电源的选择本设计采用原则USB数据线5V为该设计供电。3 硬件设计硬件电路的设计是该系统重要的部分,是系统运营的前提,如果硬件设计的科学合理就能大大增长该系统功能的稳定性,可靠性。系统软件的设计是以硬件设计为前提,硬件设计是单片机高效工作的前提与重要保障,但是只有软件和硬件都对的,并且软件与硬件可以互相兼容、协调工作才干使系统工作达到我们想要的效果。本系统的硬件设计部分重要涉及传感器电桥电路设计、运算放大电路的设计、单片机最小系统设计下面进行具体简介。3.1 构造框图 本设计采用均采用3.3V电源供电,温度传感器和温湿度传感器采集到数据后发送到单片机,单片机根据接受到的数据进行解决后再LCD屏幕上显示。如图3.1位系统构造框图。图3.1 系统构造框图3.2 温度信号采集电路温度信号的获取关系到后续电路设计的难度,因此温度信号是获取是本设计的核心。3.2.1传感器简介ds18b20的简介:独特的单线接口仅需一种端口引脚进行通讯每个器件有唯一的64 位的序列号存储在内部存储器中简朴的多点分布式测温应用无需外部器件可通过数据线供电。供电范畴为3.0V到5.5V测温范畴为-55125(67257)在1085范畴内精确度为5温度计辨别率可以被使用者选择为912位最多在750ms 内将温度转换为12 位数字顾客可定义的非易失性温度报警设立报警搜索命令辨认并标志超过程序限定温度(温度报警条件)的器件与ds1822兼容的软件应用涉及温度控制、工业系统、消费品、温度计或任何热感测系统bsp_dht11的简介:DATA 用于微解决器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,目前小数部分用于后来扩展,现读出为零.操作流程如下:一次完整的数据传播为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据 +8bit校验和数据传送对的时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得成果的末8位。实际使用时发现小数位都是0,这一步忽视对成果也不导致影响。3.3单片机的最小电路图MSP430g2553简介:MSP430G2553性能参数(DIP-20) 工作电压范畴:1.83.6V。5种低功耗模式。16位的RISC构造,62.5ns指令周期。超低功耗运营模式-230A;待机模式-0.5A;关闭模式-0.1A;可以在不到1s的时间里超迅速地从待机模式唤醒。基本时钟模块配备:具有四种校准频率并高达16MHz的内部频率;内部超低功耗LF振荡器;32.768KHz晶体;外部数字时钟源。两个16 位Timer_A,分别具有三个捕获比较寄存器。用于模拟信号比较功能或者斜率模数(A/D)转换的片载比较器。带内部基准、采样与保持以及自动扫描功能的10位200-ksps 模数(A/D)转换器。16KB闪存,512B的RAM。16个I/O口。这里给出了本次实验的最小电路图3.1最小电路图3.14 软件设计4.1 程序模块本装置重要用到MSP430g2553单片机的IO功能程序设计中重要涉及:1. 单片机对温度传感器的数据接受模块。2. 单片机对温湿度传感器的数据接受模块。3. 对LCD屏的显示模块。4.2 软件设计流程图图4.1软件流程图5调试本次设计最重要的工作之一就是对系统的调试部分,由于一种测量显示软件的重要功能就是显示对的的成果。开始显示的数据会由于采集的不精确和其她方面的误差导致接受到的数据不能对的表达想要的得到的数据,也也许会由于采集过程浮现频繁的错误等问题。因此调试的工作极其重要,在温度传感器的采集过程中通过和原则的温度值的校准,测出了误差的范畴和误差的大体规律最后在现实过程中消除了这种误差让温度测量更加精确稳定。在湿度传感器的调试过程中的工作更是复杂,湿度传感器可以返回温度和湿度值,但通过检测返回的温度值与实际的温度值偏差较大,而湿度的计算措施是在该温度条件下的空气中水含量的多少,这就使得测得的温度不准导致湿度不精确,最后查阅资料找到了湿度的测量计算措施。将返回的湿度值加权后再显示出来。这些工作很复杂湿度传感器的工作规定的时序很高就导致在时序配备上要花很大功夫一点不对就不能返回对的的成果屡屡出错。总之调试工作发杂多变。6总结本次设计的东西看起来很简朴,仿佛没有什么技术含量。但当实际操作时想要完美的运营却遇到了重重的困难。由于MSP430是开始接触的单片机,之前也始终没有做过有关它的太多实验。修改驱动显示屏程序也耗费了很长时间才将本来51单片机的程序移植过来,成果刷屏与显示与想要显示的位置不符,后来请教同窗计算了LCD的显示位置才更改正来。接下来的湿度调试,由于开始找不到bsp_dht11温湿度传感器的原理图就在网上找了有关它的程序成果发现不能用不管怎么更改总是无法返回对的的数值,最后终于找到了有关该传感器的具体资料。发现该传感器的工作规定对时序的规定特别严格,最后精确计算了延时时间并且进行了延时时间的修改才干返回成果。但得到的湿度值与正常的湿度值存在较大的偏差,但没有原则湿度值可以进行比较于是选用了天气预报软件上面发布的湿度值进行校准。 由于这次作业选用的是模块化的传感器且传感器对电压的规定不太严格3.0V5.0V均可以,为了减少设计设计的复杂度就选用了给单片机供电的3.3V电压作为传感器和显示屏的供电电压。本次对单片机的实际制作成东西才感到动手的重要性,和某些看起来简朴的东西也许不那么简朴。在后来的学习中要增长动手的能力。参照文献1 杨家成单片机原理与应用及C51程序设计北京:清华大学出版社,2 夏路易 石宗义Protel 99se电路原理图与电路板设计教程北京:北京但愿电子出版社,3 李林功单片机原理与应用基于实例驱动和Proteus仿真北京:科学出版社,4 皮大能等. 单片机课程设计指引书. 北京:北京理工大学出版社,5 MSP430单片机C语言应用程序设计实例精讲 电子工业出版社 .05附件程序主程序#include #include font.h#include sys.h#include lcd.h#include ds18b20.h#include dht11.hvoid CLK_Init(void) /时钟配备 if (CALBC1_16MHZ =0xFF | CALDCO_16MHZ = 0xFF) while(1); / If calibration constants erased / do not load, trap CPU! DCOCTL=0; BCSCTL1 = CALBC1_16MHZ; / Set range DCOCTL = CALDCO_16MHZ; / Set DCO step + modulation */ BCSCTL2 |= 0X06; /SMCLK为DCO的8分频,2Mvoid showjiemian() /界面显示LCD_Fill(0,0,128,40,WHITE);/在指定区域填充颜色showhanzi(0,4,0);showhanzi(32,4,1);showhanzi(64,4,2);showhanzi(96,4,3);/环境监测LCD_ShowString(100,68,%);/%:showhanzi1(14,42,0,RED,YELLOW);showhanzi1(34,42,1,RED,YELLOW);/温度showhanzi1(100,42,2,BLUE,YELLOW);/showhanzi1(14,68,3,RED,YELLOW);showhanzi1(34,68,4,RED,YELLOW);/湿 度LCD_ShowString(56,42,); /温度显示LCD_ShowChar(72,42,.,0);LCD_ShowString(70,68,); /湿度显示int main(void) WDTCTL = WDTPW | WDTHOLD;/ Stop watchdog timer unsigned int temp=0,temp1,temp2,temp3; /ucharRH_data_H = 0; P2DIR |= 0x1f;/设立P2为输出方式输出方式 P2OUT |= 0X1f; BACK_COLOR=YELLOW; POINT_COLOR=BLUE; /背景色,画笔色 CLK_Init(); Lcd_Init(); LCD_Clear(YELLOW); DHT11_IO_Init(); showjiemian(); while(1) temp=Read_Temp(); temp1=temp/100; temp2=temp%100/10; temp3=temp%10;LCD_ShowNum(56,42,temp1,2);/显示数字LCD_ShowNum(80,42,temp2,1);/显示数字LCD_ShowNum(88,42,temp3,1);/显示数字DHT11();LCD_ShowNum(88,68, ucharRH_data_H,3);delay_ms(1000);温度采集#include #include ds18b20.h#include sys.hvoid DS18B20_Init(void) /DS18B20初始化函数 DQ_OUT; DQ_L; /拉低总线 delay_us(480); /精确延时 不小于 480us DQ_H; /释放总线 delay_us(48); DQ_IN; DQ_OUT; DQ_H; delay_us(360);void DS18B20_WriteData(u8 dat)/写一种字节 u8 i; for(i=0;i=1; /准备下一位数据的传送 delay_us(50); DQ_H; /释放总线,等待总线恢复 delay_us(8); u8 DS18B20_ReadData(void) /读一种字节u8 i;u8 dat=0;for(i=0;i=1;/右移,准备接受新的数据位DQ_L; /拉低总线产生读信号delay_us(5);DQ_H; /释放总线准备读数据delay_us(5);/等待5微秒DQ_IN;/配备为输入,开始读取数据位_NOP();if(READ_DQ)/该位与否为高dat|=0x80;/是就将此位置高delay_us(50);/等待50微秒DQ_OUT;DQ_H;delay_us(5);return(dat);/将读到的一种字节返回u16 Read_Temp(void) /读取温度u16 temp_low,temp_high,d;float c;DS18B20_Init();/初始化,每次写命令都从初始化开始DS18B20_WriteData(0xcc); /跳过ROM命令DS18B20_WriteData(0x44); /温度转换命令DS18B20_Init();/初始化,每次写命令都从初始化开始DS18B20_WriteData(0xcc); /跳过ROM命令DS18B20_WriteData(0xbe); /temp_low=DS18B20_ReadData();/读温度低字节temp_high=DS18B20_ReadData();/读温度高字节temp_high=8;d=temp_high|temp_low;c=d*0.0625;d=(u16)(c*100);return(d); /返回16位变量湿度采集#includedht11.h#include sys.h#include unsigned int uchartemp;unsigned char ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata;unsigned char ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp;void DHT11_IO_Init() P1SEL &= BIT0;void COM(void)unsigned char i; unsigned char ucharFLAG; uchartemp=0; P1DIR &= BIT0; for(i=0;i8;i+) ucharFLAG=2; while(!(P1IN&0x01)&ucharFLAG+); delay_us(30); uchartemp=uchartemp18MS DATA_H; delay_us(30); P1DIR &= BIT0; if(!(P1IN&0x01) ucharFLAG=1; while(!(P1IN&0x01)&ucharFLAG+); ucharFLAG=1; while(P1IN&0x01)&ucharFLAG+); COM(); ucharRH_data_H_temp=uchartemp; COM(); ucharRH_data_L_temp=uchartemp; COM(); ucharT_data_H_temp=uchartemp; COM(); ucharT_data_L_temp=uchartemp; COM(); ucharcheckdata_temp=uchartemp; uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp); if(uchartemp=ucharcheckdata_temp) ucharRH_data_H=ucharRH_data_H_temp; ucharRH_data_L=ucharRH_data_L_temp; ucharT_data_H=ucharT_data_H_temp; ucharT_data_L=ucharT_data_L_temp; ucharcheckdata=ucharcheckdata_temp; else ucharRH_data_H=12; ucharT_data_H=23; /P2DIR |= BIT0;显示#include #include font.h#include sys.h#include lcd.hu16 BACK_COLOR, POINT_COLOR; /背景色,画笔色 void LCD_Writ_Bus(char da) /串行数据写入u8 i;for(i=0; i8; i+)if(da & 0x80)SDA_H;elseSDA_L;SCK_L;da 8);LCD_Writ_Bus(da); void LCD_WR_REG(char da) AO_L;LCD_Writ_Bus(da); void LCD_WR_REG_DATA(int reg,int da) LCD_WR_REG(reg);LCD_WR_DATA(da);void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2) LCD_WR_REG(0x2a); LCD_WR_DATA8(x18); LCD_WR_DATA8(x1); LCD_WR_DATA8(x28); LCD_WR_DATA8(x2); LCD_WR_REG(0x2b); LCD_WR_DATA8(y18); LCD_WR_DATA8(y1+32); LCD_WR_DATA8(y28); LCD_WR_DATA8(y2+32); LCD_WR_REG(0x2C);void Lcd_Init(void)/调用一次这些函数,免得编译的时候提示警告 CS_H;/*if(LCD_CS=0) LCD_WR_REG_DATA(0,0); LCD_ShowString(0,0, ); LCD_ShowNum(0,0,0,0); LCD_Show2Num(0,0,0,0); LCD_DrawPoint_big(0,0); LCD_DrawRectangle(0,0,0,0); Draw_Circle(0,0,0); */ REST_H; delayms(5);REST_L;delayms(5);REST_H;CS_H;delayms(5);CS_L; /打开片选使能LCD_WR_REG(0x11); /Sleep outdelayms(120); /Delay 120ms/-ST7735S Frame Rate-/LCD_WR_REG(0xB1);LCD_WR_DATA8(0x05);LCD_WR_REG(0x11);/Sleep exit delayms (120); /ST7735R Frame RateLCD_WR_REG(0xB1); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB2); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB3); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB4); /Column inversion LCD_WR_DATA8(0x07); /ST7735R Power SequenceLCD_WR_REG(0xC0); LCD_WR_DATA8(0xA2); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x84); LCD_WR_REG(0xC1); LCD_WR_DATA8(0xC5); LCD_WR_REG(0xC2); LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0x00); LCD_WR_REG(0xC3); LCD_WR_DATA8(0x8A); LCD_WR_DATA8(0x2A); LCD_WR_REG(0xC4); LCD_WR_DATA8(0x8A); LCD_WR_DATA8(0xEE); LCD_WR_REG(0xC5); /VCOM LCD_WR_DATA8(0x0E); LCD_WR_REG(0x36); /MX, MY, RGB mode LCD_WR_DATA8(0xC8); /ST7735R Gamma SequenceLCD_WR_REG(0xe0); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x1a); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x18); LCD_WR_DATA8(0x2f); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x20); LCD_WR_DATA8(0x22); LCD_WR_DATA8(0x1f); LCD_WR_DATA8(0x1b); LCD_WR_DATA8(0x23); LCD_WR_DATA8(0x37); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x10); LCD_WR_REG(0xe1); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x1b); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x17); LCD_WR_DATA8(0x33); LCD_WR_DATA8(0x2c); LCD_WR_DATA8(0x29); LCD_WR_DATA8(0x2e); LCD_WR_DATA8(0x30); LCD_WR_DATA8(0x30); LCD_WR_DATA8(0x39); LCD_WR_DATA8(0x3f); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0x10); LCD_WR_REG(0x2a);LCD_WR_DATA8(0x00);LCD_WR_DATA8(0x00);LCD_WR_DATA8(0x00);LCD_WR_DATA8(0x7f);LCD_WR_REG(0x2b);LCD_WR_DATA8(0x00);LCD_WR_DATA8(0x00);LCD_WR_DATA8(0x00);LCD_WR_DATA8(0x7f);LCD_WR_REG(0xF0); /Enable test command LCD_WR_DATA8(0x01); LCD_WR_REG(0xF6); /Disable ram power save mode LCD_WR_DATA8(0x00); LCD_WR_REG(0x3A); /65k mode LCD_WR_DATA8(0x05); LCD_WR_REG(0x29); /Display on LCD_WR_REG(0x2C);/清屏函数/Color:要清屏的填充色void LCD_Clear(u16 Color)u8 VH,VL;u16 i,j;VH=Color8;VL=Color;Address_set(0,0,LCD_W-1,160); for(i=0;iLCD_W;i+) for (j=0;jLCD_H;j+) LCD_WR_DATA8(VH); LCD_WR_DATA8(VL); /在指定位置显示一种中文(32*33大小)/dcolor为内容颜色,gbcolor为背静颜色void showhanzi(unsigned int x,unsigned int y,unsigned char index) unsigned char i,j;const unsigned char *temp=hanzi; Address_set(x,y,x+31,y+31); /设立区域 temp+=index*128;for(j=0;j128;j+)for(i=0;i8;i+) if(*temp&(1i)!=0)LCD_WR_DATA(POINT_COLOR); elseLCD_WR_DATA(BACK_COLOR); temp+; /在指定位置显示一种中文(16*16大小)/dcolor为内容颜色,gbcolor为背静颜色void showhanzi1(unsigned int x,unsigned int y,unsigned char index,u16 p_color,u16 b_color)unsigned char i,j;const unsigned char *temp=hanzi1;BACK_COLOR = b_color;POINT_COLOR = p_color; Address_set(x,y,x+15,y+15); /设立区域temp+=index*32;for(j=0;j32;j+)for(i=0;i8;i+) if(*temp&(1i)!=0)LCD_WR_DATA(POINT_COLOR);elseLCD_WR_DATA(BACK_COLOR);temp+; /画点/POINT_COLOR:此点的颜色void LCD_DrawPoint(u16 x,u16 y)Address_set(x,y,x,y);/设立光标位置 LCD_WR_DATA(POINT_COLOR); /画一种大点/POINT_COLOR:此点的颜色void LCD_DrawPoint_big(u16 x,u16 y)LCD_Fill(x-4,y-4,x+4,y+4,POINT_COLOR); /在指定区域内填充指定颜色/区域大小:/ (xend-xsta)*(yend-ysta)void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color) u16 i,j; Address_set(xsta,ysta,xend,yend); /设立光标位置 for(i=ysta;i=yend;i+) for(j=xsta;j0)incx=1; /设立单步方向 else if(delta_x=0)incx=0;/垂直线 else incx=-1;delta_x=-delta_x; if(delta_y0)incy=1; else if(delta_y=0)incy=0;/水平线 elseincy=-1;delta_y=-delta_y; if( delta_xdelta_y)distance=delta_x; /选用基本增量坐标轴 else distance=delta_y; for(t=0;tdistance) xerr-=distance; uRow+=incx; if(yerrdistance) yerr-=distance; uCol+=incy; /画矩形void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)LCD_DrawLine(x1,y1,x2,y1);LCD_DrawLine(x1,y1,x1,y2);LCD_DrawLine(x1,y2,x2,y2);LCD_DrawLine(x2,y1,x2,y2);/在指定位置画一种指定大小的圆/(x,y):中心点/r :半径void Draw_Circle(u16 x0,u16 y0,u8 r)int a,b;int di;a=0;b=r; di=3-(r1); /判断下个点位置的标志while(a=b)LCD_DrawPoint(x0-b,y0-a); /3 LCD_DrawPoint(x0+b,y0-a); /0 LCD_DrawPoint(x0-a,y0+b); /1 LCD_DrawPoint(x0-b,y0-a); /7 LCD_DrawPoint(x0-a,y0-b); /2 LCD_DrawPoint(x0+b,y0+a); /4 LCD_DrawPoint(x0+a,y0-b); /5LCD_DrawPoint(x0+a,y0+b); /6 LCD_DrawPoint(x0-b,y0+a); a+;/使用Bresenham算法画圆 if(di/mode:叠加方式(1)还是非叠加方式(0)/在指定位置显示一种字符/num:要显示的字符: -/mode:叠加方式(1)还是非叠加方式(0)void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode) u8 temp; u8 pos,t;u16 x0=x;u16 colortemp=POINT_COLOR; if(xLCD_W-16|yLCD_H-16)return; /设立窗口 num=num- ;/得到偏移后的值Address_set(x,y,x+8-1,y+16-1); /设立光标位置 if(!mode) /非叠加方式for(pos=0;pos16;pos+) temp=asc2_1608(u16)num*16+pos; /调用1608字体for(t=0;t=1; x+; x=x0;y+;else/叠加方式for(pos=0;pos16;pos+) temp=asc2_1608(u16)num*16+pos; /调用1608字体for(t=0;t=1; POINT_COLOR=colortemp; /mn函数u32 mypow(u8 m,u8 n)u32 result=1; while(n-)result*=m; return result; /显示2个数字/x,y :起点坐标 /len :数字的位数/color:颜色/num:数值(0);void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len) u8 t,temp;u8 enshow=0;num=(u16)num;for(t=0;tlen;t+)temp=(num/mypow(10,len-t-1)%10;if(enshow=0&t(len-1)if(temp=0)LCD_ShowChar(x+8*t,y, ,0);continue;else enshow=1; LCD_ShowChar(x+8*t,y,temp+48,0); /显示2个数字/x,y:起点坐标/num:数值(099); void LCD_Show2Num(u16 x,u16 y,u16 num,u8 len) u8 t,temp; for(t=0;tlen;t+)temp=(num/mypow(10,len-t-1)%10; LCD_ShowChar(x+8*t,y,temp+0,0); /显示字符串/x,y:起点坐标 /*p:字符串起始地址/用16字体void LCD_ShowString(u16 x,u16 y,const u8 *p)
展开阅读全文