1、用Delphi实现上位机与单片机串行通信源代码及效果图用Delphi实现上位机与单片机串行通信效果图及源代码只公布下位机(单片机)程序/*/本设计使用AT89C2051单片机,/时钟频率为11.0592MHz,12MHz也可以/用共阳极LED数码管显示及使用DS18B20智能温度传感器。/设计日月科技,QQ512566413#include #include /_nop_();延时函数,用于小于1us延时#define uchar unsigned char#define uint unsigned int#define disdata P1 /段码输出口sbit din=P15; /LED小
2、数点控制/#define discan P3 /动态扫描口/占用整个P3口了,现改为指定下面的端口,/把多余端口占用的空出来/列扫描控制IO口sbit led_1 = P20;sbit led_2 = P21;sbit led_3 = P22;sbit led_4 = P23;sbit dq= P33; /温度输入口uchar ch;uchar crc;/*温度小数部分用查表法*/uchar data RomCode8= 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ;uchar code ditab16= 0x00, 0x01, 0x01, 0
3、x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x09;/*uchar code dis_712=0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xff, 0xbf;*/uchar code dis_712=0x28,0xEE,0x32,0xA2, 0xE4,0xA1,0x21,0xEA,0x20,0xA0,0xff,0xF7;/共阴极LED段码表0123456789不亮-uchar code str12=0,1,2,3,4,
4、5,6,7,8, 9, ,-;/uchar code scan_con4=0x04,0x08,0x10,0x20; /列扫描控制字,P3.2 P3.3 P3.4 P3.5/0x04化成二进制就是0000 0100/0x08化成二进制就是0000 1000/0x10化成二进制就是0001 0000/0x20化成二进制就是0010 0000/0x40化成二进制就是0100 0000/0x80化成二进制就是1000 0000uchar data temp_data2=0x00, 0x00; / 读出温度暂放uchar data display5=0x00, 0x00, 0x00, 0x00, 0x0
5、0;/显示单元数据,共4个数据,一个运算暂存用/串口初始化晶振为11.0592M 方式1 波特率300-57600void InitCom(void) #define XTAL 11059200 / CUP 晶振频率 #define baudrate 9600 / 通信波特率 TMOD = 0x20; /定时器1方式2 定时器0方式1 /用在别处可以不用定时器0,TMOD=0x20 TH1=TL1=(unsigned char)(256-(XTAL/(32L*12L*baudrate); /THTL; SCON = 0x50; /串口方式1,允许接收 /TCON = 0x40; /设定时器1开
6、始计数 /PCON = 0x80; /波特率加倍控制,SMOD位 PCON=0x00; RI=0; /清收发标志 TI=0; IE=0x90; /0x00=禁止任何中断,0x90开启T1中断,0x92开启全部中断 TR1=1; /启动定时器1/向串口输出一个字符(非中断方式)void ComOutChar(unsigned char OutData) SBUF=OutData; /输出字符 while(!TI); /空语句判断字符是否发完 TI = 0; /清TI/串口接收中断函数void serial () interrupt 4 /using 3 if(RI) RI=0 ; ch=SBUF
7、; /*11微秒延时函数*/void delay(uint t) for(;t0;t-);/*显示扫描函数*/void scan(void) char k; for (k=0;k0;i-) /定义 8 bit,写 8 bit DQ = 1; _nop_(); _nop_(); DQ = 0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /5us DQ=val&0x01; /最低位移出,并写入总线 delay(6); /66us val=val1; /右移一位,倒数第二位变为最低位 DQ=1; delay(1); /高电平维持11us,写结束/*18
8、B20读1个字节函数*/uchar ReadOneChar(void) uchar i; uchar value = 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)
9、;/*/* */* 读取64位序列码 */* */*/void Read_RomCord(void) uchar j; Init_DS18B20(); WriteOneChar(0x33); / 读序列码的操作 for(j=0;j8;j+) RomCodej=ReadOneChar(); /*/* */*DS18B20的CRC8校验程序 */* */*/uchar CRC8(void) uchar i, x; uchar crcbuff; crc = 0; for(x=0;x8;x+) crcbuff=RomCodex; for(i=0;i=1; else crc=0x18; /CRC=X8+X5+X4+1 crc=1; crc|=0x80; crcbuff=1; return crc;/*读出温度函数*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1