不知道你用的是什么数码管?我写的是一个cd4511基于c51单片机的。
#include <REGX51.H>
#include <absacc.h>
#include <INTRINS.H>
#define VF 4.94 //电路板对应转换范围电压,转换后对应0xff
#define IN0 XBYTE[0x7ff8]
typedef unsigned char uchar
sbitad_busy=P3^1//ad转换器忙
sbitcd4511_1=P3^2//cd4511锁存使能位
sbitcd4511_2=P3^3
sbitda0832_cs=P3^4
sbitbj=P3^5
sbitkey=P3^0
float result[8]
uchartemp
int ADC0[8]={0}
uchar s,g
int t
bit p
void DELAY(uchar x) //定义短时间延时函数
{
uchar i
for(i=0i<xi++)
x--
}
void AD0809() //八路模拟量循环转化函数
{
uchar i=0
uchar xdata * data ad_adr
ad_adr=&IN0
*ad_adr=0 //启动一次AD转换,
_nop_ ()
_nop_ ()//空 *** 作等待
_nop_ ()
while(!ad_busy) //检测转换是否完成
temp=*ad_adr
ADC0[0]=*ad_adr
*(result+i)=temp*VF/255 //计算实际电压值
}
void main()
{
while(1)
{
AD0809()
_nop_ ()
if(key==1)
{
t=result[0]*10
s=t/10
g=t%10
cd4511_1=1
cd4511_2=1
bj=1
DELAY(200)
P1=s
cd4511_1=0
DELAY(200)
cd4511_1=1
P1=0X00
P1=g
cd4511_2=0
DELAY(200)
cd4511_2=1
DELAY(200)
P1=0X00
da0832_cs=0
DELAY(200)
P1=ADC0[0]
DELAY(200)
da0832_cs=1
P1=0X00
if((s<1)||(s>3))bj=0
else
bj=1
}
if(key==0)
{
t=result[0]*10
s=t/10
g=t%10
if(s<1)
{
s=1
g=0
}
if(s>3)
{
s=4
g=0
}
cd4511_1=1
cd4511_2=1
bj=1
DELAY(200)
P1=s
cd4511_1=0
DELAY(200)
cd4511_1=1
P1=0X00
P1=g
cd4511_2=0
DELAY(200)
cd4511_2=1
DELAY(200)
P1=0X00
da0832_cs=0
DELAY(200)
P1=ADC0[0]
DELAY(200)
da0832_cs=1
P1=0X00
if((s<1)||(s>3))bj=0
else
bj=1
}
}
}
我是用P1口的低四位发送数据的,好好看看,这是个两位的。
下面是我做的c8051f020和max7219的通信做的,直接调用的话改动一下可以最多显示8位
#include <C8051F020.H> //头文件
#define SYSCLK 22118400
/*-----------------------------------------------------------------------*/
typedef unsigned char uchar
#define Addr_No_Op0x00 //不工作寄存器地址
#define Addr_Digit0 0x01
#define Addr_Digit1 0x02
#define Addr_Digit2 0x03
#define Addr_Digit3 0x04
#define Addr_Digit4 0x05
#define Addr_Digit5 0x06
#define Addr_Digit6 0x07
#define Addr_Digit7 0x08
#define Addr_Decode_Mode 0x09//译码模式寄存器地址
#define Addr_Intensity0x0a//亮度控制寄存器地址(max7219)
#define Addr_Scan_Limit 0x0b//扫描控制寄存器地址
#define Addr_Shutdowm 0x0c//掉电模式寄存器地址
#define Addr_Display_Test 0x0f//显示检测寄存器地址
/*-----------------------------------------------------------------------*/
bit G//标志定时器三的中断结束
sbit Max7219_Din=P3^5
sbit Max7219_Load=P3^6
sbit Max7219_Clk=P3^7
/*-----------------------------------------------------------------------*/
sfr16ADC0=0xBE//ADC0寄存器
sfr16DAC0=0xD2//DAC0寄存器
sfr16TMR3RL=0x92
sfr16TMR3=0x94
/*-----------------------------------------------------------------------*/
unsigned int Au
unsigned int ADC[20]//存放ADC0的转换值
unsigned char key //全局变量键盘键值
float K //全局变量数据转换
float DAC[20]//存放DAC0的转换值
float Ag//全局变量数据转换
/*-----------------------------------------------------------------------*/
unsigned char code max7219_7led_code[18]={0x7e,0x30,0x6d,0x79, //0-1-2-3
0x33,0x5b,0x5f,0x70, //4-5-6-7
0x7f,0x7b,0x01,0x4e, //8-9-"-"-E
0x37,0x0e,0x67,0x00}//H-L-P-空白
/*-----------------------------------------------------------------------*/
void PORT_Init(void) //端口初始化
{
XBR2=0x40
P2MDOUT=0x0f//P2口高四位键盘输入
P3MDOUT=0x1f//P3口低四位键盘输出P3.5,P3.6,P3.7为7219串行通信
}
/*-----------------------------------------------------------------------*/
void SYSCLK_Init(void)//时钟初始化
{
unsigned char i
WDTCN=0xde
WDTCN=0xad //关看门狗,默认使能
OSCXCN=0x67
for(i=0i<255i++)
while(!(OSCXCN&0x80))
OSCICN=0x88 //外部时钟22.1184Mhz
}
/*-----------------------------------------------------------------------*/
void wr_max7219(uchar addr,uchar dat)//7219数据读写函数
{
uchar i
Max7219_Load=0
Max7219_Clk=0
for(i=0i<8i++)
{
Max7219_Din = (bit)(addr&0x80)
addr=addr<<1
Max7219_Clk=1
Max7219_Clk=0
}
for(i=0i<8i++)
{
Max7219_Din=(bit)(dat&0x80)
dat=dat<<1
Max7219_Clk=1
Max7219_Clk=0
}
Max7219_Load=1
Max7219_Load=0
}
/*-----------------------------------------------------------------------*/
void delays(unsigned char x)//延时子函数
{
unsigned char count
for(count=0count<10count++)
x--
}
/*-----------------------------------------------------------------------*/
unsigned char Key4_4(void) //扫描键盘
{
unsigned char i=0,j=0
unsigned char Key=0xff,LINE=0x0E
while(LINE!=0xff)
{
P3=LINE
Key=P2
if((Key&0xf0)!=0xf0)
{
delays(2) //消除键盘抖动
Key=P2
if((Key&0xf0)==0xf0)
{
i++
LINE<<=1
LINE|=0x01
continue
}
switch(Key>>4)
{
case 0x0e:j=0break
case 0x0d:j=1break
case 0x0b:j=2break
case 0x07:j=3break
default:break
}
while((P2&0xf0)!=0xf0)//监测键盘d起无连击功能(键盘释放算键值)
return i*4+j
}i++
LINE<<=1
LINE|=0x01
}
return 0xff
}
/*-----------------------------------------------------------------------*/
void ADC0_Init(void)//模数转换初始化
{
REF0CN=0x03//REF0CN=0x07
AMX0CF=0x00 //单端输入
AMX0SL=0x00//AMX0SL=0x0f
ADC0CF=0x1f<<3 //转换时钟,内部增益
ADC0CN=0x80//使能ADC
}
/*-----------------------------------------------------------------------*/
void DAC0_Init(void)//数模转换初始化
{
REF0CN=0x03
DAC0CN=0x80//DAC0CN=0x84使能DAC0
DAC0L=0x00 //DAC的低位初值为0;
DAC0H=0x00 //DAC 的高位初值为0
}
/*-----------------------------------------------------------------------*/
void Timer3_Init(int counts)//定时器三的初始化
{
TMR3CN=0x00
TMR3RL=-counts
TMR3=0xffff
EIE2|=0x01
TMR3CN|=0x04
}
/*-----------------------------------------------------------------------*/
void Timer3_ISR(void) interrupt 14 //定时器中断服务程序定定时0.1s否则益处
{
static j
TMR3CN&=0x7f//软件清中断标志位
if((++j%10)!=0) return
G=1
}
/*-----------------------------------------------------------------------*/
void main()
{
unsigned char a,b,c,d,e,f,g,h
unsigned int Q//定义强制转换类型为整型
SYSCLK_Init()
PORT_Init()
ADC0_Init()
DAC0_Init()
Timer3_Init(SYSCLK/12/100)
wr_max7219(Addr_Shutdowm,0x01)
wr_max7219(Addr_Scan_Limit,0x07)
wr_max7219(Addr_Intensity,0x0f)
wr_max7219(Addr_Decode_Mode,0x00)
EA=1
G=0
while(1)
{
while(!G)
G=0
AD0INT=0
AD0BUSY=1
while(!AD0INT)
ADC[0]=ADC0 //读ADC0的当前值
K=((ADC[0]*2.43)/4096)//6.0为衰减电路的衰减倍数
Q=K*100 //扩大100倍进行运算
{
a=Q/100
b=((Q%100)/10)
c=Q%10
d=10 //显示横杠
e=10 //显示横杠
f=Au/100 //Au为定义数据转换类型
g=(Au%100)/10
h=Au%10
}
{
wr_max7219(Addr_Digit0,max7219_7led_code[a]|0x80)
wr_max7219(Addr_Digit1,max7219_7led_code[b])
wr_max7219(Addr_Digit2,max7219_7led_code[c])
wr_max7219(Addr_Digit3,max7219_7led_code[d])
wr_max7219(Addr_Digit4,max7219_7led_code[e])
wr_max7219(Addr_Digit5,max7219_7led_code[f])
wr_max7219(Addr_Digit6,max7219_7led_code[g]|0x80)
wr_max7219(Addr_Digit7,max7219_7led_code[h])
}
key= Key4_4() //键值处理
switch(key)
{
case 0x00:DAC0+=0x000bbbreak//DAC0键控和步进量(+6db)
case 0x01:DAC0-=0x000bbbreak//DAC0键控和步减量(—6db
}
DAC[0]=(DAC0*3.3)/4096 //控制电压的当前值
Ag=(40.0*DAC[0]+11.5) //当前增益计算值初始值为10
Au=Ag*10//扩大10倍进行运算
}
}
CD4511译码芯片的具体作用:把一个四位的二进制输入abcd转化成一个七位的输出,并接在一个led灯管的七个输入端上,来实现从0-8的输出。
译码器是电子技术中的一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等),功能与编码器相反。译码器一般分为通用译码器和数字显示译码器两大类。数字电路中,译码器(如n线-2n线BCD译码器)可以担任多输入多输出逻辑门的角色,能将已编码的输入转换成已编码的输出,这里输入和输出的编码是不同的。
ORG 00H
AJMP MAIN
ORG 30H
MAIN:
MOV 50H,A
DISP:
MOV P2,50H
ACALL D05S
INC 50H
MOV A,50H
CJNE A,#10,DISP
MOV 50H,#10H
DISP1:
MOV P2,50H
ACALL D05S
INC 50H
MOV A,50H
CJNE A,#16H,DISP1
AJMP $
D05S:
MOV R0,#100
MOV R1,#100
MOV R2,#25
DJNZ R2,$
DJNZ R1,$-4
DJNZ R0,$-8
RET
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)