環境keil5 、proteus8.6
如果版本過高無法打開 聯系作者q1562335917
主要是8951運用AD1674和LCD1602來測量電壓與數顯電壓值
LCD1602+AD1674仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):
局部.PNG (55.68 KB, 下載次數: 59)
下載附件
電路圖
2017-10-28 16:02 上傳
數顯.PNG (24.67 KB, 下載次數: 38)
下載附件
測量數據
2017-10-28 16:02 上傳
單片機源程序如下:
- #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include<intrins.h>
- sbit RS = P3^4; //定義端口
- sbit RW = P3^5;
- sbit EN = P3^6;
- sbit STS=P3^3;
- sbit CE = P3^2;
- sbit CS =P3^1;
- sbit RC =P3^0;
- #define RS_CLR RS=0
- #define RS_SET RS=1
- #define RW_CLR RW=0
- #define RW_SET RW=1
- #define EN_CLR EN=0
- #define EN_SET EN=1
- #define uchar unsigned char
- #define uint unsigned int
- #define DataPort P1
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*------------------------------------------------
- 判忙函數
- ------------------------------------------------*/
- bit LCD_Check_Busy(void)
- {
- DataPort= 0xFF;
- RS_CLR;
- RW_SET;
- EN_CLR;
- _nop_();
- EN_SET;
- return (bit)(DataPort & 0x80);
- }
- /*------------------------------------------------
- 寫入命令函數
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- // while(LCD_Check_Busy()); //忙則等待
- DelayMs(5);
- RS_CLR;
- RW_CLR;
- EN_SET;
- DataPort= com;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 寫入數據函數
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- //while(LCD_Check_Busy()); //忙則等待
- DelayMs(5);
- RS_SET;
- RW_CLR;
- EN_SET;
- DataPort= Data;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 清屏函數
- ------------------------------------------------*/
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- DelayMs(5);
- }
- /*------------------------------------------------
- 寫入字符串函數
- ------------------------------------------------*/
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x); //表示第一行
- }
- else
- {
- LCD_Write_Com(0xC0 + x); //表示第二行
- }
- while (*s)
- {
- LCD_Write_Data( *s);
- s ++;
- }
- }
- /*------------------------------------------------
- 寫入字符函數
- ------------------------------------------------*/
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xC0 + x);
- }
- LCD_Write_Data( Data);
- }
- /*------------------------------------------------
- 初始化函數
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38); /*顯示模式設置*/
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標移動設置*/
- DelayMs(5);
- LCD_Write_Com(0x0C); /*顯示開及光標設置*/
- }
- /*------------------------------------------------
- AD轉換函數
- ------------------------------------------------*/
- double AD()
- {
- double i,j,k;
- CE=1;
- CS=0;
- RC=0;
- _nop_();
- while(STS==1); //等待數據采集結束
- CE=0;
- CE=1;
- CS=0;
- RC=1;
- _nop_();
- i=P0;
- j=P2;
- i=i*16;
- j=j/16;
- k=i+j;
- k=k*10;
- k=k/4096;//12位ad
- return k;
- }
- /*------------------------------------------------
- 數據處理
- ------------------------------------------------*/
- void data_process(double dat,uchar s[10])
- {
- int a,b,c,d;
- dat=dat*100;
- a=(int)(dat);
- b=a/100;
- s[0]=b+48;
- s[1]='.';
- d=a%10;
- s[3]=d+48;
- a=a/10;
- c=a%10;
- s[2]=c+48;
- s[4]='v';
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
光敏測量電壓.zip
(83.49 KB, 下載次數: 37)
2017-10-28 16:03 上傳
點擊文件名下載附件
模數轉換測電壓 下載積分: 黑幣 -5
|