|
給大家分享一個51單片機(jī)雙積分式AD轉(zhuǎn)換的Proteus仿真,下面是原理圖:
0.png (58.61 KB, 下載次數(shù): 188)
下載附件
2016-10-12 15:55 上傳
0.png (54.91 KB, 下載次數(shù): 167)
下載附件
2016-10-12 15:56 上傳
0.png (58.89 KB, 下載次數(shù): 166)
下載附件
2016-10-12 15:54 上傳
單片機(jī)雙積分式AD轉(zhuǎn)換的所有資料下載(包含源程序和proteus仿真):
單片機(jī)雙積分式AD轉(zhuǎn)換電路源程序Proteus仿真.rar
(63.1 KB, 下載次數(shù): 170)
2016-10-12 15:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
單片機(jī)源程序:
- /*-------------------------------------------------------------------
- LCD1602.c 1602用的函數(shù)
-
- 作者:liunian
- 郵箱:liunian_leon@sohu.com
- 日期:7.13
-
- 版本:V1.0 適合初學(xué)者使用
- -------------------------------------------------------------------*/
- #include<reg51.h>
- #include<absacc.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit EN=P2^2; //使能信號
- sbit RW=P2^1; //讀寫控制信號
- sbit RS=P2^0; //數(shù)據(jù)命令選擇端口
- sbit P34=P3^4;
- sbit P35=P3^5;
- #define D_port P0 //傳送數(shù)據(jù)的端口設(shè)為P0,以上端口根據(jù)實際硬件電路圖可做修改
- uint ss,lo,loo;
- uchar kl = 0;
- unsigned char code love[]="Dual Integral AD";
- unsigned char code no[]=" ";
- unsigned char code time[]="0123456789ABCDEF:MinHour ";
- unsigned char code tin[]= "Vin:";
- unsigned char code tvref[]="Vref:";
- /****************1MS延時函數(shù)******************************/
- void delay(unsigned int n)
- {
- unsigned int i,j;
- for(j=n;j>0;j--)
- for(i=112;i>0;i--);
- }
- /*液晶***************查詢液晶是否忙*************************/
- void Checkbusy()
- {
-
- D_port=0xff; //P0全部置1,可以查詢判斷P0口狀態(tài),讀取液晶的命令
- RS=0;
- RW=1;
- EN=1;
- _nop_(); //讀液晶命令時各控制位的狀態(tài)幾時序
- while(D_port&0x80) //判斷最高位狀態(tài),最高位是液晶忙的狀態(tài)位
- {
- EN=0;
- _nop_();
- _nop_();
- EN=1;
- _nop_();
- _nop_();
- } //如果液晶忙,則循環(huán)查詢
- EN=0;
- }
- /*液晶***************寫數(shù)據(jù)到液晶***************************/
- D_write(uchar a)
- {
- Checkbusy(); //檢查忙標(biāo)志位
- D_port=a;
- RS=1;
- RW=0;
- EN=1; //寫數(shù)據(jù)各控制位的值既對應(yīng)的時序
- _nop_();
- _nop_();
- _nop_(); //發(fā)送數(shù)據(jù),此處是發(fā)送到P0口,程序前已經(jīng)定義
- EN=0;
- }
- /*液晶***************寫指令到液晶***************************/
- C_write(uchar a)
- {
- Checkbusy(); //檢查忙標(biāo)志位
- D_port=a;
- RS=0;
- RW=0;
- EN=1; //寫指令各控制位的值既對應(yīng)的時序
-
- _nop_();
- _nop_();
- _nop_(); //發(fā)送指令,此處是發(fā)送到P0口,程序前已經(jīng)定義
- EN=0;
- }
- /*液晶**************液晶初始化******************************/
- Initial()
- {
- D_port=0;
- delay(20);
- C_write(0x38);
- delay(10);
- C_write(0x38);
- delay(10);
- C_write(0x38);
- delay(10);
- Checkbusy();
- C_write(0x38);
- Checkbusy();
- C_write(0x08); //關(guān)閉顯示
- Checkbusy();
- C_write(0x01); //清屏
- Checkbusy();
- C_write(0x06); //顯示光標(biāo)右移設(shè)置
- Checkbusy();
- C_write(0x0c); //顯示開,光標(biāo)不顯示,不閃爍
- delay(5);
- } //根據(jù)1602初始化的指令順序來初始化LCD,相關(guān)初始化步驟可查閱相關(guān)資料
- /*液晶**************設(shè)定顯示位置函數(shù)************************/
- setpos(uchar posx,uchar posy)
- {
- posx=posx&0xf; //將顯示在第幾位置轉(zhuǎn)為二十六進(jìn)制,每行總共16個位置
- posy=posy&0x1; //設(shè)置顯示在第幾行
- C_write(posx|posy*0x40+0x80); //設(shè)置位置命令最高位必須為一,所以要加0x80
- }
- /*液晶**************顯示一個字符子程序**********************/
- displaychar(uchar x,uchar y,uchar a)
- {
- Checkbusy(); //檢查忙標(biāo)志位
- setpos(x,y); //設(shè)置顯示位置
- D_write(a); //將要顯示的數(shù)據(jù)寫到液晶
- }
- /*液晶**************顯示一串字符串**************************/
- displaystring(uchar x,uchar y,unsigned char code *string)
- {
- uchar length=0; //定義一個字符串長度
- Checkbusy();
- while(string[length]!='\0') //字符串是以'\0'結(jié)束的,因此只要每結(jié)束就顯示下一字符
- {
- displaychar(x,y,string[length++]); //顯示一個字符子程序
- x++; //液晶顯示的位置+1
- }
- }
- /*液晶**************顯示個數(shù)**************************/
- void lcd_byte(unsigned char x, unsigned char y ,unsigned int byte_data) //以十進(jìn)制的方式顯示一個字符變量
- {
- unsigned int temp_data;
- temp_data=byte_data/10000; //求萬位數(shù)
- displaychar(x+0,y,temp_data+48); //轉(zhuǎn)化為ASCII值再顯示
- temp_data=byte_data % 10000 /1000; //求千位數(shù)
- displaychar(x+1,y,temp_data+48); //轉(zhuǎn)化為ASCII值再顯示
-
- temp_data=byte_data%1000/100; //求百位數(shù)
- displaychar(x+2,y,temp_data+48); //轉(zhuǎn)化為ASCII值再顯示
-
- temp_data=byte_data%100/10; //求十位數(shù)
- displaychar(x+3,y,temp_data+48); //轉(zhuǎn)化為ASCII值再顯示
-
- temp_data=byte_data%10; //求個位數(shù)
- displaychar(x+4,y,temp_data+48); //轉(zhuǎn)化為ASCII再再顯示
- }
- void my_t0(void) interrupt 1 //定時器0中斷用于固定時間對輸入待測電壓進(jìn)行積分
- {
- TR0 = 0; //T0中斷關(guān)
- P34=1; //選擇-2.5V基準(zhǔn)
- TH0 = 0;
- TL0 = 0;
- //lo=lo+1;
- //TMOD=TMOD | 0x8;
- //TF0 = 0; //清除T0中斷標(biāo)志
- TR0 = 1; //T0中斷開
- EX0 = 1; //INT0中斷開
- }
- void my_int0(void) interrupt 0 //外部中斷 用于反積分過程結(jié)束檢測
- {
- TR0 = 0; //T0中斷關(guān)
- TF0 = 0; //清除T0中斷標(biāo)志
- EX0 = 0; //INT0中斷關(guān)
- ss = TH0 * 256 + TL0;
- P34=1; //選擇-2.5V基準(zhǔn)
- // P35=1; //選擇放電
- TH0 = 0;
- TL0 = 0;
- kl = 0;
- }
- main()
- {
- Initial();
- P34=1; //選擇-2.5V基準(zhǔn)
- //P35=1; //選擇放電
- displaystring( 0, 0, love);
- delay(500);
- displaystring( 0, 0, no);
- displaystring( 0, 1, tvref);
- EA = 1; //中斷開
- ET0 = 1; //定時計數(shù)0中斷開
- IP = 1; //定時0中斷最高優(yōu)先級 =2
- TMOD = 1; //定時0模式1 2個16位定時/計數(shù)器
- TCON=0x00; //INT0負(fù)邊緣觸發(fā)或低電平觸發(fā)在此好象作用相同
- displaystring( 0, 0, tin);
- while(1)
- {
- if(kl==0)
- {
- P34=1; //選擇-2.5V基準(zhǔn)
- //P35=1; //選擇放電
- delay(26);
- TMOD = 1;
- TH0 = 0x63;
- TL0 = 0xC0;
- //loo=loo+1;
- P34=0; //選擇輸入電壓基準(zhǔn)
- //P35=0; //選擇測量
- kl = 1;
- TR0 = 1; //定時計數(shù)0起動
- TF0 = 0; //清除T0中斷標(biāo)志
- }
- delay(500);
- //lo=ss*0.0773;
- loo=ss-lo;
- if(loo>32767)
- {loo=65535-loo;}
- lo=ss;
- lcd_byte(5,0,ss);
- lcd_byte(5,1,loo);
- //lcd_byte(11,1,loo);
- }
- }
復(fù)制代碼
|
評分
-
查看全部評分
|