数控电流源第29组.docx
- 文档编号:29426258
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:16
- 大小:114.58KB
数控电流源第29组.docx
《数控电流源第29组.docx》由会员分享,可在线阅读,更多相关《数控电流源第29组.docx(16页珍藏版)》请在冰豆网上搜索。
数控电流源第29组
数控电流源
组长:
组员:
一、主要实现功能(四号宋体)
设计、制作一能输出0~9mA数控电流源。
输出电流的大小可设定,并显示(一位小数),系统能自动检测输出电流的大小,并根据误差自动调整。
二、电路
附件:
/*******************************************************************************
*******************************************************************************/
#include
#include
#include"lcd.h"
#include"kanmengou.h"
#include"tlc1543.h"
#defineucharunsignedchar
#defineuintunsignedint
voidwrite_tlc5615(uintdatum);
voiddelay1ms(uintk)//12MHz晶振,延时kms
{
uinti,j;
for(i=0;i for(j=0;j<124;j++); } ucharBuffer[4]={0}; ucharBuffer1[4]={0}; sbitk1=P3^5; sbitk2=P3^6; voidDA(uintj); ucharcodeASCII[13]={'0','1','2','3','4','5','6','7','8','9','.','-','A'}; //sbitADout=P3^0; //sbitADin=P3^1; //sbitCS=P3^2; //sbitCLK=P3^3; sbitEOC=P3^7; sbitdin=P1^5; sbitsck=P1^7; sbitcs=P1^6; uintcodetable[]={0x0000,0x000f,0x0010,0x0014,0x0100,0x0110,0x0115,0x1000,0x1500,0x2500,0x3500, 0x4100,0x4150,0x4000,0x4500,0x4550,0x4650,0x5650,0x8000,}; //uintcodetable[]={0x0000,0x000f,0x0017,0x001f,0x0027,0x002f,0x0030, //0x6f,0x6a,0x67,0x60, //0x5f,0x5c,0x5a,0x57,0x54,0x50, //0x4f,0x4c,0x4a,0x47,0x44,0x40, //0x3f,0x3a,0x37, //}; //uintcodetable[]={0x0000,0x000f,0x0017,0x001f, //0x6f,0x6a,0x67,0x60, //0x5f,0x5c,0x5a,0x57,0x54,0x50, //0x4f,0x4c,0x4a,0x47,0x44,0x40, //0x3f,0x3a,0x37,0x30,0x2f, //0x27,}; floatT[]={0.0,1.8,2.3,2.4}; uintN[]={0,128,256,1024}; sbitCLK1=P2^0; sbitCS1=P2^1; sbitDIN1=P2^2; sbitDout1=P2^3; uintgetdata,temp,temp1; voiddelay(uintz); uintreadAD(ucharport); voiddisplay(); voiddelay(uintz) { uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } voiddelay1(uchartime) { ucharm,n; for(m=time;m>0;m--) for(n=240;n>0;n--); } voidMain(void) { uchari; Delay_1ms(100);//启动等待,等LCM讲入工作状态 LcdInit();//初始化1602液晶 SendString(1,0,"yushezhi: "); SendString(2,0,"cechuzhi: "); for(i=0;i<20;i++) { Delay_1ms(100); } while (1) { if(! k1) { delay(10); if(! k1) i++; while(! k1); DA(i); delay(50); if(i>25) i=0; } if(! k2) { delay(10); if(! k2) i--; while(! k2); DA(i); delay(50); if(i<0) i=25; } temp1=temp-0.005; Buffer1[0]=temp1%10; Buffer1[1]=temp1/10%10; Buffer1[2]=temp1/100%10; Buffer1[3]=temp1/1000; SendChar(1,9,ASCII[Buffer1[3]]); SendChar(1,10,ASCII[10]); SendChar(1,11,ASCII[Buffer1[2]]); SendChar(1,12,ASCII[Buffer1[1]]); SendChar(1,13,ASCII[Buffer1[0]]); SendChar(1,14,ASCII[12]); getdata=readAD(0x00); temp=getdata; temp=temp*1.0/4095*5000/50; Buffer[0]=temp%10; Buffer[1]=temp/10%10; Buffer[2]=temp/100%10; Buffer[3]=temp/1000; SendChar(2,9,ASCII[Buffer[3]]); SendChar(2,10,ASCII[10]); SendChar(2,11,ASCII[Buffer[2]]); SendChar(2,12,ASCII[Buffer[1]]); SendChar(2,13,ASCII[Buffer[0]]); SendChar(2,14,ASCII[12]); } } uintreadAD(ucharport) { ucharch,i; uintad; ch=port; ad=0; ch=port; EOC=1; CS=1; CS=0; CLK=0; for(i=0;i<12;i++) { if(ADout)ad|=0x01; ADin=(bit)(ch&0x80); CLK=1; CLK=0; ch<<=1; ad<<=1; } CS=1;/////////转换和读取数值 while(! EOC); ad>>=1; return(ad); } //floatcount_tem(unsignedintgetdata) //{ //floatT1,T2,temp; //unsignedintN1,N2; //unsignedinti; //while (1) //{ //T1=T[i];T2=T[i+1]; //N1=N[i];N2=N[i+1]; //if(getdata>=N1&&getdata<=N2)//判断AD值是否在(Ni,Ni+1)内 //{ //temp=T1+(getdata-N1)*(T2-T1)/(N2-N1);//代入公式计算结果 //returntemp;//返回测量量计算值 //} //i=i+1; // //} //} //voidwrite_tlc5615(uintdatum) //{ //uchari; //datum<<=6; //CLK1=0; //CS1=0; //for(i=0;i<12;i++) //{ //DIN1=(bit)(datum&0X8000); //CLK1=1; //datum<<=1; //CLK1=0; //} //CLK1=0; //CS1=1; //} voidDA(uintj) { uinti; uchartemp1=table[j]; sck=0; cs=0; for(i=0;i<12;i++) { temp1=temp1<<1; din=CY; sck=1; _nop_(); sck=0; } cs=1; } ##lcd## #include #include #include"lcd.h" #defineucharunsignedchar #defineuintunsignedint /********************************* 函数: Delay_6us() 参数: 无 返回: 无 功能: 延时6微秒,用在读写操作时序时作为短暂延时 **********************************/ voidDelay_6us(void) { _nop_(); _nop_(); } /********************************* 函数: Delay_1ms() 参数: t 返回: 无 功能: 延时子程序,延时时间为1ms*t。 使用晶振是11.0592M。 **********************************/ voidDelay_1ms(uintt) { uinti,j; for(i=0;i { for(j=0;j<=100;j++) { _nop_(); } } } /********************************* 函数: Busy() 参数: 无 返回: 无 功能: 这个是一个读状态函数,读出函数是否处在忙状态 **********************************/ voidBusy(void) { bitbusy_flag=0; RS=0; RW=1; E=1; Delay_6us(); while (1) { P0=0xFF;//给P0口赋值,让P0口处于确定的电平状态 E=0; Delay_6us(); E=1; Delay_6us(); busy_flag=(bit)(P0&0x80);//判断D7 if(! busy_flag)//判断D7是否为“0” { break; } } E=0; } /********************************* 函数: WriteCmd() 参数: Cmdcode: 写入的命令。 返回: 无 功能: 1602液晶写命令函数 **********************************/ voidWriteCmd(ucharCmdcode) { RS=0; RW=0; E=0; Delay_6us(); P0=Cmdcode;//把命令给P0口 Delay_6us(); E=1; Delay_6us(); E=0; } /********************************* 函数: WriteData() 参数: zdata: 写入的数据。 返回: 无 功能: 1602液晶写数据函数 **********************************/ voidWriteData(ucharzdata) { RS=1; RW=0; E=0; Delay_6us(); P0=zdata;//把数据给P0口 Delay_6us(); E=1; Delay_6us(); E=0; } /********************************* 函数: LcdInit() 参数: 无 返回: 无 功能: 1602液晶初始化函数 **********************************/ voidLcdInit(void) { Delay_1ms(15); WriteCmd(0x38);//设置显示模式 Delay_1ms(5); WriteCmd(0x38); Delay_1ms(5); WriteCmd(0x38); Busy(); WriteCmd(0x38); Busy(); WriteCmd(0x08);//显示关闭 Busy(); WriteCmd(0x01);//显示清屏 Busy(); WriteCmd(0x06);//显示开和光标设置 Busy(); WriteCmd(0x0c);//显示光标移动设置 } /********************************* 函数: SendChar() 参数: line,row,*p 返回: 无 功能: 在1602液晶某一个位置显示一个ASCII码字符。 line为液晶的行参数,row为液晶的列参数, *p为要写入的数据。 比如: 在第一行的第一个位置显示一个"A",可以这样调用函数。 SendChar(1,0,'A'); **********************************/ voidSendChar(ucharline,ucharrow,ucharzdata) { ucharaddr; if(line==1) { addr=0x80;//设置液晶第一行数据指针首地址 } if(line==2) { addr=0xc0;//设置液晶第二行数据指针首地址 } addr=addr+row;//需要控制1602液晶的地址 Busy(); WriteCmd(addr);//写入地址 Busy(); WriteData(zdata);//写入数据 } /********************************* 函数: SendString() 参数: line,row,*p 返回: 无 功能: 在1602液晶某一个位置开始显示一串ASCII码字符。 line为液晶的行参数,row为液晶的列参数, *p为要写入的数据。 比如: 在第一行的第5个位置开始显示一串数据"123ABC",可以这样调用函数。 SendString(1,4,"123ABC"); **********************************/ voidSendString(ucharline,ucharrow,uchar*p) { ucharaddr; if(line==1) { addr=0x80;//设置液晶第一行数据指针首地址 } if(line==2) { addr=0xc0;//设置液晶第二行数据指针首地址 } addr=addr+row;//需要控制1602液晶的地址 while (1) { Busy(); WriteCmd(addr);//写入地址 Busy(); WriteData(*p);//写入数据 addr++;//地址加1 p++;//数据指针加1 if(*p=='\0')//判断是否到字符串末尾 { break; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数控 电流 29