|
單片機(jī)電壓表仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (20.79 KB, 下載次數(shù): 114)
下載附件
2017-12-1 21:09 上傳
word格式的詳細(xì)教程(實(shí)驗(yàn)指導(dǎo)):
0.png (226.01 KB, 下載次數(shù): 70)
下載附件
2017-12-1 21:12 上傳
A/D芯片ADC0809的應(yīng)用原理;
1602數(shù)字字符液晶模塊的應(yīng)用原理
自動(dòng)換擋數(shù)字電壓表就是一個(gè)能自動(dòng)切換擋程的數(shù)字電壓表,可以測(cè)量0~20V的電壓,并且有0~0.2V、0~2V和0~20V三個(gè)擋程可供選擇,當(dāng)待測(cè)量電壓值發(fā)生變化之后,電壓表可以根據(jù)輸入電壓的情況自動(dòng)選擇合適的擋程進(jìn)行測(cè)量,并且把測(cè)量結(jié)果顯示出來(lái)。
0.png (22.98 KB, 下載次數(shù): 74)
下載附件
2017-12-1 21:11 上傳
單片機(jī)源程序如下:
- #include <AT89X52.H>
- #define LEDDATA P0 //LCD連接引腳
- #define v20_on {s3=0;s2=0;s1=1;} //宏定義不同量程,不同的開關(guān)狀態(tài)
- #define v2_on {s3=0;s2=1;s1=0;}
- #define v02_on {s3=1;s2=0;s1=0;}
- unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
- unsigned char dispbuf[8]={0,0,0,0,0,0,0,0};
- unsigned char getdata;
- unsigned long temp;
- unsigned char i,k,l,m;
- unsigned char code mytable0[]=" Welcome to use ";
- unsigned char code mytable1[]="Auto Voltmeter!";
- unsigned char code line0[]=" Voltmeter "; //初始化顯示
- unsigned char code line1[]=" Value: V ";
- //引腳定義
- sbit lcdrs=P2^0; //RS端
- sbit lcden=P2^1; //E使能端
- sbit s3=P3^7; //地址輸入引腳,用于選擇輸入通道
- sbit s2=P3^6; //通道s1,s2,s3
- sbit s1=P3^5;
- sbit OE=P3^0; //輸出允許控制端,用于打開三態(tài)數(shù)據(jù)輸出鎖存器
- sbit EOC=P3^1; //轉(zhuǎn)換結(jié)束信號(hào)輸出引腳,開始轉(zhuǎn)換時(shí)為低電平,當(dāng)轉(zhuǎn)換結(jié)束時(shí)為高電平
- sbit ST=P3^2; //ADC中start開始,時(shí)鐘信號(hào)輸入引腳
- void delay(unsigned int z) //延時(shí)子函數(shù) z*1ms
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(unsigned char c) //寫命令子函數(shù)
- {
- lcdrs=0; //低電平選擇為 寫指令
- lcden=0;
- LEDDATA=c; //把指令寫入P0口
- delay(5); //參考時(shí)序圖
- lcden=1; //開使能
- delay(5); //讀取指令
- lcden=0; //關(guān)閉使能
- }
- void write_data(unsigned char d) //寫數(shù)據(jù)子函數(shù)
- {
- lcdrs=1; //高電平選擇為 寫數(shù)據(jù)
- LEDDATA=d; //把數(shù)據(jù)寫入P0口
- delay(5); //參考時(shí)序圖
- lcden=1; //開使能
- delay(5); //讀取數(shù)據(jù)
- lcden=0; //關(guān)閉使能
- }
- void initialize() //LCD初始化函數(shù)
- {
- unsigned char num;
- lcden=0; //關(guān)閉使能
- write_com(0x38); //設(shè)置16x2顯示,5x7點(diǎn)陣顯示,8位數(shù)據(jù)接口
- write_com(0x0c); //00001DCB,D(開關(guān)顯示),C(是否顯示光標(biāo)),B(光標(biāo)閃爍,光標(biāo)不顯示)
- write_com(0x06); //000001N0,N(地址指針+-1)
- write_com(0x01); //清屏指令 每次顯示下一屏內(nèi)容時(shí),必須清屏
- write_com(0x80+0x10); //第一行,頂格顯示
- for(num=0;num<17;num++)
- {
- write_data(mytable0[num]);
- delay(10);
- }
- write_com(0x80+0x50); //第二行,從第一格開始顯示
- for(num=0;num<15;num++)
- {
- write_data(mytable1[num]);
- delay(10);
- }
- for(num=0;num<16;num++)
- {
- write_com(0x1c); //0001(S/C)(R/L)**; S/C:高電平移動(dòng)字符,低電平移動(dòng)光標(biāo); R/L:高電平左移,低電平右移
- delay(300);
- }
- delay(1000);
-
- write_com(0x01); //清屏指令 每次顯示下一屏內(nèi)容時(shí),必須清屏
- write_com(0x80);
- for(num=0;num<14;num++)
- {
- write_data(line0[num]);
- delay(10);
- }
- write_com(0x80+0x40);
- for(num=0;num<15;num++)
- {
- write_data(line1[num]);
- delay(10);
- }
- }
- void value(unsigned char add,unsigned char dat) //測(cè)試電壓值
- {
- write_com(0x80+0x47+add);
- if(l==3&&add==2||l!=3&&add==1)
- {
- write_data(0x2e);
- }
- else
- {
- write_data(0x30+dat);
- }
- }
- main()
- {
- initialize(); //LCD顯示屏初始化
- while(1)
- _20v:
- {
- v20_on; //選擇通道s1
- ST=0;
- ST=1;
- ST=0;
- while(EOC==0); //轉(zhuǎn)換結(jié)束信號(hào)輸出引腳,開始轉(zhuǎn)換時(shí)為低電平
- OE=1; //輸出允許控制端,用于打開三態(tài)數(shù)據(jù)輸出鎖存器
- getdata=P1; //將p1口值經(jīng)過轉(zhuǎn)換賦給getdata
- OE=0; //關(guān)閉三態(tài)數(shù)據(jù)輸出鎖存器
- if(getdata<21)
- {
- goto _2v;
- }
- l=3; //v20_on {s3=0;s2=0;s1=1;}
- //l=3表示第3位,s1通道
- temp=getdata;
- temp=(temp*1000/51)/2;
- goto disp;
- _2v:
- v2_on; //通道s2
- ST=0;
- ST=1;
- ST=0;
- while(EOC==0); //開始轉(zhuǎn)換
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata<21)
- {
- goto _02v;
- }
- else if(getdata>200)
- {
- goto _20v;
- }
- l=2; //v2_on {s3=0;s2=1;s1=0;}
- // l=2表示第2位,s2通道
- temp=getdata;
- temp=(temp*1000/51)/2;
- goto disp;
- _02v:
- v02_on; //通道s3
- ST=0;
- ST=1;
- ST=0;
- while(EOC==0);
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata>200)
- {
- goto _2v;
- }
- l=1; //v02_on {s3=1;s2=0;s1=0;}
- // l=1表示第1位,s3通道
- temp=getdata;
- temp=(temp*1000/51)/2;
- m=temp%10;
- if(m>5){temp=temp/10+1;}
- else{temp=temp/10;}
- goto disp;
- disp: for(i=0;i<=3;i++)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址:
自動(dòng)換擋電壓表.rar
(4.13 MB, 下載次數(shù): 307)
2017-12-1 20:03 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|