单片机数码管菜单怎样设计

单片机数码管菜单怎样设计,第1张

数码管显示设计菜单只能用简单的数字或字母ABCDEF来表示,显示某一个数字或字母或其组合,按类似确定键后进入相应程序执行,这其实也不是很复杂的。比如最早我做的电脑刺绣机控制系统就只有数码管显示,有很多功能就依靠键盘和数码管的显示类容来与用户互动。

两位数码管显示38-00倒记时 8段数码管显示.两位数码管显示38-00倒计时(动态扫描方式).p2做LED显示数据输出口.p1.0p1.3分别控制数码管个位数和十位数显示. 8段数码管从内部接线上分共阳和共阴两种。在电路设计时应根据情况决定采用共阳或共阴,其基本原则是:若单片机IO口直接驱动数码管个段,最好采用共阳数码管,因为51单片机IO口输出高电平时输出的电流很小,数码管不会太亮;若数码管是通过驱动芯片与单片机相连的,就要看驱动芯片对数码管极性的要求啦。下面的实验采用共阳数码管。=======================================

constant define 常数定义

csp equ 60h 堆栈开始使用的位置.

=======================================

variable define 变量定义

vadigit equ 30h 数码管个位数存放内存位置

vbdigit equ 31h 数码管十位数存放内存位置

vcnt1 equ 32h 计数器数值存放内存位置=======================================

Func: 程序开始.

=======================================

org 0000h

ajmp mainorg 0030h 到0030h处避开00-30h的敏感地址

=======================================

Func: 程序初始化.

=======================================

main: 初始化特殊寄存器及变量

mov sp,#csp 指定堆栈开始使用的位置.

star:

mov vcnt1,#0 初始化计数器,从0开始

lop1:

acall display 调用显示子程序

inc vcnt1 对计数器加1

mov a,vcnt1

cjne a,#100,lop1 判断计数器是否满100?

mov vcnt1,#0 满100就清零重新开始

ljmp lop1 不满就循环执行=======================================

Func: 8.字型LED显示子程序

Input: vcnt1

=======================================

display:

mov a,vcnt1 将temp中的十六进制数转换成10进制

mov b,#10 10进制/10=10进制

div ab a除以b,商在a,余数在b.

mov vbdigit,a 十位在a

mov vadigit,b 个位在b

mov dptr,#digittab 指定查表起始地址

mov r0,#4

dpl1:

mov r1,#250

dplop:

mov a,vadigit 取个位数

movc a,@a+dptr 查个位数的7段代码

mov p1,a 送出个位的7段代码

clr p3.2 开个位显示

acall delayus 显示162微秒

setb p3.2 关闭个位显示,防止鬼影

mov a,vbdigit 取十位数

movc a,@a+dptr 查十位数的7段代码

mov p1,a 送出十位的7段代码

clr p3.3 开十位显示

acall delayus 显示162微秒

setb p3.3 关闭十位显示,防止鬼影

djnz r1,dplop 循环执行250次

djnz r0,dpl1 循环执行250X4=1000次

ret=======================================

Func: 162us延时子程序

=======================================

delayus:

mov r7,#80 ///2+2X80=162微秒,延时按11.0592MHZ计算

djnz r7,$

retorg 0600h

=======================================

digittab: 实验板上的7段数码管0~9数字的共阳显示代码

db 0c0h0

db 0f9h1

db 0a4h2

db 0b0h3

db 099h4

db 092h5

db 082h6

db 0f8h7

db 080h8

db 090h9

end

程序这种东西,也许给你说再多,你还是不怎么直观的理解,给你来一个实在的。

这是数码管驱动电路,采样压力0-5V。

include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define N 4

sfr p0=0x80

sfr p1=0x90

sfr p2=0xa0

sfr p3=0xb0//这段定义可以不要

sbit st=p2^7

sbit oe=p2^5

sbit eoc=p2^6

sbit p0_7=p0^7

sbit p3_0=p3^0

sbit p3_1=p3^1

sbit p3_2=p3^2

sbit ge=p2^0

sbit shi=p2^1

sbit bai=p2^2 //定义

uint a_data1,a_data2,a_data3,temp

uchar sum1

uchar codetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}//段选

uchar getdata[]={0,0,0,0}

void delaynms(uint x)//nms延时程序

void zh_display()//先转换后显示程序

void adcst_0809()//adc启动程序

void main()

{

while(1)

{ adcst_0809()//调adc启动程序

zh_display()//调显示程序

}

}

//adc启动程序

void adcst_0809()

{ uchar i

char count

int sum=0

for(i=0i<4i++)

{

p3_0=0

p3_1=0

p3_2=0 //先择第一通道

oe=0

st=0

st=1

_nop_()

st=0

delaynms(1)

while(!eoc)

oe=1

getdata[i]=p1

oe=0

}

for (count=0count<Ncount++)

{

sum = sum + getdata[count]

delaynms(3)

}

sum1=(char)(sum/4)

}

void delaynms(uint x)

{ uchar i

while(x-->0)

{ for(i=0i<30i++)

{}

}

}

//数据处理并送显程序

void zh_display()

{ uchar a

temp=sum1*151

temp=temp/128

a_data1=temp/100

a_data2=temp%100/10//数据处理

a_data3=temp%10

bai=1

shi=1

ge=1//全灭

for(a=0a<5a++)

{

bai=0

shi=1

ge=1

p0=codetab[a_data1]//点亮百位

delaynms(2)

p0=0x00

bai=1

shi=0

ge=1

p0=codetab[a_data2]//点亮十位

p0_7=0//点亮第二位的小数点

delaynms(2)

p0=0x00

bai=1

shi=1

ge=0

p0=codetab[a_data3]//点亮个位

delaynms(1)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11499423.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存