计控课程设计东北电力要点.docx
《计控课程设计东北电力要点.docx》由会员分享,可在线阅读,更多相关《计控课程设计东北电力要点.docx(22页珍藏版)》请在冰豆网上搜索。
![计控课程设计东北电力要点.docx](https://file1.bdocx.com/fileroot1/2022-12/1/b86abab0-29c8-4263-9daa-1245e1a36ded/b86abab0-29c8-4263-9daa-1245e1a36ded1.gif)
计控课程设计东北电力要点
课程设计报告
学生姓名:
学号:
学院:
自动化工程学院
班级:
题目:
计算机控制系统
指导教师:
冯玉昌张利辉职称:
讲师副教授
2014年6月12日
目录
1题目背景与意义-3-
2设计题目介绍-3-
2.1设计题目及要求-3-
2.2系统设计总体框图-3-
4系统硬件设计-4-
4.1单片机选型及依据-4-
4.1.1单片机最小系统电路-4-
4.1.2单片机I/O口介绍-4-
4.2A/D转换芯片选择及依据-4-
4.2.1AD转换电路-5-
4.2.2ADC0832芯片介绍-5-
4.3DA转换芯片选择及依据-5-
4.3.1DA转换电路-6-
4.3显示元件选择及依据-6-
4.3.1显示部分电路-6-
4.3.2LCD1602功能介绍-7-
4.4稳压电路-7-
4.5报警电路-7-
4.6按键电路-8-
4.7上位机通信电路-8-
4.7.1Max232介绍-8-
4.7.2COMPIM引脚介绍-9-
5系统软件设计-9-
5.1报警程序框图-9-
5.2LCD显示程序-10-
5.3主程序框图-11-
6结论-11-
参考文献-12-
附录-13-
总体电路图-13-
部分程序-14-
1题目背景与意义
在工业生产过程控制中,有许多模拟量参数需要测量,如温度、压力、流量等,然而处理器只能接收数字量信号,所以AD转换尤为重要,处理器接收到数字信号处理后需要送到执行机构,因此DA转换也十分重要,由此可见AD/DA转换广泛应用于各种控制场合。
本课程设计以《计算机控制系统》课程理论为基础,以其他电子类、计算机及接口类相关课程内容为辅助,在实践中锻炼学生的系统设计能力、理论应用能力、总结归纳能力以及自我学习能力,提高其实践能力、创新意识与创新精神。
2设计题目介绍
2.1设计题目及要求
设计一个基于单片机的具有A/D和D/A功能的信号测控装置。
要求该信号测控装置能够接入典型传感器、变送器信号,同时可输出标准电压/电流信号。
并满足抗干扰、通用性、安全性、性价比等原则性要求。
充分理解题目要求,确定方案;合理选择器件型号;用1号图纸1张或者采用Proteus软件画出电原理图;用1号图纸1张画出软件结构框图;写出设计报告,对课程设计成品的功能进行介绍及主要部分进行分析与说明;每天写出工作日记。
可将系统扩展为多路。
可在此系统中扩展键盘、显示(LCD/LED)、与上位机通讯功能;完成以上基本设计部分之后,可以运用Proteus仿真软件对设计结果进行相应的编程和仿真,调试测控系统并观察其运行结果(可以分部分完成)。
2.2系统设计总体框图
图1系统总体框图
本设计系统框图如上图所示,本设计以51单片机为核心,传感器检测到的模拟量信号送到AD转换器,AD转换器将模拟信号转换为数字信号送入单片机,单片机将数字信号与设定值比较,通LCD显示结果,声光报警判断是否正常工作数模转换输出模拟量进行控制。
由按键选择AD转换所需要的通道。
稳压电路提供电源电压。
4系统硬件设计
4.1单片机选型及依据
本设计单片机采用AT89C51单片机。
AT89C51单片机有4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
此单片机灵活性好,性价比好,是常用的控制芯片。
4.1.1单片机最小系统电路
图2最小系统电路图
4.1.2单片机I/O口介绍
P0口有三个功能:
数据总线、地址总线、一般I/O口使用,但内部没有上拉电阻,作为输入或输出时应在外部接上拉电阻。
P1口只做I/O口使用,其内部有上拉电阻。
P2口有两个功能:
作地址总线使用、一般I/O口使用。
P3口有特殊功能,也可作为一般I/O口使用。
4.2A/D转换芯片选择及依据
AD转换芯片采用ADC0832。
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
芯片的模拟电压输入在0~5V之间。
转换速度快且稳定性能强。
独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。
通过DI数据输入端,可以轻易的实现通道功能的选择。
由于它体积小,兼容性好,性价比高,且转换精度可以满足要求,I/O资源占用较少,所以在本设计中采用此芯片。
4.2.1AD转换电路
图3AD转换电路图
4.2.2ADC0832芯片介绍
CS片选使能,低电平芯片使能。
CH0模拟输入通道0,或作为IN+/-使用。
CH1模拟输入通道1,或作为IN+/-使用。
GND芯片参考0电位(地)。
DI数据信号输入,选择通道控制。
DO数据信号输出,转换数据输出。
CLK芯片时钟输入。
VCC/REF电源输入及参考电压输入(复用)。
在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能。
到第3个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。
从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据,直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。
从第11个字节的下沉输出DATA0。
随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。
最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
作为单通道模拟信号输入时ADC0832的输入电压是0~5V且8位分辨率时的电压精度为19.53mV。
4.3DA转换芯片选择及依据
DA转换芯片采用DAC0809,由于仿真软件中没有此芯片模型,仿真中用DAC0808代替。
DAC0809是8分辨率的D/A转换集成芯片。
与微处理器完全兼容。
这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。
D/A转换器由8位输入锁存器、8位D/A转换电路及转换控制电路构成。
此芯片可以满足精度要求,且价格便宜,控制简单,所以本设计中采用此芯片。
4.3.1DA转换电路
图4DA转换电路图
4.3显示元件选择及依据
显示部分采用LCD1602。
LCD1602是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块。
考虑到本设计中有通道选择功能,显示部分应该设计有提示信息,所以放弃使用数码管,且LCD1062子程序网上有很多,可以直接调用查询、写数据、写指令等程序,应用方便。
4.3.1显示部分电路
图5显示电路
4.3.2LCD1602功能介绍
4脚RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5脚RW为读写信号线,高电平1时进行读操作,低电平0时进行写操作。
6脚E(或EN)端为使能(enable)端,高电平1时读取信息,负跳变时执行指令。
4.4稳压电路
为了使单片机能和芯片更稳定的工作,必须保证有一个稳定的电压输入。
所以接入一个+5V稳压电源。
7805为典型三端IC稳压集成电路,在输入端接入8V电压时,输出为+5V稳压。
图6稳压电路
4.5报警电路
报警电路设计简单,通过控制P1.7口电平变化控制喇叭,当超出上下限时,发出声音报警。
图7报警电路
4.6按键电路
由于本设计选择的AD转换芯片有两个通道,所以考虑设计按键实现通道的选择以及上下限制的修改。
图8按键电路
4.7上位机通信电路
为了能够完成和上位机之间的通信,必须通过max232这种类似的芯片进行电平转换,因为单片机和上位机之间的电平标准不相同。
图9上位机通讯电路
4.7.1Max232介绍
Max232MAX232芯片是美信(MAXIM)公司专为RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。
第一部分是电荷泵电路。
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两个数据通道。
13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从11引脚(T1IN)、10引脚(T2IN)输入转换成RS-232数据从14脚(T1OUT)、7脚(T2OUT)送到电脑DB9插头;DB9插头的RS-232数据从13引脚(R1IN)、8引脚(R2IN)输入转换成TTL/CMOS数据后从12引脚(R1OUT)、9引脚(R2OUT)输出。
4.7.2COMPIM引脚介绍
COMPIM是常用于上位机连接的串口,其引脚定义如下:
1数据载波检测、2接收数据、3发送数据、4数据终端准备、5信号地、6数据设备准备好、7请求发送、8清除发送、9振铃指示。
5系统软件设计
5.1报警程序框图
图10报警子程序框图
5.2LCD显示程序
图11LCD显示子程序
5.3主程序框图
图12主程序框图
6结论
通过实验证明,本设计电路可以满足于测量的要求,转换精度高,且系统操作方便,能在广泛的领域运用并取得了良好的效果。
通过此次课程设计,我加深了对控制系统理解,将所学的知识灵活穿插并运用起来。
发现问题和解决问题的能力有了提高!
更好的掌握单片机的内部功能模块的应用以及A/D和D/A功能的实现。
通过这次课程设计,督促了我上网查资料,查书籍,巩固了以前的知识,了解和掌握了单片机应用系统的软硬件设计过程、方法及实现,锻炼了我的实践能力,对知识的理解能力。
参考文献
[1]姜学军.计算机控制技术.清华大学出版社,2006
[2]张毅刚,彭喜元,彭宇.单片机原理及应用.高等教育出版社.2012
[3]郝晓松,彭天好,刘佳东等.基于单片机的变转速液压测控系统的研究.矿山机械,2010,(6):
22-26
[4]冯显英,葛荣雨.基于数字温湿度传感器SHT11的温湿度测控系统.自动化仪表,2006,27
(1):
59-61
附录
总体电路图
图13总电路图
部分程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedelay4us(){_nop_();_nop_();_nop_();_nop_();}
//AD0832引脚定义
sbitCS=P1^0;
sbitCLK=P1^1;
sbitDI=P1^2;
sbitDO=P1^6;
sbitP1_7=P1^7;
//LCD1602
sbitRS=P1^5;
sbitRW=P1^4;
sbitE=P1^3;
////
sbitkey1=P3^5;
sbitkey2=P3^6;
///
sbitK1=P3^4;
sbitK2=P3^2;
sbitk3=P3^7;
uchari;
intd,ad,m;
inta,b,shangxian,xiaxian;
a=45;
b=220;
ucharDisplay_Buffer[]="0.00v";
ucharDisplay_Chanel[]="0or1";
ucharcodeLine1[]="TengHao:
";
ucharcodeselect[]="xuanzetongdao";
voidDelayMS(uintms)
{
uchart;
while(ms--)
for(t=0;t<120;t++);
}
bitLCD_Busy_Check()
{
bitresult;
RS=0;RW=1;E=1;delay4us();
result=(bit)(P0&0x80);
E=0;
returnresult;
}
voidLCD_Write_Command(ucharcmd)
{
while(LCD_Busy_Check());//判断LCD是否忙碌
RS=0;RW=0;E=0;_nop_();_nop_();
P0=cmd;delay4us();
E=1;delay4us();E=0;
}
//----------------------------------------写LCD命令
//----------------------------------------设置LCD显示位置
voidSet_Disp_Pos(ucharpos)
{
LCD_Write_Command(pos|0x80);
}
voidLCD_Write_Data(uchardat)
{
while(LCD_Busy_Check());
RS=1;RW=0;E=0;
P0=dat;delay4us();
E=1;delay4us();E=0;
}
voidLCD_Initialise()
{
LCD_Write_Command(0x38);DelayMS
(1);
LCD_Write_Command(0x0c);DelayMS
(1);
LCD_Write_Command(0x06);DelayMS
(1);
LCD_Write_Command(0x01);DelayMS
(1);
}
ucharGet_AD_Result_0()
{
uchari,dat1=0,dat2=0;
//起始控制位
CS=0;CLK=0;
DI=1;_nop_();_nop_();_nop_();_nop_();
CLK=1;_nop_();_nop_();_nop_();_nop_();
//第一个下降沿之前,DI=1模式中的单端输入方式
CLK=0;DI=1;_nop_();_nop_();_nop_();_nop_();
CLK=1;_nop_();_nop_();_nop_();_nop_();
//第二个下降沿之前,设DI=0/1,选择CH0/CH1
CLK=0;DI=0;_nop_();_nop_();_nop_();_nop_();//DIO=CH
CLK=1;_nop_();_nop_();_nop_();_nop_();
//第三个下降沿之前,设DI=1
CLK=0;DI=1;_nop_();_nop_();_nop_();_nop_();
//第4-11,共八个下降沿读数据(MSB->LSB)
for(i=0;i<8;i++)
{
CLK=1;_nop_();_nop_();
CLK=0;_nop_();_nop_();
dat1=(dat1<<1)|DO;
}
//第11-18,共8个下降沿读数据(LSB->MSB
for(i=0;i<8;i++)
{
dat2=dat2|((uchar)(DO)<
CLK=1;_nop_();_nop_();
CLK=0;_nop_();_nop_();
}
CS=1;
//return(dat1==dat2)?
dat1:
0;
return(dat2);
}
ucharGet_AD_Result_1()
{
uchari,dat1=0,dat2=0;
//起始控制位
CS=0;CLK=0;
DI=1;_nop_();_nop_();_nop_();_nop_();
CLK=1;_nop_();_nop_();_nop_();_nop_();
//第一个下降沿之前,设DI=1/0
//选择单端/差分(SGL/DIF)模式中的单端输入方式
CLK=0;DI=1;_nop_();_nop_();_nop_();_nop_();
CLK=1;_nop_();_nop_();_nop_();_nop_();
//第二个下降沿之前,设DI=0/1,选择CH0/CH1
CLK=0;DI=1;_nop_();_nop_();_nop_();_nop_();//DIO=CH
CLK=1;_nop_();_nop_();_nop_();_nop_();
//第三个下降沿之前,设DI=1
CLK=0;DI=1;_nop_();_nop_();_nop_();_nop_();
//第4-11,共八个下降沿读数据(MSB->LSB)
for(i=0;i<8;i++)
{
CLK=1;_nop_();_nop_();
CLK=0;_nop_();_nop_();
dat1=(dat1<<1)|DO;
}
//第11-18,共8个下降沿读数据(LSB->MSB?
for(i=0;i<8;i++)
{
dat2=dat2|((uchar)(DO)<
CLK=1;_nop_();_nop_();
CLK=0;_nop_();_nop_();
}
CS=1;
//return(dat1==dat2)?
dat1:
0;
return(dat2);
}
//如果MSB->LSB和LSB->MSB读取结果相同,则返回读取的结果,否则返回0}
//----------------------------------------获取AD转换结果(0通道)
voidAD0832_0()
{
ad=Get_AD_Result_0();
d=ad*500.0/255;
Display_Buffer[0]=d/100+'0';
Display_Buffer[2]=d/10%10+'0';
Display_Buffer[3]=d%10+'0';
}
voidAD0832_1()
{
ad=Get_AD_Result_1();
d=ad*500.0/255;
Display_Buffer[0]=d/100+'0';
Display_Buffer[2]=d/10%10+'0';
Display_Buffer[3]=d%10+'0';
}
voidLCD1602()
{
Set_Disp_Pos(0x01);
i=0;
while(Line1[i]!
='\0')
LCD_Write_Data(Line1[i++]);
Set_Disp_Pos(0x46);
i=0;
while(Display_Buffer[i]!
='\0')
LCD_Write_Data(Display_Buffer[i++]);
}
voidDA0808_0()
{
P2=ad;
}
voidDA0808_1()
{
P2=ad;
}
voidSay_hello()
{
Set_Disp_Pos(0x01);
i=0;
while(select[i]!
='\0')
LCD_Write_Data(select[i++]);
Set_Disp_Pos(0x46);
i=0;
while(Display_Chanel[i]!
='\0')
LCD_Write_Data(Display_Chanel[i++]);
}
voidChanel_0()
{
LCD_Write_Command(0x01);
AD0832_0();
LCD1602();
DA0808_0();
}
voidChanel_1()
{
LCD_Write_Command(0x01);
AD0832_1();
LCD1602();
DA0808_1();
}
voidkey_ru()
{if(k3==1)
if(INT1==0)
if(K1==0)
a=a+20;
if(K2==0)
b=b-20;
if(k3==0)
if(INT1==0)
if(K1==0)
a=a-20;
if(K2==0)
b=b+20;
}
voidBaojing()
{
intm;
intshangxian,xiaxian;
m=ad;
key_ru();
shangxian=m-b;
xiaxian=a-m;
if(shangxian>0||xiaxian>0)
P1_7=1;
else
P1_7=0;
}
voidKey_Scan()
{
if(key1==0)
{
DelayMS(5);
if(key1==0)
{
Chanel_0();
}
}
if(key2==0)
{
DelayMS(5);
if(key2==0)
{
Chanel_1();
}
}
}
voidmain()
{
key1=1;key2=1;
LCD_Initialise();
DelayMS(10);
Say_hello();
while
(1)
{
Key_Scan();
Baojing();
}
}