基于51單片機的TCL1865電壓測量仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (20.07 KB, 下載次數: 42)
下載附件
2017-7-28 00:00 上傳
0.png (36.93 KB, 下載次數: 47)
下載附件
2017-7-27 23:59 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define disp_dot 0x2e
- #define disp_V 0x56
- #define data1602 P0 // 定義LCD1602數據接口
- uchar code disp_code[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
- ulong voltage_data;
- sbit rs1602 = P2^4;
- sbit rw1602 = P2^5;
- sbit e1602 = P2^6;
- sbit CONV=P1^0;
- sbit SCK=P1^1;
- sbit SDO=P1^2;
- sbit SDI =P1^3;
- void delay (uint ms)
- {
- uint i,j;
- for(i=ms;i>0;i--)
- for(j=110;j>0;j--);
- }
- /* LCD1602寫入數據 */
- void write_1602(uchar wdata)
- {
- data1602 = wdata;
- rs1602 = 1;
- rw1602 = 0;
- e1602 = 1;
- delay(4);
- e1602 = 0;
- }
-
- /*LCD1602寫命令*/
- void write_order(uchar odata)//
- {
- data1602 = odata;
- rs1602 = 0;
- rw1602 = 0;
- e1602 = 1;
- delay(4);
- e1602 = 0;
- }
- /*LCD1602初始化*/
- void init_1602(void)//
- {
- write_order(0x01); // 清屏幕
- write_order(0x38); // 數據長度為8位,雙行顯示,5*7字符
- write_order(0x0c); // 打開顯示開關,光標不閃爍
- write_order(0x06); // 地址計數遞增,顯示屏不移動
- }
- /*LCD1602寫位置*/
- void position(uchar row,uchar colum)
- {
- uchar pos;
- if(row==1)
- {
- pos=0x80+colum;
- }
- else
- {
- pos=0xC0+colum;
-
- }
- write_order(pos);
- }
- /*LCD1602字符串*/
- void write_byte(uchar *s)//
- {
- for(;*s!='\0';s++)
- {
- write_1602(*s);
- }
- }
- /*讀LTC1865通道0的AD值*/
- void read_adc_ch0(void)
- {
- uchar j;
- voltage_data = 0;
- SDO = 1;
- CONV = 1; // 開啟AD轉換
- SCK = 1;
- CONV = 0;
- SCK = 0;
- for(j=15;j>0;j--)
- {
- SCK = 0;
- if(j == 15)
- {
- SDI = 1;
- }
- if(j == 14)
- {
- SDI = 0;
- }
- if(SDO==1)
- {
- voltage_data = voltage_data + 1;
- }
- voltage_data <<= 1;
- SCK = 1;
- }
- CONV = 1;
- SCK = 1;
- }
- /*讀LTC1865通道1的AD值*/
- void read_adc_ch1(void)
- {
- uchar j;
- voltage_data = 0;
- SDO = 1;
- CONV = 1; // 開啟AD轉換
- SCK = 1;
- CONV = 0;
- SCK = 0;
- for(j=15;j>0;j--)
- {
- SCK = 0;
- if(j == 15)
- {
- SDI = 1;
- }
- if(j == 14)
- {
- SDI = 1;
- }
- if(SDO==1)
- {
- voltage_data = voltage_data + 1;
- }
- voltage_data <<= 1;
- SCK = 1;
- }
- CONV = 1;
- SCK = 1;
- }
- /* 顯示通道電壓*/
- void disp_voltage(uchar i)
- {
- switch(i)
- {
- case 0:
- read_adc_ch0();
- position(1,0);
- write_byte("CHANNEL0=");
- break;
- case 1:
- read_adc_ch1();
- position(1,0);
- write_byte("CHANNEL1=");
- break;
- }
- voltage_data = (voltage_data*5000)/65536; // AD采樣值處理
- write_order(0x89);
- write_1602(disp_code[voltage_data/1000]);
- write_order(0x8b);
- write_1602(disp_code[voltage_data%1000/100]);
- write_order(0x8c);
- write_1602(disp_code[voltage_data%1000%100/10]);
- write_order(0x8d);
- write_1602(disp_code[voltage_data%1000%100%10]);
- }
- /* 發送通道電壓*/
- void send_voltage(uchar i)
- {
- switch(i)
- {
- case 0:
- SBUF=67;while(!TI);TI=0;
- SBUF=72;while(!TI);TI=0;
- SBUF=65;while(!TI);TI=0;
- SBUF=78;while(!TI);TI=0;
- SBUF=78;while(!TI);TI=0;
- SBUF=69;while(!TI);TI=0;
- SBUF=76;while(!TI);TI=0;
- SBUF=48;while(!TI);TI=0;
- SBUF=61;while(!TI);TI=0;
- read_adc_ch0();
- break;
- case 1:
- SBUF=67;while(!TI);TI=0;
- SBUF=72;while(!TI);TI=0;
- SBUF=65;while(!TI);TI=0;
- SBUF=78;while(!TI);TI=0;
- SBUF=78;while(!TI);TI=0;
- SBUF=69;while(!TI);TI=0;
- SBUF=76;while(!TI);TI=0;
- SBUF=49;while(!TI);TI=0;
- SBUF=61;while(!TI);TI=0;
- read_adc_ch1();
- break;
- }
- voltage_data = (voltage_data*5000)/65536; // AD采樣值處理
- SBUF=voltage_data/1000+48;while(!TI);TI=0;
- SBUF=46;while(!TI);TI=0;
- SBUF=voltage_data%1000/100+48;while(!TI);TI=0;
- SBUF=voltage_data%1000%100/10+48;while(!TI);TI=0;
- SBUF=voltage_data%1000%100%10+48;while(!TI);TI=0;
- SBUF=86;while(!TI);TI=0;
- SBUF=32;while(!TI);TI=0;
- SBUF=32;while(!TI);TI=0;
- }
- /*寫入小數點和電壓單位符號*/
- void disp_symbol(void)
- {
- position(1,10);
- write_1602(disp_dot);
- position(1,15);
- write_1602(disp_V);
-
- }
- void disp_logo()
- {
- unsigned char i;
- unsigned char *p;
- p="VOLTAGE MEASURE";
- delay(10);
- position(1,0);
- write_byte(" HELLO WORLD ");
- for(i=0;i<15;i++)
- {
- position(2,i);
- write_1602(*p);
- p++;
- delay(250);
- }
- delay(250);
- i=0;
- }
- void uart_init(void)
- {
- TMOD=0x20;
- SM0=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
電壓測量系統.rar
(66.47 KB, 下載次數: 77)
2017-7-27 21:52 上傳
點擊文件名下載附件
基于51單片機的TCL1865電壓測量系統 下載積分: 黑幣 -5
|