8052单片机程序存储器中的六个特殊单元是什么,各有何用途?

如题所述

#include<reg52.h> 头文件
#define uchar unsigned char 宏定义懂吧 以后unsigned char就用uchar表示了
uchar code table[]=
;编码定义和C中数组定义方法类似 这里主要是为了让数码管显示具体数字而编的
uchar seconds,minute,count1; 定义变量

/**********初始化函数***************/
void init()
{
P0=0xff; 这个有电路图才好说 不过好像是让端口都为高电平
P0=0x00; // 初始化关显示
seconds=0;
minute=0;
count1=0;
TMOD=0x11; //选择计数器T1模式1
TH1=(65536-46080)/256; 这是定时器的设置 计算初值 改变那个被减数可以改变每次的时间
TL1=(65536-46080)%256; //定时器1实现50MS定时 同上
EA=1; //开总中断
ET1=1; //开定时器1中断
TR1=1; //定时器1开始计数
}

/******定时器1中断函数*********/
void t1() interrupt 3 //定时器1中断级别为3
{
TH1=(65536-46080)/256;//数据重载 “/”这符号是求模
TL1=(65536-46080)%256; ”%“这符号是求余
count1++;
if(count1==20) 这个20乘以上面的那个50毫秒就是1秒钟
{
count1=0; 计20次重新归零
seconds++; 每计20次秒数加一
if(seconds>59)
{
seconds=0;
}minute++; 当秒数>59时秒数归零 分加1 我个人觉得这应该设置为>60 如果设置为59的话 seconds=59的时候就归零了 就是说59可能就不会显示了

}
}

/*******延时函数***************/
void delay(uchar xms)
{
char x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--); 这是根据程序仿真算的时间 每110次大概就是一毫秒 设置X等于几就是几毫秒
}

/************显示函数***********/
void display(uchar temp)
{
uchar qian,bai,shi,ge; 定义变量
temp=seconds; 把seconds的值传递给temp

qian=minute/10; 对10取模
bai=minute%10; 对10取余

shi=temp/10; 对10取模
ge=temp%10; 对10取余

P0=0xff; //消隐 这个没什么大用 去掉也可以
P2=0xdf;//第一个数码管选中 这个值得看你那电路图
P0=table[ge]; 对P0赋值 从table中调取
delay(1); 调用延迟函数 延迟一毫秒

P0=0xff;//消隐
P2=0xef;//第二个数码管选中 看电路图赋值
P0=table[shi]; 同上
delay(1);

P0=0xff;//消隐
P2=0xf7;//第三个数码管选中
P0=table[bai];
delay(1);

P0=0xff;//消隐
P2=0xfb;//第四个数码管选中
P0=table[qian];
delay(1);
}
/************主函数***********/
void main()
{
init(); 初始化函数
while(1) 大循环
{
display(seconds); 让数码管开始显示 计秒
}
}
这是一个计时器程序 没有小时 是计秒 然后还有分钟 我也是初学者 有什么问题我们可以再讨论 我的邮箱[email protected] 有问题发邮件给我一起讨论
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-31
0000H MCS—51系列单片机复位后PC=0000H,即系统复位后从 0000H单元开始执行程序(俗称复位单元)
0003H 外部中断0 中断服务程序入口地址
000BH 定时器/计数器0溢出中断入口地址
0013H 外部中断1入口地址
001BH 定时器/计数器1溢出中断入口地址
0023H 串行口中断入口地址
51和52应该是相通的吧

参考资料:http://zhidao.baidu.com/question/195744036.html

本回答被提问者采纳
第2个回答  2010-12-31
什么特殊单元没听说过!说的清楚一点本回答被网友采纳
相似回答