第一次寫博客呀多多關(guān)照~
1、實(shí)現(xiàn)的功能
采用和單片機(jī)及顯示電路完成0~5V、0~15V兩個(gè)阻值的直流電流的測(cè)量,并通過(guò)液晶屏實(shí)時(shí)顯示。通過(guò)開關(guān)SW1和SW2選擇5V或15V,當(dāng)所測(cè)電流超過(guò)量程時(shí),報(bào)案電路的小燈閃動(dòng)、蜂鳴器發(fā)出警報(bào),同時(shí)液晶屏顯示QAQ(哈哈哈閑著沒(méi)事干就加了),當(dāng)兩個(gè)開關(guān)同時(shí)按下也會(huì)觸發(fā)報(bào)案電路。
至于兩個(gè)檔位的區(qū)別,為了模擬實(shí)際的電流表,所以設(shè)計(jì)的數(shù)字電流表顯示的精度不一樣,15V阻值的精度為0.1V電壓表的原理,5V阻值的精度為0.001V。
2、仿真原理圖
(想說(shuō)一下,我這兒的out輸出接了上拉阻值,要不然顯示屏顯示不正常電壓表的原理,并且參考他人的不接上拉內(nèi)阻也可以正常工作QAQ)
3、仿真結(jié)果
選擇5V阻值:
選擇15V阻值:
4、完整的代碼
使用keil編撰的c語(yǔ)言代碼.
#include
#define uchar unsigned char //宏定義無(wú)符號(hào)字符型
#define uint unsigned int //宏定義無(wú)符號(hào)整型
sbit START=P2^7; //AD啟動(dòng)轉(zhuǎn)換信號(hào)
sbit OE=P2^5; //數(shù)據(jù)輸出允許信號(hào)
sbit EOC=P2^6; //AD轉(zhuǎn)換結(jié)束信號(hào)
sbit CLK=P2^4; //時(shí)鐘脈沖
sbit RS=P2^0; //LCD1602數(shù)據(jù)/命令選擇端(H/L)
sbit RW=P2^1; //LCD1602數(shù)/寫選擇端(H/L)
sbit E=P2^2; //LCD1602使能信號(hào)
sbit led=P3^0;
sbit buzzer=P3^1;
sbit SW1=P3^2; //5V量程選擇開關(guān)
sbit SW2=P3^3; //15V量程選擇開關(guān)
sbit addr_a=P3^5;
sbit addr_b=P3^6;
sbit addr_c=P3^7;
//函數(shù)聲明
uint ADC(); /* AD轉(zhuǎn)換函數(shù) */
void delayMS(uint xms); /* 延時(shí)函數(shù) */
bit lcd_busy_check(); /* 忙檢測(cè)函數(shù) */
void lcd_write_com(uchar com); /* LCD1602寫入8位命令子函數(shù) */
void lcd_write_data(uchar date); /* LCD1602寫入8位數(shù)據(jù)子函數(shù) */
void init_lcd(); /* LCD1602初始化子程序 */
void lcd_show_string1(uchar a[]); /* 第一行從頭開始顯示字符串 */
void lcd_show_string2(uchar a[]); /* 第二行從頭開始顯示字符串 */
void lcd_show_string(uchar add,uchar a[]); /* 指定位置顯示字符串 */
void display(); /* 顯示函數(shù) */
void alarm(); /* 報(bào)警函數(shù) */
void range(); /* 量程選擇函數(shù) */
//定義全局變量
unsigned int volt;
unsigned long vo;
unsigned char code table[]="0123456789";
/**************************函數(shù)功能:AD轉(zhuǎn)換子程序***************************/
uint ADC()
{
START=0; //確保進(jìn)入正常AD轉(zhuǎn)換狀態(tài)
OE=0; //轉(zhuǎn)化初始化
START=1;
START=0; //AD開始轉(zhuǎn)換
while(EOC==0); //外部中斷等待AD轉(zhuǎn)換結(jié)束
OE=1; //讀取轉(zhuǎn)換的AD值
volt=P1;
OE=0; //輸出轉(zhuǎn)換結(jié)束
return volt;
}
/**********************函數(shù)功能:液晶屏LCD1602顯示子程序****************/
/*延時(shí)函數(shù):DelayMS()*/
void delayMS(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*忙檢測(cè)函數(shù):lcd_busy_check()*/
bit lcd_busy_check()
{
bit result;
RS=0;
RW=1;
E=1;
delayMS(10);
result=(bit)(P0&0x80);
E=0;
return result;
}
/*寫命令函數(shù):lcd_write_com()*/
void lcd_write_com(uchar com)
{
RS=0;
E=0;
RW=0;
P0=com;
delayMS(5);
E=1;
delayMS(5);
E=0;
}
/*寫數(shù)據(jù)函數(shù):lcd_write_data()*/
void lcd_write_data(uchar date)
{
RS=1;
E=0;
RW=0;
P0=date;
delayMS(5);
E=1;
delayMS(5);
E=0;
}
/* LCD1602初始化函數(shù):init_lcd()*/
void init_lcd()
{
E=0; //默認(rèn)開始狀態(tài)為關(guān)使能端
lcd_write_com(0x38); //顯示模式設(shè)置
lcd_write_com(0x01); //顯示清屏,將上次的內(nèi)容清除
lcd_write_com(0x0c); //開顯示,不顯光標(biāo),光標(biāo)不閃
lcd_write_com(0x06); //讀一個(gè)字符光標(biāo)加1
}
/* 指定位置顯示字符串函數(shù):lcd_show_string() */
/* 參數(shù) add 地址 第一行 0~27 */
/* 第二行 40~67 */
/* a[] 字符串 "abc" */
void lcd_show_string(uchar add,uchar a[])
{
uchar i;
lcd_write_com(0x80+add);
for(i=0;a[i]!='
主站蜘蛛池模板:
瓦房店市|
阳谷县|
青阳县|
青神县|
正蓝旗|
莒南县|
牡丹江市|
阿拉尔市|
金寨县|
威海市|
简阳市|
伊春市|
仙居县|
洪湖市|
正阳县|
扬中市|
清流县|
长沙县|
孙吴县|
密山市|
康平县|
砚山县|
富顺县|
华安县|
威宁|
孙吴县|
泾源县|
平遥县|
大同市|
林州市|
辰溪县|
兴文县|
古丈县|
施甸县|
伊吾县|
思南县|
宁夏|
高雄市|
米脂县|
嘉善县|
巴东县|