da转换程序c语言,51单片机按键设计及DA转换

本文介绍了单片机系统中按键去抖的硬件和软件解决方案,以及数码管LED的共阳极和共阴极工作原理。在软件设计部分,展示了汇编语言和C语言实现的按键加减功能,并通过软件延时进行去抖动处理。此外,还提及了DA转换的相关理论基础。
摘要由CSDN通过智能技术生成

>

一.理论基础

1. 按键去抖

无论是按键还是键盘,大部分是利用机械触点的合,断作用。机械触点在闭合及断开由于弹性作用的影响,均存在抖动过程,从而使电压信号也出现抖动。抖动的时间长短于开关的机械特性有关,一般为5~10ms. 去抖动在硬件上可采用RS触发器或者利用用单稳态电路构成去抖电路;在软件上在采用软件延时10ms左右而去除影响。 2. 数码管LED

数码管分共阳极和共阴极两种,如图1-1所示

接高电平 公共阳极

高电平点亮

h g f e d c b a

低电平点亮

接地

图1-1 共阳极和共阴极数码管

单片机系统扩展LED数码管时多用共阳LED,共阳数码管每个段笔画是用低电平 “0”点亮的,要求驱动功率很小;而共阴数码管段笔画是用高电平 “1”点亮的,要求驱动功率较大。

数码管在使用时通常每个段笔画要串一个数百欧姆的降压电阻。 3. LED数码管的译码

数码管的译码分硬件译码和软件译码两种 (1)硬件译码

硬件译码采用专用的译码/驱动器件,驱动功率较大,软件编程简单,直接传送要显示的数据即可,但是字型固定(比如:只有七段,只可译数字)。74LS48/CD4511是“BCD码→七段共阴译码/驱动”芯片,74LS47是“BCD码→七段共阳译码/驱动”芯片。

(2)软件译码

软件译码的驱动功率较小,软件编程较复杂,显示数据需要对应段代码编码值才能显示,段代码编码表如表1所示,汇编语言编写时,采用查表程序完成,应用MOVC A,@A+DPTR指令,并建立数据表:

TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

C语言可以建立数组B[]=[0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F],显示相对应数组元素来实现。

S1增数功能,增到9,再按S1变为0;S2减数功能,减到0,再按S2变为9.

三.硬件设计

四.软件设计

1.汇编语言编程 org 000h mov p0,#00h Start: mov a,#00h Setb p2.0 Setb p2.1 Loop:

Jnb p2.0, incr //***S1加键按下 Jnb p2.1,decr //***S2减键按下 Jmp loop

;************加键************ Incr: acall delay

jnb p2.0,incr //***按键去抖动 Inc a

Cjne a,#10,loop1 //****A=10? loop1: jc loop11

mov p0,a

Mov a,#00h Loop11: mov p0,a acall delay Jmp loop

;************减键************ decr: acall delay

jnb p2.1,decr //***按键去抖动 cjne a,#00h, loop3 //****A!=0? mov p0,a //****A=0 mov a,#9h sjmp loop32

loop3: jnc loop33 loop33: dec a

loop32: mov p0,a acall delay

Jmp loop

//************延时去抖**************// DELAY: MOV R3, #255 ;延时子程序 DEL2: MOV R4, #255 DEL1:

DJNZ R4 , DEL1 DJNZ R3, DEL2 RET end

2. C语言编程 #include #include #include

#define uchar unsigned char #define uint unsigned int uint jishu;

sbit jia= P2^0; //*加键 sbit jian= P2^1; //*减键

void delayms(uint ms) //*毫秒延时子函数 {

uint i,j;

for (j=0;j

for(i=0;i

void start(void) //*初始化子函数 {

P0=0X00;

jia=1; jian=1; }

void jiafa(void) //*加法 {

delayms(140); if (jia==0) {

jishu++; if(jishu

P0=jishu; } else {

jishu=0; P0=jishu; } } }

void jianfa(void) //*加法 {

delayms(140); if (jian==0) {

if(jishu>0) {

jishu--; P0=jishu; } else {

P0=jishu; jishu=9; P0=jishu; } } }

void main() {

start(); //*初始化子函数 while(1) {

if(jia==0) {

jiafa();//*加法子函数 } if(jian==0) {

jianfa(); //*减法子函数 } } }

《实验10 DA转换实验》

1. 理论基础

1. DA转换原理

3.软件设计

output equ p2;

count1 equ 36h; onoff equ 00h;

org 0000h; ajmp main;

org 0030h;

main: mov count1,#00h; jb P3.0,tri;

saw: inc count1;

lcall daout; 调DA输出子程序

mov a,count1;

cjne a,#0ffh,sawback; mov count1,#00h; sawback: sjmp saw; tri: clr onoff;

trian: jb onoff,down; inc count1;

lcall daout; 调DA输出子程序

mov a,count1; cjne a,#0ffh,back; setb onoff; sjmp back; down: dec count1;

;mov count,#0ah; lcall daout;

mov a,count1; cjne a,#00h,back; clr back: sjmp

daout: mov nop;

mov nop;

mov nop;

mov ret;

end;

onoff; trian; p1,#0ffh; output,count1; p1,#0fch; p1,#0f0h;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值