/
程序名称:hc595c
程序功能:595的应用文件,595控制数码管
程序作者:吴鉴鹰
创建时间:2013-12-7
修改时间:2013-12-9
程序版本:V02
/
/
包含头文件
/
#include
"inc/hc595h"
#include
"reg51h"
/
定义引脚
/
/
595控制数码管时钟信号线引脚定义
/
sbit
HC595CLK
=
P1^1;
/
595控制数码管片选信号线引脚定义
/
sbit
HC595RCK
=
P1^0;
/
595控制数码管数据输入引脚定义
/
sbit
HC595DATA
=
P1^4;
/
函数名称:SendData
函数功能:74HC595数据的发送
入口参数:unsigned
int
uiDataOne,
unsigned
int
uiDataTwo
出口参数:void
/
void
SendData(unsigned
int
uiDataOne,
unsigned
int
uiDataTwo)
{
unsigned
int
i
=
0;
/
将片选信号置为低电平
/
HC595RCK
=
0;
/
输入第一个数据:uiDataOne
/
for
(i
=
0;
i
<
8;
i++)
{
/
给出脉冲信号,首先将CLK置为0
/
HC595CLK
=
0;
if
(0
!=
(uiDataOne
&
0x80))
{
HC595DATA
=
1;
}
else
{
HC595DATA
=
0;
}
/
给出脉冲信号,首先将CLK置为1
/
HC595CLK
=
1;
/
准备第二个数据
/
uiDataOne
=
uiDataOne
<<
1;
}
/
输入第二个数据:uiDataTwo
/
for
(i
=
0;
i
<
8;
i++)
{
/
给出脉冲信号,首先将CLK置为0
/
HC595CLK
=
0;
if
(0
!=
(uiDataTwo
&
0x80))
{
HC595DATA
=
1;
}
else
{
HC595DATA
=
0;
}
/
给出脉冲信号,首先将CLK置为1
/
HC595CLK
=
1;
/
准备第二个数据
/
uiDataTwo
=
uiDataTwo
<<
1;
}
/
将片选信号置为高电平
/
HC595RCK
=
1;
}
st
equ
p37
eoc
equ
p36
oe
equ
p35
BAI
EQU
30H
SHI
EQU
31H
GEWEI
EQU
32H
org
0000h
MOV
DPTR,#0FEF8H
;AD转换IN0通道地址
MOV
A,#00H
MOVX
@DPTR,A
;启动AD转换
START:
clr
st
setb
st
clr
st
jnb
eoc,$
setb
oe
mov
30H,P2
clr
oe
mov
a,30h
mov
b,#100
div
ab
LOOP:
MOV
BAI,A
MOV
SHI,B
MOV
A,SHI
MOV
B,#10
DIV
AB
MOV
SHI,A
MOV
GEWEI,B
MOV
A,BAI
MOV
P1,A
CLR
P32
LCALL
DELAY
SETB
P32
MOV
A,SHI
MOV
P1,A
CLR
P31
LCALL
DELAY
SETB
P31
MOV
A,GEWEI
mov
p1,a
CLR
P30
LCALL
DELAY
SETB
P30
SJMP
START
DELAY:
mov
R6,#5
D1:
MOV
R7,#200
DJNZ
R7,$
DJNZ
R6,D1
RET
end
这是我编的程序,可以用,你只用0通道的话那就把那个通道选择的三个引脚全接地就是了。
MOV
DPTR,#0FEF8H
;AD转换IN0通道地址
MOV
A,#00H
MOVX
@DPTR,A
;启动AD转换
这个是启动转换的语句
以上的程序是实现,电位器调节过程中,数码管从0到255变化
ADC0809要工作得在单片机的ALE脚上接个四分频的器件,不然ADC0809是不会工作的。QQ:77254708
void adc_isr() interrupt 5 using 1
{
ch++;
}
请教您是如何测试判断,程序根本就没有进入过AD的中断处理程序
#include <reg52h>#include <intrinsh>#define uchar unsigned char#define uint unsigned intsbit DS=P3^3; //定义DS18B20接口int temp; uchar flag1; void display(unsigned char lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数void delay();//延时子函数,5个空指令code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x39,0x00};//共阴数码管显示数的组成是 "0-9""0-9有小数点的" "-" "C" "空 表"unsigned char l_tmpdate[8]={0,0,10,0,0,0,0,0};//定义数组变量,并赋值1,2,3,4,5,6,7,8,就是本程序显示的八个数int tmp(void);void tmpchange(void);void tmpwritebyte(uchar dat);uchar tmpread(void);bit tmpreadbit(void);void dsreset(void);void delayb(uint count);void main() //主函数{uchar i;int l_tmp; while(1) { tmpchange(); //温度转换 l_tmp=tmp(); //读取温度值 if(l_tmp<0) l_tmpdate[0]=20; //判断温度为负温度,前面加"-" else { l_tmpdate[0]=l_tmp/1000; //显示百位,这里用1000,是因为我们之前乖以10了 if(l_tmpdate[0]==0) l_tmpdate[0]=22;//判断温度为正温度且没有上百,前面不显示,查表第12是空 }l_tmp=l_tmp%1000;l_tmpdate[1]=l_tmp/100;//获取十位l_tmp=l_tmp%100;l_tmpdate[2]=l_tmp/10;//获取个位再l_tmpdate[2]+=10;//加入小数点,查表可得出有小数点的排在后10位,所以加10l_tmpdate[3]=l_tmp%10;//获取小数第一位l_tmpdate[4]=21;for(i=0;i<10;i++){ //循环输出10次,提高亮度display(l_tmpdate,5); } }}void display(unsigned char lp,unsigned char lc)//显示{ unsigned char i; //定义变量 P2=0; //端口2为输出 P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管 for(i=0;i<lc;i++){ //循环显示 P2=table[lp[i]]; //查表法得到要显示数字的数码段 delay(); //延时5个空指令 if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据 break; P2=0; //清0端口,准备显示下位 P1++; //下一位数码管 }}void delay(void) //空5个指令{_nop_();_nop_();_nop_();_nop_();_nop_();}void delayb(uint count) //delay{ uint i; while(count) { i=200; while(i>0) i--; count--; }答案补充
}void dsreset(void)//DS18B20初始化{ uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--;}bit tmpreadbit(void) // 读一位{ uint i; bit dat; DS=0;i++; //小延时一下 DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat);}uchar tmpread(void) //读一个字节{ uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1); } return(dat); } 答案补充
void tmpwritebyte(uchar dat) { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; i=8;while(i>0)i--; DS=1; i++;i++; } }}void tmpchange(void){ dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0x44); }答案补充
int tmp() //获得温度{ float tt; uchar a,b; dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); //发送读取数据命令 a=tmpread(); //连续读两个字节数据 b=tmpread(); temp=b; temp<<=8; temp=temp|a; //两字节合成一个整型变量。 tt=temp00625; //得到真实十进制温度值,因为DS18B20//可以精确到00625度,所以读回数据的最低位代表的是//00625度。 temp=tt10+05; //放大十倍,这样做的目的将小数点后第一位//也转换为可显示数字,同时进行一个四舍五入 *** 作。 return temp; //返回温度值}答案补充
void readrom() //read the serial 读取温度传感器的序列号{ //本程序中没有用到此函数 uchar sn1,sn2; dsreset(); delayb(1); tmpwritebyte(0x33); sn1=tmpread(); sn2=tmpread();}void delay10ms() { uchar a,b; for(a=10;a>0;a--) for(b=60;b>0;b--);}哇!好累啊。。。这个可以用。。。用那个口自己看看就懂了,如果要汇编语言的去看:>
问题不大,挺麻烦,开始的三行都是赋值语句,第三行的话,把0x2E装换为二进制00101110,代码太不全了,那些数组的只有个名称,应该是把某位置为1或者0,一般情况下1为开,0为关,下面的TxBuf的代表某个标志位吧,下面几句意思都差不多,拿TxBuf[0]=0x02;做例子,意思就是TxBuf[0]这个标志位把倒数第二位置为1(0000 0010),下面的依次类推!
void Timer3_Init()
{
TMR3CN = 0x02;
TMR3R = -44236; //定时2ms
TMR3 = 0xffff;
EIE2 &= ~0x01;
TMR3CN |= 0x04;
}
void ADC0_Init(void)
{
AMX0SL=0x00; //选择通道0
AMX0CF=0x00; //选择AIN0和AIN1为独立输入
REF0CN=0x03; //选择外部的电压为基准电压
ADC0CF=(SYSCLK/2500000)<<3;//时钟为 ,增益为1
ADC0CN=0x84;//ADC0使能且为ADCBUSY的开启方式
EIE2|=0x02;//开启ADC0的中断
}
void ADC0_ISR() interrupt 15
{
static unsigned int_dec=INT_DEC;
static long accumulator=0L;
AD0INT = 0; // 清 ADC 中断标志位
accumulator += ADC0; // 累加ADC采样数据
int_dec--; // 指针减1
if (int_dec == 0) // 累加完了吗?
{
int_dec = INT_DEC; // 指针复位
result = accumulator >> 8;
accumulator = 0L; // 累加和变量清0
t=1;
}
}ADC0转换,定时器3开启的方式
此程序是我做单片机课程设计的程序,PROTEL原理图在附件里
程序经过了实验的测试,没有任何问题。
一 设计要求:
1 以8031为主控器组成A/D,D/A转换系统。
2 对任意波形的脉冲信号进行A/D转换后进入数据存储器,要求能够存储5~10个周波,然后定时将数据经D/A转换输出示波器显示。
3 采样的频率可由键盘有级调节。
二 课程设计条件:
硬件:个人PC一台,8051单片机仿真头一个,89S51单片机一个,ADC0809芯片一块,DAC0832芯片一块,7402一个,LM358一片,按键开关5个,电阻电容若干,6M晶振一个,稳压电源,函数信号发生器,及示波器个一个
软件:PC机WINDOWS *** 作系统,KEIL单片机仿真调试软件
三 设计思想:
通过ADC0809将正弦波模拟信号按照一定的频率进行采样,频率由键盘进行串级控制,转换成数字量,然后存储到8155的RAM里面,再将数据输出到DAC0832,将数字量转化成模拟量,经过LM358将信号放大,送到示波器终端循环显示出来
BUFFRE EQU 31H ;采样频率设置单元
BUFRAM EQU 7E00H ;8155RAM首地址
BUFADC EQU 0FD1FH ;0809启动地址
BUFDAC EQU 0BFFH ;0832启动地址
K1 EQU P14 ; 四个频率选择按键
K2 EQU P15
K3 EQU P16
K4 EQU P17
ORG 0000H
LJMP START
ORG 0030H
START: MOV R4,#02 ;由于8155的复位时间比8051慢,所以在对8155初始化之前必须有延时
DEL11:MOV R6,#200 ; 延时为021s的倍
DEL21:MOV R7,#126
DEL31:DJNZ R7,DEL31
DJNZ R6,DEL21
DJNZ R5,DEL11
MOV DPTR,#7FF8H ; 8155初始化
MOV A,#00H ; 写入命令字
MOVX @DPTR,A
MOV R0,#0FAH
MOV DPTR,#BUFRAM
LOOP:MOVX @DPTR,A ;对8155RAM清零
INC DPTR
DJNZ R0,LOOP
FRESET:MOV P1,#0FFH ;准备读取P1 口状态
JB K1,NEXT1 ; 依次判断按下了哪一个按键
MOV BUFFRE,#02H ;送相应的频率设置到31内存单元
LJMP INPUT
NEXT1:JB K2,NEXT2
MOV BUFFRE,#04H
LJMP INPUT
NEXT2:JB K3,NEXT3
MOV BUFFRE,#08H
LJMP INPUT
NEXT3:JB K4,NEXT4
MOV BUFFRE,#06H
LJMP REALIO ;如果是K4按下,则进行实时输入输出
NEXT4:LJMP FRESET ; 循环等待按键按下
INPUT: ; A/D采样程序
MOV R0,#0FAH ;共采集250个数据
MOV DPTR,#BUFRAM ; 8155RAM首地址
LOOP1:PUSH DPL ; 先保存次地址
PUSH DPH
MOV DPTR,#BUFADC ; 0809启动地址
MOV A,#00H
MOVX @DPTR,A ; 启动0809 A/D转换开始
NOP ; 一定时间延时
NOP
WAIT:JB P10,WAIT ; 等待转换结束
MOVX A,@DPTR ;读取转换结果
POP DPH
POP DPL ;恢复RAM地址
MOVX @DPTR,A ; 保存数据至8155RAM
INC DPTR ;RAM地址加一,指向下一个存储单元
ACALL DELAY ; 延时,即以一定频率采样
DJNZ R0,LOOP1 ; 250个数据是否采集完成,否则继续
OUTPUT: ; D/A转换模块
MOV R1,#0FAH ;250个数据
MOV DPTR,#BUFRAM ; 8155RAM首地址
LOOP2: PUSH DPL ; 保存此地址
PUSH DPH
MOVX A,@DPTR ;将数据输出到A中
MOV DPTR,#BUFDAC ; 0832地址
MOVX @DPTR,A ;将数据输出进行D/A转换
NOP ;为了与采样频率一直,设定一定延时
NOP
POP DPH ;恢复RAM地址
POP DPL
INC DPTR ;指向下一个要转换的数据单元
ACALL DELAY ; 与采样相同延时
DJNZ R1,LOOP2 ; 直道转换完成
WAIT2:JNB K4,NEXT
LJMP OUTPUT ;循环显示输出结果
NEXT:LJMP REALIO
DELAY:MOV R5,BUFFRE ;延时程序,通过R5的不同,改变延时时间,从而改变
DEL1:MOV R6,#2 ; 延时为0001s的倍
DEL2:MOV R7,#126
DEL3:DJNZ R7,DEL3
DJNZ R6,DEL2
DJNZ R5,DEL1
RET
REALIO: ;实时显示程序
MOV DPTR,#BUFADC
MOV A,#00H
MOVX @DPTR,A
NOP
NOP
WAIT1:JB P10,WAIT1
MOVX A,@DPTR
MOV DPTR,#BUFDAC
MOVX @DPTR,A
NOP
NOP
FRESET1:MOV P1,#0FFH ;准备读取P1 口状态
JB K1,NEXT11 ; 依次判断按下了哪一个按键
MOV BUFFRE,#02H ;送相应的频率设置到31内存单元
LJMP INPUT
NEXT11:JB K2,NEXT12
MOV BUFFRE,#04H
LJMP INPUT
NEXT12:JB K3,NEXT13
MOV BUFFRE,#08H
LJMP INPUT
NEXT13:LJMP REALIO
END
八 使用说明
1上电复位或者按键复位后,程序开始运行后,等待K1-K4的按键被按下,根据按下的键值作不同的处理。
2如果被按下的是K1-K3键,则根据按下的键分别设置不同的采样频率,然后开始进行A/D转换进行信号的采样,再存储至8155的RAM中,如果存储完了250个数据,则自动开始进行数据的D/A输出,在示波器上可以看到相应的波形,数据是循环输出的,所以可以一直看到数据输出!
3如果是按键K4被按下,则进行的是实时的采样输入输出,即将信号通过ADC0809采样进来,不保存至8155的RAM中,就立即送到DAC0832输出到示波器显示,这样的信号基本上就是原来的信号波形。
4在K1-K3按下后正常的采样,存储,输出过程中,也可以按下K4键而转到实时的输入输出程序,便于将采样数据和原数据进行对照。
5在实时的输入输出时,也可以同过按下K1-K3键,立即切换到原来的一定频率采样,存储,输出过程。
6硬件设计上还有一个复位键,可以对程序进行按键复位(汇编,已经实验通过)
简单的A/D,D/A转换程序
此程序是我做单片机课程设计的程序,PROTEL原理图在附件里
程序经过了实验的测试,没有任何问题,
一 设计要求:
1 以8031为主控器组成A/D,D/A转换系统。
2 对任意波形的脉冲信号进行A/D转换后进入数据存储器,要求能够存储5~10个周波,然后定时将数据经D/A转换输出示波器显示。
3 采样的频率可由键盘有级调节。
二 课程设计条件:
硬件:个人PC一台,8051单片机仿真头一个,89S51单片机一个,ADC0809芯片一块,DAC0832芯片一块,7402一个,LM358一片,按键开关5个,电阻电容若干,6M晶振一个,稳压电源,函数信号发生器,及示波器个一个
软件:PC机WINDOWS *** 作系统,KEIL单片机仿真调试软件
三 设计思想:
通过ADC0809将正弦波模拟信号按照一定的频率进行采样,频率由键盘进行串级控制,转换成数字量,然后存储到8155的RAM里面,再将数据输出到DAC0832,将数字量转化成模拟量,经过LM358将信号放大,送到示波器终端循环显示出来
BUFFRE EQU 31H ;采样频率设置单元
BUFRAM EQU 7E00H ;8155RAM首地址
BUFADC EQU 0FD1FH ;0809启动地址
BUFDAC EQU 0BFFH ;0832启动地址
K1 EQU P14 ; 四个频率选择按键
K2 EQU P15
K3 EQU P16
K4 EQU P17
ORG 0000H
LJMP START
ORG 0030H
START: MOV R4,#02 ;由于8155的复位时间比8051慢,所以在对8155初始化之前必须有延时
DEL11:MOV R6,#200 ; 延时为021s的倍
DEL21:MOV R7,#126
DEL31:DJNZ R7,DEL31
DJNZ R6,DEL21
DJNZ R5,DEL11
MOV DPTR,#7FF8H ; 8155初始化
MOV A,#00H ; 写入命令字
MOVX @DPTR,A
MOV R0,#0FAH
MOV DPTR,#BUFRAM
LOOP:MOVX @DPTR,A ;对8155RAM清零
INC DPTR
DJNZ R0,LOOP
FRESET:MOV P1,#0FFH ;准备读取P1 口状态
JB K1,NEXT1 ; 依次判断按下了哪一个按键
MOV BUFFRE,#02H ;送相应的频率设置到31内存单元
LJMP INPUT
NEXT1:JB K2,NEXT2
MOV BUFFRE,#04H
LJMP INPUT
NEXT2:JB K3,NEXT3
MOV BUFFRE,#08H
LJMP INPUT
NEXT3:JB K4,NEXT4
MOV BUFFRE,#06H
LJMP REALIO ;如果是K4按下,则进行实时输入输出
NEXT4:LJMP FRESET ; 循环等待按键按下
INPUT: ; A/D采样程序
MOV R0,#0FAH ;共采集250个数据
MOV DPTR,#BUFRAM ; 8155RAM首地址
LOOP1:PUSH DPL ; 先保存次地址
PUSH DPH
MOV DPTR,#BUFADC ; 0809启动地址
MOV A,#00H
MOVX @DPTR,A ; 启动0809 A/D转换开始
NOP ; 一定时间延时
NOP
WAIT:JB P10,WAIT ; 等待转换结束
MOVX A,@DPTR ;读取转换结果
POP DPH
POP DPL ;恢复RAM地址
MOVX @DPTR,A ; 保存数据至8155RAM
INC DPTR ;RAM地址加一,指向下一个存储单元
ACALL DELAY ; 延时,即以一定频率采样
DJNZ R0,LOOP1 ; 250个数据是否采集完成,否则继续
OUTPUT: ; D/A转换模块
MOV R1,#0FAH ;250个数据
MOV DPTR,#BUFRAM ; 8155RAM首地址
LOOP2: PUSH DPL ; 保存此地址
PUSH DPH
MOVX A,@DPTR ;将数据输出到A中
MOV DPTR,#BUFDAC ; 0832地址
MOVX @DPTR,A ;将数据输出进行D/A转换
NOP ;为了与采样频率一直,设定一定延时
NOP
POP DPH ;恢复RAM地址
POP DPL
INC DPTR ;指向下一个要转换的数据单元
ACALL DELAY ; 与采样相同延时
DJNZ R1,LOOP2 ; 直道转换完成
WAIT2:JNB K4,NEXT
LJMP OUTPUT ;循环显示输出结果
NEXT:LJMP REALIO
DELAY:MOV R5,BUFFRE ;延时程序,通过R5的不同,改变延时时间,从而改变
DEL1:MOV R6,#2 ; 延时为0001s的倍
DEL2:MOV R7,#126
DEL3:DJNZ R7,DEL3
DJNZ R6,DEL2
DJNZ R5,DEL1
RET
REALIO: ;实时显示程序
MOV DPTR,#BUFADC
MOV A,#00H
MOVX @DPTR,A
NOP
NOP
WAIT1:JB P10,WAIT1
MOVX A,@DPTR
MOV DPTR,#BUFDAC
MOVX @DPTR,A
NOP
NOP
FRESET1:MOV P1,#0FFH ;准备读取P1 口状态
JB K1,NEXT11 ; 依次判断按下了哪一个按键
MOV BUFFRE,#02H ;送相应的频率设置到31内存单元
LJMP INPUT
NEXT11:JB K2,NEXT12
MOV BUFFRE,#04H
LJMP INPUT
NEXT12:JB K3,NEXT13
MOV BUFFRE,#08H
LJMP INPUT
NEXT13:LJMP REALIO
END
八 使用说明
1上电复位或者按键复位后,程序开始运行后,等待K1-K4的按键被按下,根据按下的键值作不同的处理。
2如果被按下的是K1-K3键,则根据按下的键分别设置不同的采样频率,然后开始进行A/D转换进行信号的采样,再存储至8155的RAM中,如果存储完了250个数据,则自动开始进行数据的D/A输出,在示波器上可以看到相应的波形,数据是循环输出的,所以可以一直看到数据输出!
3如果是按键K4被按下,则进行的是实时的采样输入输出,即将信号通过ADC0809采样进来,不保存至8155的RAM中,就立即送到DAC0832输出到示波器显示,这样的信号基本上就是原来的信号波形。
4在K1-K3按下后正常的采样,存储,输出过程中,也可以按下K4键而转到实时的输入输出程序,便于将采样数据和原数据进行对照。
5在实时的输入输出时,也可以同过按下K1-K3键,立即切换到原来的一定频率采样,存储,输出过程。
6硬件设计上还有一个复位键,可以对程序进行按键复位
接线:p36接srd
p37接swr
p30接pin
p31接clk
ad0809的clk接脉冲
cs接8000h的译码电路程序:ad0809 xdata 8000h
org 0000h
ajmp main
org 0030h
main:mov dptr,#8000h
mov a,#01h
movx @dptr,a
call delay
movx a,@dptr
mov r0,a
call disp
call delay
call delay
call delay
ajmp maindisp:mov a,r0
anl a,#00001111b
acall dsend
mov a,r0
swap a
anl a,#00001111b
acall dsend
ret
dsend:mov dptr,#tab
movc a,@a+dptr
mov sbuf,a
jnb ti,$
clr ti
ret delay:mov r4,#250
delay1:mov r5,#250
djnz r5,$
djnz r4,delay1
ret
tab:db 03h ;0
db 9fh ;1
db 25h ;2
db 0dh ;3
db 99h ;4
db 49h ;5
db 41h ;6
db 1fh ;7
db 01h ;8
db 09h ;9
db 11h ;灭
db 11h
db 0c1h
db 63h
db 85h
db 61h
db 71h
db 00h
end
以上就是关于求教PIC18F4520单片机AD转换程序全部的内容,包括:求教PIC18F4520单片机AD转换程序、急求:单片机 0809AD转换汇编程序、STC12C5A16S2单片机的AD转换功能,采用中断方式的C代码问题。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)