用Delphi实现上位机与单片机串行通信源代码及效果图.docx
- 文档编号:3020012
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:15
- 大小:84.14KB
用Delphi实现上位机与单片机串行通信源代码及效果图.docx
《用Delphi实现上位机与单片机串行通信源代码及效果图.docx》由会员分享,可在线阅读,更多相关《用Delphi实现上位机与单片机串行通信源代码及效果图.docx(15页珍藏版)》请在冰豆网上搜索。
用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;
}
//*********读出温度函数****
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 实现 上位 单片机 串行 通信 源代码 效果图