国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
51單片機+ADC0804電壓AD轉換 LCD1602顯示電壓 程序和proteus仿真
[打印本頁]
作者:
eng
時間:
2021-6-6 01:07
標題:
51單片機+ADC0804電壓AD轉換 LCD1602顯示電壓 程序和proteus仿真
AD轉換程序:
用ADC0804芯片實現對電壓的采集;
用LCD1602顯示電壓值;
采集誤差位0.05V;
附件包含完整程序和仿真實際;
文件中含有ADC0804芯片介紹。
完整代碼和仿真文件
:
AD轉換.zip
(73.23 KB, 售價: 5 E幣)
2021-6-6 01:07 上傳
點擊文件名下載附件
售價: 5 E幣
[記錄]
[
購買
]
仿真原理圖如下(proteus仿真工程文件和單片機C語言源碼可到本帖附件中下載)
p.gif
(616.04 KB)
下載附件
2022-7-2 18:10 上傳
1.png
(50.68 KB)
下載附件
2021-6-6 00:42 上傳
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define LCD_DB P1
#define DB P0
sbit LCD_RS=P2^0; //P2.2~lcd的RS
sbit LCD_RW=P2^1; //p2.1~lcd的RW
sbit LCD_E=P2^2; //p2.2~lcd的E
sbit AD_CS=P2^3; //P2.3~0804的CS
sbit AD_RD=P2^4; //P2.4~0804的RD
sbit AD_WR=P2^5; //P2.5~0804的WR
sbit AD_INTR=P3^2; //P3.2~O8O4的INTR,采用中斷方式采集數據
void LCD_init(void); //LCD初始化函數
void LCD_write_command(uchar dat); //LCD寫命令函數
void LCD_write_data(uchar dat); //LCD寫數據函數
void display(ulong num);
uchar table[]="The Volt Is:"; //第一行提示字符串
//********延時函數***************
void delay_n40us(uint n)
{ uint i;
uchar j;
for(i=n;i>0;i--)
for(j=0;j<2;j++); //在這個延時循環函數中我只做了2次循環,
}
//*************LCD初始化函數************
void LCD_init(void)
{
LCD_write_command(0x38);//設置8位格式,2行,5x7
LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
LCD_write_command(0x06);//設定輸入方式,增量不移位--------------
LCD_write_command(0x01);//清除屏幕顯示----------------
delay_n40us(100);
}
//****************lcd寫命令函數
void LCD_write_command(uchar dat)
{
LCD_DB=dat;
LCD_RS=0;
LCD_RW=0;
LCD_E=1;
LCD_E=0;
delay_n40us(1);
}
//**********lcd寫數據函數************
void LCD_write_data(uchar dat)
{
LCD_DB=dat;
LCD_RS=1;
LCD_RW=0;
LCD_E=1;
LCD_E=0;
delay_n40us(1);
}
//************顯示電壓函數
void display(ulong num)
{
uchar ge,point,zhi;
zhi=(num*50+122)/255; //算出電壓值,保留一位小數,誤差0.5V
ge=zhi/10%10; //提取各位
point=zhi%10; //提取小數位
LCD_write_command(0x80+64+6); //從第二行第七個位置開始顯示電壓
LCD_write_data(0x30+ge); //顯示個位
delay_n40us(1500);
LCD_write_data('.'); //顯示小數點
delay_n40us(1500);
LCD_write_data(0x30+point); //顯示小數
delay_n40us(1500);
LCD_write_data(0x30);
delay_n40us(1500);
LCD_write_data('V'); //顯示單位V
delay_n40us(1500);
}
void in1t0_AD( ) interrupt 0 using 1 //當AD轉換完成ITNR變0進入中斷
{
ulong num;
EA=0; //關中斷
AD_RD=1;
delay_n40us(1);
AD_RD=0; //讀數據有效
delay_n40us(1);
num=DB; //讀取0804AD轉換的數據
delay_n40us(10);
AD_RD=1;
display(num); //顯示電壓
}
void main()
{
uchar i;
LCD_init();
DB=0xff;
P3=0xff;
LCD_write_command(0x80); //從第一行開始顯示提示字符
for(i=0;i<12;i++)
{
LCD_write_data(table[i]);
}
DB=0xff;
P3=0xff;
EA=1; //開中斷
EX0=1; //開中斷0
IT0=1; //中斷0下降沿有效
AD_INTR=1;
while(1)
{
EA=1;
AD_CS=1;
delay_n40us(1);
AD_CS=0; //選0804芯片
delay_n40us(2);
AD_WR=1;
delay_n40us(1);
AD_WR=0; //開始AD轉換
delay_n40us(1);
AD_WR=1;
delay_n40us(1);
}
}
復制代碼
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0