单片机温度控制器设计毕业论文(编辑修改稿)内容摘要:
xF8,0x80,0x90, 0x88,0x83,0xC6,0xA1,0x86, 0x8E,0xFF,0x0C,0x89,0x7F,0xBF }。 void Init8255() {unsigned char i,j。 for(j=0。 j10。 j++) for(i=0。 i255。 i++)。 XBYTE[PORT_CONTROL]=0x90。 LedsOff()。 } void turn_on(char led,char ChNumber,char mode) { if (mode== CA) XBYTE[PORT_C] =LED_CODES[ChNumber]。 else XBYTE[PORT_C] =~LED_CODES[ChNumber]。 XBYTE[PORT_B] =Select[led]。 } void LedsOff() { XBYTE[PORT_B]=0x00。 } include include void main() { unsigned int m。 unsigned char i。 Init8255()。 i=LEDS1。 while(1) { LedsOff()。 for(m= 50。 m!=0。 m)。 turn_on(i,i,CC)。 for(m= 50。 m!=0。 m)。 if(i==0)i=LEDS1。 else i。 } } 12 图 312 PID温控 器LED动态显示运行效果图 3 .3 .4 键盘监测基本原理 键盘犹如一个开关, 当键盘未闭合时,A点为高电平,当K闭合后,电路导通,A点电平拉低,如将A点以某种方式介入计算机系统,计算机就可以通过检测A点电平的高低来判别K键是否闭合。 在键的按下和松动过程中,电平都有一个抖动的过程,会引发键的误检测。 电平抖动过程一般持续5~10 ms ,对抖动过程的处理有硬件消抖和软件消抖,在键较少时可采用硬件方式。 但当按键较多时适合用软件消抖方式,如矩阵式键盘。 下图是独立式键盘的接线示意图。 其优点是电路简单,检测 方便;缺点是与矩阵键盘相比,占用太多 I/ O 口 ,浪费资源。 图 313 独立式键盘 13 下图是矩阵式键盘原理图。 图中的键盘为 4行 4列共 16个键,行扫描线为X0、 X X2, X3,列扫描线为 Y0、 Y Y Y3。 矩阵键盘的识别有行扫描法和行反转法两种。 图 314 矩阵式键盘原理图 PID 温控器的键盘设计及其 Proteus 仿真 在 6 位 LED 上利用矩阵式键盘实现将按键的行、列显示在 LED 的第 2位和 6 位上。 行扫描信号 R0~R3 来自于 51 单片机 P1 口的 ~,列扫描来自于 51 单片机的 、。 本次用到 的是行反转法识别按键,也就是说将行、列各接至一个端口,编程使 CPU 往行线说连端口全部输出低电平,然后从列线所连端口读入列线值。 如果有某一个键被按下,则必有一条列线位低电平,在进行反转,即将读入的列线值从列线所连的端口输出,在从行线所连端口读入行线的值,那么闭合键所对应的行线必位低电平。 在通过程序对所得列线值和行线值的处理,就可以识别出按键所对应的列号和行号。 图 315 键盘程序流程图如下: YES NO YES NO 初始化 8255A 求出行列号 六个显示数据都为“ ” 判断有无键按下 保存行列号 送选通信号 查表送取字型码 显示一个数据 是否是最后一位显示 结束 开始 14 图 316 PID温控器键盘原理图: 实 验程序 ; (如前) (如前) 按键检测程序 include include include void delay() {char i。 for(i=1000。 i!=0。 i)。 } char keyCheck(char*row,char*col) { unsigned char t1,t2,t3,i。 unsigned char Result=0。 P1=0xf0。 t1=P1。 if(t1== 0xf0)goto exit。 for(i= 11。 i!=0。 i) delay()。 t1=P1。 if(t1== 0xf0)goto exit。 Result= 1。 t2= 0x80。 t1=~t1。 15 for(i= 4。 i!=0。 i) {t3=t2amp。 t1。 if(t3!=0){*col=i1。 break。 } else t2=t2 1。 } t1=~t1。 t1= t1|0x0f。 P1=t1。 t1=P1。 t2= 0x08。 t1=~t1。 for(i=4。 i!=0。 i) {t3=t2amp。 t1。 if(t3!=0){*row=i1。 break。 } else t2= t2 1。 } exit: return Result。 } mian源程序 include include include extern char keyCheck(char*row,char*col)。 void main() {char row,col,r。 char strIndexs[6]={20,20,20,20,20,20}。 unsigned char i,k。 Init8255()。 while(1) { r=keyCheck(amp。 row,amp。 col)。 if(r== 0) {strIndexs[5]=20。 strIndexs[4]=20。 strIndexs[1]=20。 strIndexs[0]=20。 } else {strIndexs[5]=0。 strIndexs[1]=0。 strIndexs[4]=row。 strIndexs[0]=col。 } for(k= 6。 k!=0。 k) {LedsOff()。 for(i= i!=0。 i)。 turn_on(k1,strIndexs[k1],CC)。 for(i=i!=0。 i)。 16 } } } 图 317 程序仿真图 第 4 章 PID 温控器的炉温采样接口及仿真 在计算机实时 测量和智能化仪表等应用系统中,经常会遇到从时间到数值均连续变化的模拟量,如温度、压力、位移、速度等,与此相对应的电信号称为模拟信号。 因单片机只能处理数字量,因此这些模拟电信号必须转化为离散的数字信号,才能被送给单片机进行相应的处理。 将模拟信号转化为数字量的器件称为A/D 转换器,简称 A/D。 A/D 转化器的主要技术指标 分辨率 是指输出数字量变化的一个相邻数码所需要输入模拟电压的变化量。 习惯上用输出的二进 制位数或 BCD 码位数表示。 例如,分辨率为 12 位的 A/D 转换器,表示该转化器的输出数据可以用 2^12 个二进制数进行量化。 分辨率用呗分数表示如下: 1/2^12 *100%=1/4096 *100%=% 故一个满刻度为 10V的 12位 A/D转换器能够分辨输入电压变化的最小值为。 量化误差是指由 A/D 转换器的优先分辨率多引起的误差。 若不考虑其他误差的影响,一个分辨率有限的 A/D 转换器的阶梯状转移特性曲线与具有无限分辨率的A/D 转换器转移特性曲线(直线)之间的最大误差,称为误差量化。 提高分辨率能够减少量化误差。 转换精度是指 A/D 转换器的时间量化值与理想 A/D 转换器的差值。 转换精度可以分为绝对精度和相对精度,是由非线性、零点刻度、满量程刻度以及温漂等因 17 素所引起的误差。 转换速率就是指能够重复进行数据转换的速度,即每秒转换的次数。 而完成一次的 A/D 转换所需要的时间,则是转换速率的倒数。 PID温控器 A/D转换编程方法 采用的是端口查询方式,先向 51 单片机 1,然后读入 P3口。 检查 0,不为 0则重新读入 P3 在检测,直到 0 ,此时表示数据转换过程已结束,读片外地址 0x2XXX, P1, /RD为低电平,经 74LS02 反向为高电平,向 ADC0808 的 OE 送读数据的信号, ADC0808 将转换结果从Out7~Out0送到数据总线并读入 CPU。 实现在 LED上显示读取的 A/D转换值。 程序流程图如下; 实验硬件图 YES 初始化 8255A 启动 AD 转换 保存通道号和数据组 取输入数据 设置显示位数 i 关闭全部 LED 1ms延时 查表送取字型码 显示一 个数据 是否是最后一位显示 结束 送字选 通信号 开始 18 实验程序 (如前) 主程序 include include include define ADC_0808 1 define ADC0808_DATA_PORT 0x20xx define ADC0808_QUERY_PORT 0x4000 define ADC0808_START_PORT 0x20xx unsigned char getData2(unsigned char ADC_Chip,unsigned char channel) { unsigned char flag= 0。 unsigned char value= 1。 unsigned xdata ale。 switch (ADC_Chip) { case ADC_0808: P3= P3|0x08。 XBYTE[ADC0808_START_PORT]= channel。 P3= P3amp。 0xdf。 P3= P3|0x20。 P3= P3amp。 0xdf。 flag= P3。 while(1) { ale= 1。 flag=flag amp。 0x08。 if(flag==0) break。 flag= P3。 } value= XBYTE[ADC0808_DATA_PORT]。 return value。 break。 } } void dispStr(char strIndexs[],unsigned char value,char channel) { char i,k。 for(i= 0。 i3。 i++) { strIndexs[i]= value%10。 value= value/10。 19 } strIndexs[4]= channel。 LedsOff()。 for(i=i!=0。 i)。 for(k=6。 k!=0。 k) { LedsOff()。 for(i=i!=0。 i)。 turn_On(k1。单片机温度控制器设计毕业论文(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。