PT100测温仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h> //包含_nop_()函数定义的头文件
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit SDA1=128;//串行数据输入,对应595的14脚SER
- sbit SCL1=129;//移位寄存器时钟输入,对应595的11脚SCK
- sbit SCL2=130;//存储寄存器时钟输入,对应595的12脚RCK
- sbit SDA2=131;//串行数据输入,对应595的14脚SER
- sbit SCL3=132;//移位寄存器时钟输入,对应595的11脚SCK
- sbit SCL4=133;//存储寄存器时钟输入,对应595的12脚RCK
- //ADC0832端口引脚定义
- sbit CS=P1^0;//将CS位定义为P3.4引脚
- sbit CLK=P1^1;//将CLK位定义为P1.0引脚
- sbit DIO=P1^2;//将DIO位定义为P1.1引脚
- sbit k1=161;//加按键
- sbit k2=162;//减按键
- sbit k3=160;//设置按键
- sbit beep=163;//蜂鸣器
- uchar aa=60,bb=10,num;
- //以下是LCD1602驱动程序
- void delay1000(uint aaaaaa)
- {
- uint bbbbbb,cccccc;
- for(bbbbbb=aaaaaa;bbbbbb>0;bbbbbb--)
- for(cccccc=110;cccccc>0;cccccc--);
- }
- void delay(uint z)
- {
- uint x,y;
- for(x=100;x>1;x--)
- for(y=z;y>1;y--);
- }
- void in(uchar dddddd)
- {
- uchar eeeeee;
- for(eeeeee=0;eeeeee<8;eeeeee++) //循环8次,刚好移完8位
- {
- dddddd<<=1;
- SCL1=CY;
- SDA1=1; //先将移位寄存器控制引脚置为低
- _nop_();
- _nop_();
- SDA1=0;
- }
- }
- void out()
- {
- SCL2=0; //先将存储寄存器引脚置为低
- _nop_();
- SCL2=1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
- _nop_();
- SCL2=0;
- }
- void in1(uchar ffffff)
- {
- uchar gggggg;
- for(gggggg=0;gggggg<8;gggggg++) //循环8次,刚好移完8位
- {
- ffffff<<=1;
- SCL3=CY;
- SDA2=1; //先将移位寄存器控制引脚置为低
- _nop_();
- _nop_();
- SDA2=0;
- }
- }
- void out1()
- {
- SCL4=0; //先将存储寄存器引脚置为低
- _nop_();
- SCL4=1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
- _nop_();
- SCL4=0;
- }
- void write_com(uchar hhhhhh)
- {
- in(248);//再传段码
- out();
- delay1000(2);//延迟时间2ms以内
- in1(hhhhhh); //再传段码
- out1();
- delay1000(2); //延迟时间2ms以内
- in(252);//再传段码
- out();
- delay1000(2);//延迟时间2ms以内
- in(248);//再传段码
- out();
- delay1000(2);//延迟时间2ms以内
- }
- void write_date(uchar iiiiii)
- {
- in(249);//再传段码
- out();
- delay1000(2);//延迟时间2ms以内
- in1(iiiiii); //再传段码
- out1();
- delay1000(2); //延迟时间2ms以内
- in(253);//再传段码
- out();
- delay1000(2);//延迟时间2ms以内
- in(249);//再传段码
- out();
- delay1000(2);//延迟时间2ms以内
- }
- //LCD1602液晶初始化子函数
- void init_LCD1602()
- {
- write_com(56);
- write_com(12);
- write_com(6);
- write_com(128);
- write_com(1);
- write_com(0xc0);
- write_date('T');
- write_date('H');
- write_date('=');
- write_date(48+aa/100);
- write_date(48+aa%100/10);
- write_date(48+aa%10);
- write_date(' ');
- write_date(' ');
- write_date('T');
- write_date('L');
- write_date('=');
- write_date(48+bb/100);
- write_date(48+bb%100/10);
- write_date(48+bb%10);
- }
- //ADC0832模数转换芯片采集子函数
- uchar A_D()
- {
- uchar aaa,bbb;
- CS=1; //一个转换周期开始
- CLK=0; //为第一个脉冲作准备
- CS=0; //CS置0,片选有效
- DIO=1; //DIO置1,规定的起始信号
- CLK=1; //第一个脉冲
- CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
- DIO=1; //DIO置1, 通道选择信号
- CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
- CLK=0; //第二个脉冲下降沿
- DIO=0; //DI置0,选择通道0
- CLK=1; //第三个脉冲
- CLK=0; //第三个脉冲下降沿
- DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
- CLK=1; //第四个脉冲
- for(aaa=0;aaa<8;aaa++) //高位在前
- {
- CLK=1; //第四个脉冲
- CLK=0;
- bbb<<=1; //将下面储存的低位数据向右移
- bbb|=(uchar)DIO; //将输出数据DIO通过或运算储存在dat最低位
- }
- CS=1; //片选无效
- return bbb; //将读书的数据返回
- }
- //按键扫描子函数
- void key()
- {
- if(k3==0)//设置按键
- {
- delay(10);
- if(k3==0)
- { //设置位置设定
- while(k3==0);
- num++;
- if(num==1) // 无设置位置
- {
- write_com(0xc0+5);//液晶第二行第4个位置
- write_com(0x0f);//光标闪烁
- }
- if(num==2)//光标闪烁
- {
- write_com(0xc0+13);
- }
- if(num==3)//正常模式
- {
- num=0;//num值清0
- write_com(0x0c);//光标不闪烁
- }
- }
- }
- if(k1==0)
- {
- delay(10);
- if(k1==0)
- {
- if(num==1)
- {
- aa++;
- if(aa>110)
- aa=bb+10;
- write_com(0xc5);
- write_date(48+aa%10);
- write_com(0xc3);
- write_date(48+aa/100);
- write_com(0xc4);
- write_date(48+aa%100/10);
- }
- if(num==2)
- {
- bb++; //bbbbb1>aaaaa1时 是个错误,这里避免此情况发生
- if(bb>=aa)
- bb=aa-10;
- write_com(0xc0+13);
- write_date(48+bb%10);
- write_com(0xc0+11);
- write_date(48+bb/100);
- write_com(0xc0+12);
- write_date(48+bb%100/10);
- }
- }
- while(k1==0);
- }
- if(k2==0)
- {
- delay(10);
- if(k2==0)
- {
- if(num==1)
- {
- aa--; //aaaaa1<bbbbb1时 是个错误,这里避免此情况发生
- if(aa<=bb)
- aa=aa+10;
- write_com(0xc5);
- write_date(48+aa%10);
- write_com(0xc3);
- write_date(48+aa/100);
- write_com(0xc4);
- write_date(48+aa%100/10);
- }
- if(num==2)
- {
- if(bb>0)
- bb--;
- if(bb==0)
- bb=0;
- write_com(0xc0+13);
- write_date(48+bb%10);
- write_com(0xc0+11);
- write_date(48+bb/100);
- write_com(0xc0+12);
- write_date(48+bb%100/10);
- }
- }
- while(k2==0);
- }
- }
- void display()//u=2.55+T/100, 2.55反映在AD上为0x83
- {
- uchar aaaa,bbbb,cccc; //储存A/D转换后的值
- uchar tab[4];
- aaaa=A_D(); //进行A/D转换
- aaaa=aaaa-0x83;
- bbbb=aaaa*2-4;
- if(bbbb<=110)
- {
- bbbb=bbbb-2;
- tab[3]=bbbb/100;
- tab[2]=bbbb/10-tab[3]*10;
- tab[1]=bbbb%10;
- tab[0]=cccc%5*2;
- write_com(0x80);
- write_date('T');
- write_date('=');
- write_date(48+tab[3]);
- write_date(48+tab[2]);
- write_date(48+tab[1]);
- write_date('.');
- write_date(48+tab[0]);
- if(bbbb>aa)
- {
- beep=0;
- }
- else
- beep=1;
- if(bbbb<bb)
- {
- beep=0;
- }
- else
- beep=1;
- }
- else
- {
- bbbb=256-bbbb;
- tab[3]=11;
- tab[2]=bbbb/10;
- tab[1]=bbbb%10;
- tab[0]=cccc%5*2;
- write_com(0x80);
- write_date('T');
- write_date('=');
- write_date('-');
- write_date(48+tab[2]);
- write_date(48+tab[1]);
- write_date('.');
- write_date(48+tab[0]);
-
- }
- }
- //主函数
- void main()
- {
- init_LCD1602(); //将液晶初始化
- while(1)
- {
- if(num==0)
- {
- display();
- }
- else
- beep=1;
- key();
- }
- }
复制代码
所有资料51hei提供下载:
1、源程序.zip
(32.46 KB, 下载次数: 242)
2、仿真图.zip
(69.53 KB, 下载次数: 229)
|