用Delphi实现上位机与单片机串行通信源代码及效果图_第1页
用Delphi实现上位机与单片机串行通信源代码及效果图_第2页
用Delphi实现上位机与单片机串行通信源代码及效果图_第3页
用Delphi实现上位机与单片机串行通信源代码及效果图_第4页
用Delphi实现上位机与单片机串行通信源代码及效果图_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用Delphi实现上位机与单片机串行通信效果图及源代码只公布下位机(单片机)程序//****************************************************************************************************////本设计使用AT89C2051单片机,//时钟频率为11.0592MHz,12MHz也可以//用共阳极LED数码管显示及使用DS18B20智能温度传感器。////设计日月科技,QQ512566413#include<reg51.h>#include<intrins.h>//_nop_();延时函数,用于小于1us延时#defineucharunsignedchar#defineuintunsignedint#definedisdataP1//段码输出口sbitdin=P1^5;//LED小数点控制//#definediscanP3//动态扫描口//占用整个P3口了,现改为指定下面的端口,//把多余端口占用的空出来//列扫描控制IO口sbitled_1=P2^0;sbitled_2=P2^1;sbitled_3=P2^2;sbitled_4=P2^3;sbitdq=P3^3;//温度输入口ucharch;ucharcrc;//***温度小数部分用查表法*********//uchardataRomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};/*ucharcodedis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};*/ucharcodedis_7[12]={0x28,0xEE,0x32,0xA2,0xE4,0xA1,0x21,0xEA,0x20,0xA0,0xff,0xF7};//共阴极LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"ucharcodestr[12]={'0','1','2','3','4','5','6','7','8','9', '','-'};//ucharcodescan_con[4]={0x04,0x08,0x10,0x20};//列扫描控制字,P3.2P3.3P3.4P3.5//0x04化成二进制就是00000100//0x08化成二进制就是00001000//0x10化成二进制就是00010000//0x20化成二进制就是00100000//0x40化成二进制就是01000000//0x80化成二进制就是10000000uchardatatemp_data[2]={0x00,0x00};//读出温度暂放uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用//串口初始化晶振为11.0592M方式1波特率300-57600voidInitCom(void){ #defineXTAL11059200//CUP晶振频率 #definebaudrate9600//通信波特率 TMOD=0x20; //定时器1方式2定时器0方式1 //用在别处可以不用定时器0,TMOD=0x20 TH1=TL1=(unsignedchar)(256-(XTAL/(32L*12L*baudrate)));//THTL; SCON=0x50;//串口方式1,允许接收 //TCON=0x40;//设定时器1开始计数 //PCON=0x80;//波特率加倍控制,SMOD位 PCON=0x00; RI=0; //清收发标志 TI=0; IE=0x90;//0x00=禁止任何中断,0x90开启T1中断,0x92开启全部中断 TR1=1;//启动定时器1}//向串口输出一个字符(非中断方式)voidComOutChar(unsignedcharOutData){ SBUF=OutData;//输出字符 while(!TI);//空语句判断字符是否发完 TI=0;//清TI}//串口接收中断函数voidserial()interrupt4//using3{ if(RI) { RI=0; ch=SBUF; }}//****11微秒延时函数*********************//voiddelay(uintt){ for(;t>0;t--);}//***********显示扫描函数*************//voidscan(void){ chark; for(k=0;k<4;k++)//四位LED扫描控制从左到右 { Disdata=dis_7[display[k]]; //discan=scan_con[k]; switch(k) { case0: LED_1=0; break; case1: LED_2=0; DIN=0; break; case2: LED_3=0; break; case3: LED_4=0; break; default: break; } delay(100); //scan_con-列扫描控制字; //discan-P3口列扫描输出 //discan=0x00;//灭字 switch(k) { case0: LED_1=1; break; case1: LED_2=1; break; case2: LED_3=1; break; case3: LED_4=1; break; default: break; } }}//******18B20复位函数***********//voidInit_DS18B20(void){ charpresence=1; while(presence) { while(presence) { DQ=1; _nop_(); _nop_();//总线上拉 DQ=0;//下拉 delay(50);//维持550us,最短维持480us DQ=1;//总线上拉 delay(6);//检测总线上升沿,66us presence=DQ;//DS18B20发存在低电平信号(60-240us);presence=0继续下一步 } delay(30); //延时300us,总线恢复高电平,DQ=1; presence=~DQ;//取反,跳出循环 } DQ=1;}//****18B20写命令函数************//voidWriteOneChar(ucharval){ uchari; for(i=8;i>0;i--)//定义8bit,写8bit { DQ=1; _nop_(); _nop_(); DQ=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //5us DQ=val&0x01;//最低位移出,并写入总线 delay(6);//66us val=val>>1; //右移一位,倒数第二位变为最低位 } DQ=1; delay(1); //高电平维持11us,写结束}//*******18B20读1个字节函数*********************//ucharReadOneChar(void){ uchari; ucharvalue=0; for(i=8;i>0;i--) { DQ=1; _nop_(); _nop_(); value>>=1;//右移一位 DQ=0; _nop_(); _nop_(); _nop_(); _nop_();//4us DQ=1; _nop_(); _nop_(); _nop_(); _nop_(); //4us,读时隙 if(DQ) value|=0x80; //DQ=1,则写入为10000000 delay(6);//66us } DQ=1; return(value);}/**************************************//**//*读取64位序列码*//**//**************************************/voidRead_RomCord(void){ ucharj; Init_DS18B20(); WriteOneChar(0x33);//读序列码的操作 for(j=0;j<8;j++) { RomCode[j]=ReadOneChar(); }}/******************************************//**//*DS18B20的CRC8校验程序*//**//******************************************/ucharCRC8(void){ uchari,x; ucharcrcbuff; crc=0; for(x=0;x<8;x++) { crcbuff=RomCode[x]; for(i=0;i<8;i++) { if(((crc^crcbuff)&0x01)==0) crc>>=1; else { crc^=0x18;//CRC=X8+X5+X4+1 crc>>=1; crc|=0x80; } crcbuff>>=1; } } returncrc;}//*********读出温度函数*****************//voidReadTemperature(void){ ucharn=0; //存储符号 Init_DS18B20(); //总线复位 WriteOneChar(0xCC); //发SkipROM命令 WriteOneChar(0xBE); //发读命令 temp_data[0]=ReadOneChar();//温度低8位 temp_data[1]=ReadOneChar();//温度高8位 Init_DS18B20(); WriteOneChar(0xCC); //SkipROM WriteOneChar(0x44); //发转换命令//******温度数据处理函数*********************// if((temp_data[1]&0xf8)==0xf8) { temp_data[1]=~temp_data[1]; //负温度求补码 temp_data[0]=~temp_data[0]+1; if(temp_data[0]==0x00) temp_data[1]++; n=1; } //查表得到温度小数部分 display[4]=temp_data[0]&0x0f; display[0]=ditab[display[4]];//处理小数位 //获取温度整数部分 //(高字节的低三位与低字节的高四位) //低八位屏蔽小数位后右移四位 //与高八位屏蔽符号位后左移四位合并// display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); display[3]=display[4]/100; //百位 display[2]=display[4]%100/10; //十位 display[1]=display[4]%10; //个位 if(!display[3]) { display[3]=0x0A; //最高位为0时都不显示,控制字为0xff if(!display[2]) { display[2]=0x0A; } } if(n) { display[3]=0x0B; //负温度时最高位显示"-" }}/*voidTimer0(void)interrupt1 //定时器0中断{ TH0=0x4c; TL0=0x00;}*///*********************主函数*********************//voidmain(void){ uinth,i; //定义循环变量 uchariRom; InitCom(); //初始化串口 for(h=0;h<4;h++) { display[h]=8;//开机测试LED,显示"8888" } Init_DS18B20();//开机先转换一次 WriteOneChar(0xCC);//SkipROM;允许总线控制器不用提供64位ROM编码就可以使用存储器操作命令。 WriteOneChar(0x44);//发转换命令 Read_RomCord();//读取64位序列码 CRC8();//CRC效验 for(h=0;h<200;h++) { scan();//开机显示"8888"2秒 } /* TH0=0x4c; TL0=0x00;//定时器0初值,50ms TR0=1;//开启定时器0 */ i=0; while(1) { ReadTemperature();//读出18B20温度数据 scan();//显示温度值到数码管 if(ch==0x0B) { delay(800); i++; if(i>30)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论