① 單片機控制數字電位器的c語言程序
數字電位器用的是X9C103
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//設定四個按鍵
sbit X9C102=P2^0;
sbit X9C202=P2^1;
sbit X9C302=P2^2;
sbit X9C402=P2^3;
sbit X9C103_CS=P1^0;
sbit X9C103_INC=P1^1;
sbit X9C103_UD=P1^2;
void delay_nus(uint i)
{
while(i--);
}
void delay_nms(uchar i)
{
for(i;i>0;i++)
{
delay_nus(1000);
}
}
void set_x9c103(uchar num,uchar ud,uchar save)
{
X9C103_CS=0;
delay_nus(1);
if(ud==1)
{
X9C103_UD=1;
}
else
{
X9C103_UD=0;
}
delay_nus(4);
for(num;num>0;num--)
{
X9C103_INC=1;
delay_nus(2);
X9C103_INC=0;
delay_nus(2);
}
delay_nus(2);
if(save==1)
{
X9C103_INC=1;
delay_nus(2);
X9C103_CS=1;
delay_nms(22);
}
X9C103_CS=1;
delay_nus(10);
}
void clear_down()
{
set_x9c103(100,0,1);
}
void main_init()
{
X9C103_CS=0;
clear_down();
}
void main()
{
main_init();
set_x9c103(70,1,1);
while(1)//掃描按鍵,對應不同倍數的輸出
{
if (X9C102==0){
clear_down();
set_x9c103(10,1,1);}
if (X9C202==0){
clear_down();
set_x9c103(30,1,1);}
if (X9C302==0){
clear_down();
set_x9c103(60,1,1);}
if (X9C402==0){
clear_down();
set_x9c103(90,1,1);}
}
}
② 51單片機如何控制x9c104p數字電位器
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
sbit inc=P0^0; //脈沖輸出端
sbit ud=P0^1; //方向端
sbit cs=P0^2; //片選端
sbit led=P2^0; //指示燈
/*以下是函數聲明*/
void x9c104s_inc(uchar number);
void x9c104s_dec(uchar number);
void x9c104s_set(uchar number);
/*設定初始值*/
void x9c104s_set(uchar number)
{
uchar i;
inc=1;
_nop_();
_nop_();
cs=0;
_nop_();
_nop_();
ud=0; //方向為減
_nop_();
_nop_();
for(i=0;i<100;i++) /*因為該晶元為100抽頭 所以先清零*/
{
inc=1;
_nop_();
_nop_();
inc=0;
_nop_();
_nop_();
}
ud=1; //方向朝上
_nop_();
_nop_();
for(i=0;i<number;i++) //設定初始值
{
inc=1;
_nop_(); //下降沿有效
_nop_();
inc=0;
_nop_();
_nop_();
}
inc=1; //以下為保存設定值
_nop_();
_nop_();
cs=1;
_nop_();
_nop_();
ud=1;
_nop_();
_nop_();
inc=1;
}
/*函數為重新增加阻值*/
void x9c104s_inc(uchar number)
{
uchar i;
inc=1;
_nop_();
_nop_();
cs=0;
_nop_();
_nop_();
ud=1;
_nop_();
_nop_();
for(i=0;i<number;i++) //設定阻值
{
inc=1;
_nop_();
_nop_();
inc=0;
_nop_();
_nop_();
}
inc=1; //以下為保存設定值
_nop_();
_nop_();
cs=1;
_nop_();
_nop_();
ud=1;
_nop_();
_nop_();
inc=1;
}
/*函數為阻值減小*/
void x9c104s_dec(uchar number)
{
uchar i;
inc=1; //選中該晶元
_nop_();
_nop_();
cs=1;
_nop_();
_nop_();
ud=0; //方向為減小
_nop_();
_nop_();
for(i=0;i<number;i++)
{
inc=1;
_nop_();
_nop_();
inc=0;
_nop_();
_nop_();
}
inc=1; //保存設定值
_nop_();
_nop_();
cs=1;
_nop_();
_nop_();
ud=1;
_nop_();
_nop_();
inc=1;
}
void main()
{
led=0;
x9c104s_set(10);
x9c104s_inc(60); //三個函數都使用一下 防止警告
x9c104s_dec(10);
}
③ 什麼是可編程晶元
在介面晶元中,各硬體單元不是固定接死的,可由用戶在使用中選擇,即通過計算機指令來選擇不同的通道和不同的電路功能,稱為編程式控制制,介面電路的組態(即電路工作狀態)可由計算機指令來控制的介面晶元稱為可編程序介面晶元。
④ X9241可編程數字電位器讀出的值是什麼值,是阻值嗎
是阻值!
第一欄位的前4位為設備類型標識,對於X9241,其固定值為0101,後4位是設備地址(A3,A2,A1,A0),這4位的0,1取值取決於晶元上的A3-手帶鍵A0引腳是接GND還是接VCC。
第二欄位描述了操作類型和操作對象。其中前4位是指令代碼I3~I0,後4位是操作對象P1、P0和R1、R0。其中P1,P0是4個電位器的選擇編碼,R1,R0是每個電位器的4個寄存器的選擇編碼。X9241的指令集如表1所列。表中的1/0表示數據為1或0,N/A為無效位。
第三欄位是8bits的數據段,它的前兩位CM、DW是控制位,其中CM是級聯模式控制位,當行耐CM為0時,為正常模式,當CM為1時,該電位器與序號比它高一級的電位器級聯。比如,若WCR2的CM為1,表示電位器2就與電位器3級聯。DW是電位器滑動端使能控制位。當DW為0時,為正常模式,當DW為1時,該電位器的滑動端失效,即滑動端處於絕緣懸浮狀態。CM和DW配合使用可以實現電位器的級聯,並可保證級聯電位器在滑動時只有一個有效滑動端。
X9241的三位元組指畢巧令序列傳輸,X9241還有一種遞增/遞減的控制方式,由於不常用,在此不再陳述。一個完整的X9241讀/寫時序包括以下幾個部分:
1)起始位。以SCL為高電平,SDA出現下跳沿為起始標志;
2)傳送X9241的從屬設備地址欄位;
3)接收X9241返回的ACK(應答)信號,它是在SCL為高電平期間,SDA線上為低電平的狀態;
4)向X9241傳送指令欄位;
5)接收X9241返回的ACK信號;
6)如果是『寫』方式,則向X9241發送8bit數據。並接收ACK信號;如果是『讀』方式,則准備接收X9241將要返回的8bit數據,並在接收完成後,向X9241發送ACK信號;
7)停止位。以SCL為高電平,SDA出現上跳沿為I2C傳輸的停止標志。