单片机设计:基于51单片机的99码表设计
软件环境:proteus8.0 + keil4
要求:1,开关按一下,数码管开始计时。2,按两下,数码管显示静止。3,按三下,数码管数值清零。
c语言程序如下:
#include
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,aa,keycount=0,temp;
sbit anjian=p1^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void display(shi,ge);
void key ();
void init();
void delay(uint z);
/*-----主程序-----*/
void main()
{
init(); //初始化
while(1)
{
key ();
if(keycount==1)
tr0=1; //开中断
if(keycount==2)
tr0=0;
if(keycount==3)
{
temp=0;
keycount=0;
}
if(aa==10){aa=0;
if(temp《=99)
{
temp++;display(shi,ge);
}
else
temp=0;}
}
}
/*------初始化程序-------*/
void init()
{
keycount=0;
temp=0;
tmod=0x01;
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
ea=1;
et0=1;
//tr0=0;
}
/*-----定时器中断-----*/
void timer0() interrupt 1
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
aa++;
}
/*-----显示子程序-----*/
void display(shi,ge)
{
shi=temp/10;
ge=temp%10;
p0=table[shi];;delay(70);
p2=table[ge]; ;delay(70);
}
/*-----按键检测子程序-----*/
void key ()
{
if(anjian==0)
{
delay(5); //消抖
if(anjian==0)
keycount++;
}
//while(anjian==0);
//display(shi,ge); //等待按键弹起
}
/*-----延时子程序-----*/
void delay(uint z) //延时约1ms
{
uint x,y;
for(x=z;x》0;x--)
for(y=100;y》0;y--);
}
电路仿真结果如下:
好了,那么接下来我们就开始c语言——》汇编语言之旅^_^
(1)c语言1-10行改为
org 0000h //汇编起始伪指令,功能是规定程序存储器中源程序或数据块存放的起始地址
ajmp star //ajmp无条件跳转指令
org 000bh
ajmp timer0
anjian equ p1.7 //位定义
keycount equ 40h
shi equ 41h
gewei equ 42h
aa equ 43h
temp equ 44h
tab: db 3fh,6h,5bh,4fh,66h //建表
db 6dh,7dh,7h,7fh,6fh
(2)c语言中的初始化函数 12-14行和39-49行改为
1 star: 2 acall init //子程序近程调用指令,功能是主程序调用子程序,调用子程序的范围为2kb
init:
mov keycount,#0 //keycount=0
mov temp,#0 //temp=1
mov tmod,#01h //tmod=0x01
mov th0,#60
mov tl0,#176
setb ea //位置位指令,对操作数所指出的位进行置1操作
setb et0
setb tr0
ret
acall为子程序近程调用指令,返回用ret。
(3)c语言中15-35行是个while循环,逻辑比较繁琐,注意了!
start:
acall display
inc temp //加1指令,将操作数所指定的单元或寄存器中的内容加1
acall delay70 //近程调用delay70
x8: mov r0,keycount
cjne r0,#2,f1 //cjne比较跳转指令,若r0=2则跳转到x8,否则跳转到f1。
ajmp x8
f1: mov r0,temp
cjne r0,#99,start //若r0《99时,重复循环,否则temp=0
mov temp,#0
ajmp start
f9:
acall key
mov r0,keycount
cjne r0,#0,f2 //keycount=0顺序执行,否则跳转到f1
clr p1.3 //清0
setb tr0
f2: mov r0,keycount //第二次按键
cjne r0,#2,f2
clr tr0
reti
mov r0,keycount //第三次按键
cjne r0,#3,f3
mov temp,#0
mov keycount,#0
inc增量指令,功能是将操作数所指定的单元或寄存器中的内容加1,其结果返还回原操作数单元中。
clr位复位,功能是对操作数所指出的位进行清“0”操作。
或者在中断函数中
timer0:
w1:
acall key
mov th0,#60
mov tl0,#176
cpl p1.0
jb keycount,x2
ajmp x3
x2:
ajmp start
clr p1.0
ajmp w1
ajmp w1
x3: mov r0,keycount
cjne r0,#3,w1 //若r0=3则顺序执行,否则跳转到w1
mov temp,#0
mov keycount,#0
ret
(4)c语言58-64行display函数改为
display:
mov a,temp
mov b,#10
div ab //除法指令,实现两个八位无符号数的除法操作。
mov r2,a
mov r3,b
mov dptr,#tab //16位数据传送使用方式
mov a,r2
movc a,@a+dptr //查表,先将累加器a的内容与数据指针寄存器dptr的内容相加,再以其结果为地址,将该地址的结果送入a中
mov p0,a
acall delay70
nop //空指令
mov a,r3
movc a,@a+dptr
mov p2,a
nop
acall delay70
ret
div为除法指令,功能是实现两个8位无符号数的除法操作,一般被除数放在累加器a中,除数放在寄存器b中。指令执行后,商放在a中,余数放在b中。
movc为查表指令,先将累加器a的内容与数据指针寄存器dptr的内容相加,再以其结果为地址,将该地址的内容送入a中。
nop为空操作指令,它不作任何操作,但要占用一个机器周期(即12个振荡周期)的时间,常用于延时或等待。(有些程序执行的效果由于延时时间太短,在人眼视觉暂时作用下无法辨认清楚)
此段程序的作用在于将一个两位数分别分在一个十位上的数码管和一个个位上的数码管显示。
(5)c语言66-76行key函数改为
1 key:2 jb anjian,f6 //若anjian=0则顺序执行,否则跳转到f63 acall delay54 inc keycount //keycount++5 f6: 6 ret
jb为位条件转移指令,功能是若直接寻址的位bit=1,则程序转移到指定的目标地址去执行,若bit=0,则程序顺序执行。
(6)c语言78-83行delay函数改为
delay70:
mov r6,#70
d2: mov r7,#248
d1: djnz r7,d1 //248*70次
djnz r6,d2
ret
delay5:
mov r6,#5 //消抖。
f7: mov r7,#248
f8: djnz r7,f8 //248*5次
djnz r6,f7
ret
注意:248=2 8 ,约等于1ms。delay为延时程序。
温馨提示???在汇编中程序代码的大小写不受影响,但在c语言中就有影响了。
思考1:ret和 reti都是程序返回指令,有什么区别?
我的回答:ret是子程序返回指令,reti是中断子程序返回指令。区别在于如果是acall、lcall指令调用的子程序,返回指令就用ret;如果地址是0003,0013,000b,001b,0023调用的子程序,返回指令就用reti。
思考2:mov 20h,#0h和 setb 20h都是加1,用什么区别?
我的回答:mov指令中的20h指字节,setb中的20h是位。
2020上半年无人机领域重要融资事件汇总
铭瑄挑战者B360M主板评测:500元以下唯一的双M.2 B360主板
基于ENC424J600的以太网与串行接口转换技术
印度宣布已完成一套完整的5G系统,2021年进行现场部署
谁是性价比之王?华为P9、荣耀8、vivox9 plus、小米5S对比评测,教你怎么选!
如何利用单片机设计一个99码表
剑桥大学开发出具有触觉感应功能的新型水凝胶皮肤
远程数字油田视频无线监控系统的组成、特点及应用注意事项
IBM揭示出2022年商业格局 5大趋势
linux中断处理之IRQ中断
如何让更多用户使用到许可证(License),节省采购成本
表面瑕疵在线检测仪可帮助企业快速检测出产品瑕疵
电容,电感和霍尔效应感测低功耗解决方案
90Hz屏是一种什么样的体验,一加7T来告诉你
苏州研发中心ODM生产服务采购候选人:华为、浪潮、曙光三厂商入围
人脸识别一体机在识别过程中容易出现哪些问题?
【节能学院】电力监控系统在西郊金茂府地库项目中的研究与应用
深度解读电梯媒体缔造者—分众传媒
加州大学用3D打印重建了具有1500年历史的蒂瓦纳
上海通用武汉工厂初体验,揭秘全新英朗豪华、先进工艺背后的故事