
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)
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)