/******************************************************************
** 模拟电压输入,显示屏显示(保留1位小数),
** 晶 振 频 率:11.0592M
** 线路->单片机实验开发板B
与组态王联机 实验板地址为:15 温度存储地址为15
测试代码(通过串口助手以16进制发送):40 30 46 43 30 30 30 30 46 30 31 37 32 0d
******************************************************************/
#include <REG51.H>
#include <intrins.h>
/****************************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; //11.0592MHZ晶振,波特率为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<i-3;a++)//产生异或值
b^=rec[a];
if(b==ath(rec[i-3],rec[i-2]))//接收到正确数据
{
if((ath(rec[3],rec[4])&0x01)==0)//读操作
{
for(a=0;a<10;a++)
{
SBUF=send[a];
while(TI!=1);
TI=0;
}
}
}
else//接收到错误数据
{
for(a=0;a<8;a++)
{
SBUF=error[a];
while(TI!=1);
TI=0;
}
}
}
}
}
else
{
TI=0;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
利用Keil C51实现单片机模拟电压输入 利用组态王实现PC与单片机模拟电压输入
共67个文件
dat:23个
bak:5个
idx:4个
5星 · 超过95%的资源 需积分: 20 14 下载量 181 浏览量
2012-11-30
19:14:23
上传
评论 1
收藏 66KB ZIP 举报
温馨提示
利用Keil C51实现单片机模拟电压输入 利用组态王实现PC与单片机模拟电压输入
资源推荐
资源详情
资源评论
收起资源包目录
源程序.zip (67个子文件)
3.3.1.2 利用KingView实现PC与单片机模拟电压输入
Webs
config
KvWebDbCfg.dat 135B
KvWebHisCfg.dat 135B
KvWebDbVar.dat 135B
KvWebRealCfg.dat 135B
webconfig.ini 186B
structtag2.idx 40B
Device.dat 18KB
refstation.bak 7B
customscript.cfg 561B
ExceptionTime.dat 8B
group.dat 17B
OcxIDs.Dat 7B
RDBQueryServer.dat 1022B
ProjManage.dat 108B
webInfo.dat 307B
mainbase.ini 581B
DBFlag.dat 9B
section.dat 182B
struct.db 8KB
Project.inf 1024B
Tree.hud 31B
pic00001.act 7KB
RDB
RDBRecServer.dat 2KB
tagname.idx 876B
users.dat 631B
tagname2.idx 952B
structtag.idx 40B
appscrip.cfg 56B
pic00001.111 8KB
RptRDBNodes.tmp 2B
RptIds.Dat 2B
action.cfg 8B
struct.dat 3KB
refstations.dat 7B
tagname.db 12KB
Tree.dat 45B
本站点
picmanag.dat 68B
ExceptionFlag.dat 4B
IdName.Dat 2B
VarSel.flt 0B
project.pro 124B
comdev.dat 177KB
pic00001.pic 9KB
3.3.1.1 利用Keil C51实现单片机模拟电压输入
chuankou2.OBJ 11KB
chuamkou2_Uv2.Bak 0B
chuamkou2.Uv2 2KB
chuamkou2.M51 14KB
chuankou2.c 7KB
chuamkou2.Opt 1KB
chuankou2.LST 15KB
单片机C程序(把1-5V转换为0-100Kg显示)
chuankou2.OBJ 9KB
chuamkou2_Uv2.Bak 0B
chuamkou2.Uv2 2KB
chuamkou2.M51 12KB
chuankou2.c 5KB
chuamkou2.Opt 1KB
chuankou2.LST 10KB
chuamkou2.lnp 35B
chuamkou2.plg 382B
chuamkou2.hex 5KB
chuamkou2 9KB
chuamkou2_Opt.Bak 1KB
chuamkou2.lnp 35B
chuamkou2.plg 468B
chuamkou2.hex 3KB
chuamkou2 10KB
chuamkou2_Opt.Bak 1KB
共 67 条
- 1
资源评论
- ren65002014-10-06谢谢分享!很好的资源
- lscguoke2014-04-04一头雾水啊!不太好!
- lmlm5122015-04-06好资源,找了好多,唯一能调通,唯一不足就是不知道原理图,自己更加程序反推!
douxinmin880
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功