PT100測溫仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (18.83 KB, 下載次數: 65)
下載附件
2019-6-17 13:13 上傳
0.png (17.65 KB, 下載次數: 58)
下載附件
2019-6-17 13:09 上傳
單片機源程序如下:
- #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)
2019-6-16 20:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
2、仿真圖.zip
(69.53 KB, 下載次數: 229)
2019-6-16 20:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|