100級(jí)調(diào)節(jié)電路和單片機(jī)源程序
1、基礎(chǔ)部分
數(shù)字電位器X9c103模塊是一款寬電壓(3V-5V)供電,10K滿量程電位器。
電位器中間抽頭在0-10k間滑動(dòng)共100級(jí)(電位器滑動(dòng)端典型阻抗40歐)數(shù)字電位器VL和VH端口分別對(duì)應(yīng)滑動(dòng)變阻器的低端和高端,允許輸入電壓范圍-5V到+5V。數(shù)字電位器模塊附帶測(cè)試程序,程序代碼為C語(yǔ)言代碼,分模塊編寫(xiě)。代碼包括:主函數(shù)、顯示子函數(shù)、按鍵子函數(shù)以及各模塊的頭文件,可以采用KEIL4打開(kāi)源代碼經(jīng)行測(cè)試和學(xué)習(xí)。
2、測(cè)試部分
如只需測(cè)試模塊使用可不研究源代碼,將測(cè)試程序中.HEX文件下載到目標(biāo)板。
1、按鍵子函數(shù)共涉及兩個(gè)按鍵檢測(cè)和控制,分別對(duì)應(yīng)P3^2和P3^3.兩個(gè)按鍵每次按下分別實(shí)現(xiàn)10K數(shù)字電位器中間滑動(dòng)端往上端和往下端滑動(dòng)1k數(shù)值。數(shù)字電位器接口說(shuō)明:INC接P2^0,U_D接P2^1,CS接P2^2。
2、顯示器接口:電源端口VCC(2腳)GND(1腳)接5V電源。數(shù)據(jù)端口D0-D7(7腳到14腳)接P0口(P0^0-P0^7)。對(duì)比度調(diào)節(jié)端口VL(3腳)為液晶顯示器對(duì)比度調(diào)整端用電位器分壓得到0V-5V中間某一電壓使液晶清晰顯示。控制端口RS(4腳)為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。控制端口RW(5腳)為讀寫(xiě)信號(hào)線,高電平(1)時(shí)進(jìn)行讀操作控制端口EN(6腳)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令。
三、程序設(shè)計(jì)
單片機(jī)源程序如下(key部分):
/*
* 按鍵子函數(shù)子函數(shù)
* 按鍵子函數(shù)共涉及兩個(gè)按鍵檢測(cè)和控制,分別對(duì)應(yīng)P3^2和P3^3.兩個(gè)按鍵每次按下分別實(shí)現(xiàn)10K數(shù)字
* 電位器中間滑動(dòng)端往上端和往下端滑動(dòng)1k數(shù)值。
* 數(shù)字電位器接口說(shuō)明:INC接P2^0,U_D接P2^1,CS接P2^2。
*/
#include“HEADER.h”
#include“LCD1602.h”
#include“BUTTON.h”
volatile unsigned char FLAG_BUTTON = 0;//按鍵檢測(cè)標(biāo)志位
volatile unsigned char BUTTON_DAT = 0;//按鍵鍵值變量
volatile unsigned int TIME_10MS = 0;//時(shí)間變量
volatile unsigned char VOLUME = 0;//電位器值
void T0_Timer() interrupt 1//定時(shí)器0中斷服務(wù)程序
{
TR0 = 0;
// WDT_CONTR = 0X31; //喂狗
TH0 =55536/256; //重裝初值
TL0 =55536%256; //重裝初值
TR0 = 1;
TIME_10MS ++; //time_10ms變量累加
if(TIME_10MS == 1000)TIME_10MS = 0;//time_10ms變量清零
ButtonTest();//按鍵檢測(cè);
}
void ButtonTest(void)
{
static uchar Count_ButtonDown;//靜態(tài)按鍵按下計(jì)數(shù)
static uchar Count_ButtonUp;//靜態(tài)按鍵松開(kāi)計(jì)數(shù)
if((SW_1 == 0)||(SW_2 == 0))
{
Count_ButtonDown++;
Count_ButtonUp = 0;
if(Count_ButtonDown==2)
{
if(SW_1 == 0)BUTTON_DAT = 1;
else if(SW_2 == 0)BUTTON_DAT = 2;
if(BUTTON_DAT != 0)FLAG_BUTTON = 1;
}
if(Count_ButtonDown》=50)
{
Count_ButtonDown = 0;
if(SW_1 == 0)BUTTON_DAT = 1;
else if(SW_2 == 0)BUTTON_DAT = 2;
if(BUTTON_DAT != 0)FLAG_BUTTON = 1;
}
}
else
{
if(Count_ButtonDown》2) //如果按鍵已經(jīng)確認(rèn)按下,則開(kāi)始判斷松開(kāi)
{
Count_ButtonUp++;
if(Count_ButtonUp》=2)
{
Count_ButtonUp = 0;
Count_ButtonDown = 0;}}}}
void ButtonService(unsigned char dat)
{switch(dat)
{case 1: //電位器值增加
{unsigned char n = 0;
CS = 0;
U_D = 1;
_nop_();
for(n=10;n》0;n--)
{INC = 0;
_nop_();
_nop_();
INC = 1;}
CS = 1;
VOLUME++;
if(VOLUME 》 10)VOLUME = 10;
DISPLAY[0] = VOLUME%100/10+0x30;
DISPLAY[1] = VOLUME%10+0x30;
Lcd_Set_xy(2,7);
Lcd_Wdat(DISPLAY[0]);
Lcd_Wdat(DISPLAY[1]);}
break;
case 2: //電位器值減小
{unsigned char n = 0;
CS = 0;
U_D = 0;
_nop_();
for(n=10;n》0;n--)
{
INC = 0;
_nop_();
_nop_();
INC = 1;
}
CS = 1;
if(VOLUME == 0)VOLUME = 1;
VOLUME--;
DISPLAY[0] = VOLUME%100/10+0x30;
DISPLAY[1] = VOLUME%10+0x30;
Lcd_Set_xy(2,7);
Lcd_Wdat(DISPLAY[0]);
Lcd_Wdat(DISPLAY[1]);
/*
* LCD1602顯示器并行驅(qū)動(dòng)子函數(shù)
* 顯示器接口:電源端口VCC(2腳) GND(1腳)接5V電源。
數(shù)據(jù)端口D0-D7(7腳到14腳)接P0口(P0^0 - P0^7)。
對(duì)比度調(diào)節(jié)端口VL(3腳)為液晶顯示器對(duì)比度調(diào)整端用電位器分壓得到0V-5V中間某一電壓使液晶清晰顯示。
控制端口RS(4腳)為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。
控制端口RW(5腳)為讀寫(xiě)信號(hào)線,高電平(1)時(shí)進(jìn)行讀操作
控制端口EN(6腳)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令。
*/
單片機(jī)源程序如下(主程序):
#include“HEADER.h”
#include“LCD1602.h”
#include“BUTTON.h”
volatile unsigned char DISPLAY[4];//全局顯示數(shù)組
/*****************************初始化函數(shù)*****************************/
void Init()//初始化函數(shù)
{
TMOD = 0X01;//定時(shí)器0設(shè)置工作方式1
TH0 =55536/256;//定時(shí)器初值
TL0 =55536%256;//定時(shí)器初值
EA = 1;//打開(kāi)總中斷
ET0 = 1;//定時(shí)器0打開(kāi)
TR0 = 1;//定時(shí)器0運(yùn)行
// WDT_CONTR = 0X31;//看門(mén)狗定時(shí)器在12M晶振時(shí)131ms復(fù)位
}
/****************************主函數(shù)******************************/
void main(void)
{
unsigned char m = 0;
Init();
Lcd_Init ();
Lcd_Clear();
Delayms(20);
Lcd_Set_xy(1,3);
Lcd_String(“Aether Test”);
Lcd_Set_xy(2,1);
Lcd_String(“Value:00 K”);
//數(shù)字電位器初始化
INC = 1;
CS = 0;
U_D = 0;
_nop_();
for(m=100;m》0;m--)//電位器強(qiáng)制向下滑動(dòng)100級(jí)到最底端
{
INC = 0;
_nop_();
_nop_();
INC = 1;
}
CS = 1;
示例:X9C103數(shù)字電位器C程序




評(píng)論