修改成PIC单片机程序。PIC单片机功能多,但是很容易受干扰,还是STC单片机好用。如果是51单片机直接编译就用,不作修改。** 模拟电压输入,显示屏显示(保留1位小数),** 晶 振 频 率:** 线路->单片机实验开发板B 与组态王联机 实验板地址为:15 温度存储地址为15 测试代码(通过串口助手以16进制发送):40 30 46 43 30 30 30 30 46 30 31 37 32 0d******************************************************************/ #include <>#include <> /****************************TLC0832端口定义*********************************************/ sbit ADC_CLK=P1^2; sbit ADC_DO=P1^3; sbit ADC_DI=P1^4;sbit ADC_CS=P1^7;/****************************数码显示 键盘接口定义****************************************/ sbit PS0=P2^4;//数码管小数点后第一位 sbit PS1=P2^5;//数码管个位 sbit PS2=P2^6;//数码管十位 sbit PS3=P2^7;//数码管百位sfr P_data=0x80;//P0口为显示数据输出口sbit P_K_L=P2^2;//键盘列 sbit JDQ1=P2^0;//继电器1控制sbit JDQ2=P2^1;//继电器2控制 unsigned char code tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};//字段转换表unsigned char rec[50];//用于接收组态王发送来的数据,发送过来的数据不能超过此数组长度 unsigned char code error[]={0x40,0x30,0x46,0x2a,0x2a,0x37,0x36,0x0d};//数据不正确unsigned char send[]={0x40,0x30,0x46,0x30,0x31,0x00,0x00,0x00,0x00,0x0d};//正确的数据unsigned char i;unsigned char temp;//温度 unsigned char adc_change(unsigned char);//操作TLC0832 unsigned int htd(unsigned int); //进制转换函数void display(unsigned int);//显示函数void delay(unsigned int);//延时函数unsigned char ath(unsigned char,unsigned char);//ASIIC码转换为十六进制数unsigned int hta(unsigned char);//十六进制数转换为ASIIC码 void uart(void);//串口中断程序 void main(void){ unsigned int a,b; unsigned char i=0; TMOD=0x20; //定时器1--方式2 TL1=0xfd; TH1=0xfd; //晶振,波特率为9600 SCON=0x50; //方式1 TR1=1; //启动定时 IE = 0x90; //EA=1,ES=1:打开串口中断 while(1) { temp=adc_change('0')*10*5/255; a=hta(temp); send[5]=a>>8; send[6]=(unsigned char)a; b=0; for(a=1;a<7;a++)//产生异或值 b^=send[a]; b=hta(b); send[7]=b>>8; send[8]=(unsigned char)b; for(a=0;a<100;a++)//显示,兼有延时的作用 display(htd(temp)); if(temp>45) JDQ1=0;//继电器1动作 else JDQ1=1;//继电器1复位 if(temp<5) JDQ2=0;//继电器2动作 else JDQ2=1;//继电器1复位 }}/**************************数码管显示函数**************************//*函数原型:void display(void)/*函数功能:数码管显示/*输入参数:无/*输出参数:无/*调用模块:delay()/******************************************************************/ void display(unsigned int a){ bit b=P_K_L; P_K_L=1;//防止按键干扰显示 P_data=tab[a&0x0f];//显示小数点后第1位 PS0=0; PS1=1; PS2=1; PS3=1; delay(200); P_data=tab[(a>>4)&0x0f]|0x01; //显示个位 PS0=1; PS1=0; delay(200); //P_data=tab[(a>>8)&0x0f];//显示十位 PS1=1; //PS2=0; //delay(200); //P_data=tab[(a>>12)&0x0f];//显示百位 //PS2=1; //PS3=0; //delay(200); //PS3=1; P_K_L=b;//恢复按键 P_data=0xff;//恢复数据口}/************************************************************************************************* ; 函数名称: adc_change ; 功能描述: TI公司8位2通adc芯片TLC0832的控制时序 ; 形式参数: config(无符号整型变量) ; 返回参数: a_data ; 局部变量: m、n ; 调用模块: ; 备 注: **************************************************************************************************/ unsigned char adc_change(unsigned char config)//操作TLC0832 { unsigned char i,a_data=0; ADC_CLK=0; _nop_(); ADC_DI=0; _nop_(); ADC_CS=0; _nop_(); ADC_DI=1; _nop_(); ADC_CLK=1; _nop_(); ADC_CLK=0; if(config=='0') { ADC_DI=1; _nop_(); ADC_CLK=1; _nop_(); ADC_DI=0; _nop_(); ADC_CLK=0; } else if(config=='1') { ADC_DI=1; _nop_(); ADC_CLK=1; _nop_(); ADC_DI=1; _nop_(); ADC_CLK=0; } ADC_CLK=1; _nop_(); ADC_CLK=0; _nop_(); ADC_CLK=1; _nop_(); ADC_CLK=0; for(i=0;i<8;i++) { a_data<<=1; ADC_CLK=0; a_data+=(unsigned char)ADC_DO; ADC_CLK=1; } ADC_CS=1; ADC_DI=1; return a_data;} /**************************十六进制转十进制函数**************************//*函数原型:uint htd(uint a)/*函数功能:十六进制转十进制/*输入参数:要转换的数据/*输出参数:转换后的数据/*调用模块:无/******************************************************************/ unsigned int htd(unsigned int a){ unsigned int b,c; b=a%10; c=b; a=a/10; b=a%10; c=c+(b<<4); a=a/10; b=a%10; c=c+(b<<8); a=a/10; b=a%10; c=c+(b<<12); return c;}/*******************************延时函数*********************************//*函数原型:delay(unsigned int delay_time)/*函数功能:延时函数/*输入参数:delay_time (输入要延时的时间)/*输出参数:无/*调用模块:无/**********************************************************************/void delay(unsigned int delay_time) //延时子程序{for(;delay_time>0;delay_time--){} }/********************ASIIC码转换为十六进制程序*************************//*函数原型:unsigned char ath(unsigned char a,unsigned char b)/*函数功能:ASIIC码转换为十六进/*输入参数:要转换的数据/*输出参数:转换后的数据/*调用模块:无/**********************************************************************/unsigned char ath(unsigned char a,unsigned char b){ if(a<0x40) a-=0x30; else if(a<0x47) a-=0x37; else if(a<67) a-=0x57; if(b<0x40) b-=0x30; else if(b<0x47) b-=0x37; else if(a<67) b-=0x57; return((a<<4)+b);}/********************十六进制转换为ASIIC码程序*************************//*函数原型:unsigned int hta(unsigned char a)/*函数功能:十六进转换为ASIIC码/*输入参数:要转换的数据/*输出参数:转换后的数据/*调用模块:无/**********************************************************************/unsigned int hta(unsigned char a){ unsigned int b; b=a>>4; a&=0x0f; if(a<0x0a) a+=0x30; else a+=0x37; if(b<0x0a) b+=0x30; else b+=0x37; b=((b<<8)+a); return b;}/**************************串口中断程序******************************//*函数原型:void uart(void)/*函数功能:串口中断处理/*输入参数:无/*输出参数:无 /*调用模块:无/**********************************************************************/void uart(void) interrupt 4{ unsigned char a,b; if(RI) { a=SBUF; RI=0; if(a==0x40)//接收到字头 i=0; rec[i]=a; i++; if(a==0x0d)//接收到字尾,开始出路数据 { if(ath(rec[1],rec[2])==15)//判断是否为本机地址 { b=0; for(a=1;a