呵呵 俺帮你吧
CNT EQU 30H ;使用片内数据存储器30H 为用户定义一个软件计数器
ORG 0000H ;单片机起始地址
SJMP STA ;跳转到主程序STA
ORG 000BH ;定时计数器0的中断入口地址
LJMP T0ISR ;转定时计数器0的中断
ORG 0050H ;主程序起始地址
STA:
MOV TMOD,#01H ;设置模式寄存器 规定定时器0 定时 工作在方式1 为16位的定时计数器
MOV TH0,#3CH ;送时间常数
MOV TL0,#0B0H ; 定时时间=50ms
MOV P1,#0FEH ;送LED指示灯的亮灭初值即: 灭灭灭灭灭灭灭亮
MOV CNT,#20 ;送软件计数器的计数初值为20 即软件定时=1秒
SETB ET0 ;允许定时器0中断
SETB TR0 ; 启动定时器0定时
SETB EA ;开中断
SJMP $ ;等待定时器中断
T0ISR: ;定时器0中断服务程序
CLR TR0
MOV TH0,#3CH ;重新送时间常数
MOV TL0,#0B0H;50ms
SETB TR0
DEC CNT ;软件计数器减1
MOV A,CNT
JNZ T0ISRE ;等于0 表明定时时间=2050ms=1秒
MOV CNT,#20 ;重新送初值
MOV A,P1
RL A ; LED指示灯的亮灯左移一位
MOV P1,A
T0ISRE:
RETI ;中断返回
END ;汇编结束
呵呵 满意就选满意回阿
建议你到网上搜索个单片机C语言的教程看看,高手是没时间给你一句句注释的
我大概给你说一下0x代表16进制数,0b代表2进制数,十进制数一般什么都不加
char a=0x10;//十六进制
char a=0b00010000;//二进制数
char a=20; //十进制数
由于单片机一般处理无符号数,所以大部分的变量都这么定义:
unsigned char a=0x10;//unsigned代表无符号的意思
另外unsigned char code a=0x10;代表将变量存到程序区(,没有code关键字变量是放在数据区的,别说分不清程序区和数据区)类似的关键字还有:
data:存到片内低128字节的数据区
bdata:变量存到客位寻址区
pdata:片外256字节内
xdata:片外ram中
两外这两句:
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
初学者往往是计算出定时值,换算成16进制数再写入TH0,TL0(我当年也这么傻),
其实这个过程可以让编译器完成,就定义成上面的两句
void time0() interrupt 1:
interrupt是c51为中断新增加的关键词,提供中断入口,完整声明为
void 中断名 (void)interrupt 中断号x using n
中断号x可以为0~31,其中0:表示外部中断0,1表示定时器0中断等等,using n表示使用第几组用户寄存器,n=0~3
还是建议你看看C51的书,内容太多了
这个是单片机实现数码管动态显示时间,并有按键配合实现时间设置的程序
如果方便的话,建议给出完整的代码,更好阅读理解一些
有一点疑问,不清楚‘shan==1 ’有什么含义
代码在这里格式丢失了,你可以看看附件的c文件
void display0()
{
if(shan==1&&mode0==1)P0=0xff; // shan=1 并且 mode0=1 则关闭显示(此时正在进行‘分’设置)
else // 其他情况下,显示时间的分钟( 假设时间是“12:34”)
{
P0=table[minute/10]; //P0输出段码, ‘分’的 高位 即‘1’
P2=(~1)|0xf0; //数码管第一位点亮
delay_ms(15); //使数码管维持第一位点亮15毫秒
P2=0xff; //取消段选,关闭数码管显示,以免切换到下一位显示的时候产生干扰
P0=table[minute%10]; //P0输出段码, 分 低位 即‘2’
P2=(~2)|0xf0;delay_ms(15);//数码管第二位点亮
P2=0xff;
}
if(shan==1&&mode0==2)P0=0xff;// shan=1 并且 mode0=2 则关闭显示(此时正在进行‘秒’设置)
else // 其他情况下,显示时间的秒( 假设时间是“12:34”)
{
P0=table[second/10]; //P0输出段码,秒 高位 即‘3’
P2=(~4)|0xf0;delay_ms(15);//数码管第三位点亮
P2=0xff;
P0=table[second%10]; //P0输出段码, 秒 高位 即‘4’
P2=(~8)|0xf0;delay_ms(15);//数码管第四位点亮
P2=0xff;
}
led1=1;led2=1; // LED1 LED2 关闭(或点亮)
if(!shezhi) //如果 shezhi =0 (按下‘设置’按键)
{
delay_ms(200);
mode0++; //实现 mode0自加
if(mode0>2)mode0=0; //大于2则归0
}
if(mode0==1) //在 mode0=1时进行 时间 分 设置
{
if(!jia){delay_ms(200);minute++;if(minute>59)minute=0;} //按键‘加’ 按下时 分 加1 ,如果分超过59,则归零
else if(!jian){delay_ms(200);minute--;if(minute>59)minute=59;}//‘减’ 按下时 分 减1 ,如果分超过59,则归零(0-1=-1,但对于unsigned char型数据,-1=255,所以会有255>59的情况)
}
else if(mode0==2) //在 mode0=2 时进行 时间 秒 设置
{
if(!jia){delay_ms(200);second++;if(second>59)second=0;}//‘加’ 按下时 秒 加1 ,如果秒超过59,则归零
else if(!jian){delay_ms(200);second--;if(second>59)second=59;}
}
}
以上就是关于求该单片机程序的注释全部的内容,包括:求该单片机程序的注释、哪位高手给这个51单片机的程序写个注释、单片机程序标下注释~~~~~~~~~~高分悬赏等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)