用Delphi实现上位机与单片机串行通信源代码及效果图.docx

上传人:b****6 文档编号:3020012 上传时间:2022-11-17 格式:DOCX 页数:15 大小:84.14KB
下载 相关 举报
用Delphi实现上位机与单片机串行通信源代码及效果图.docx_第1页
第1页 / 共15页
用Delphi实现上位机与单片机串行通信源代码及效果图.docx_第2页
第2页 / 共15页
用Delphi实现上位机与单片机串行通信源代码及效果图.docx_第3页
第3页 / 共15页
用Delphi实现上位机与单片机串行通信源代码及效果图.docx_第4页
第4页 / 共15页
用Delphi实现上位机与单片机串行通信源代码及效果图.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

用Delphi实现上位机与单片机串行通信源代码及效果图.docx

《用Delphi实现上位机与单片机串行通信源代码及效果图.docx》由会员分享,可在线阅读,更多相关《用Delphi实现上位机与单片机串行通信源代码及效果图.docx(15页珍藏版)》请在冰豆网上搜索。

用Delphi实现上位机与单片机串行通信源代码及效果图.docx

用Delphi实现上位机与单片机串行通信源代码及效果图

用Delphi实现上位机与单片机串行通信效果图及源代码只公布下位机(单片机)程序

//****************************************************************************************************//

//本设计使用AT89C2051单片机,

//时钟频率为11.0592MHz,12MHz也可以

//用共阳极LED数码管显示及使用DS18B20智能温度传感器。

//

//设计日月科技,QQ512566413

#include

#include

//_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化成二进制就是10000000

uchardatatemp_data[2]={0x00,0x00};//读出温度暂放

uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};

//显示单元数据,共4个数据,一个运算暂存用

//串口初始化晶振为11.0592M方式1波特率300-57600

voidInitCom(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;

}

//*********读出温度函数****

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1