导航:首页 > 操作系统 > 单片机启动文件讲解

单片机启动文件讲解

发布时间:2023-06-18 13:09:13

1. 帮解释一下这个单片机的程序

#include <reg52.h> //包含51单片机头文件
//共阳极数码管0-9数组编码
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管位选数组编码,这里有8位数码管(既8个数码管)
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//下面是变量申明
unsigned char mode=0;
unsigned int temp;
float dianya;
unsigned int dianya1;
//下面是51单片机端口位申明
sbit START=P1^5;
sbit EOC=P1^6;
sbit OE=P1^7;

sbit a=P1^0;
sbit b=P1^1;
sbit c=P1^2;

sbit key=P1^3;
//一个延时函数
void delay(unsigned int z)
{
while(z--);
}
//按键扫描函数
void key_scan()
{
if(key==0) //当key按下时,key既端口P1^3
{
delay(10); //延时
if(key==0) //在检测端口P1^3是否为低
{
/********************************************
到这里你发现你程序有问题
********************************************/
}
}
switch (mode) //这里也有问题,如果mode只为0,变量a b c清0,可以用if语句
{
case 0 : a=0;b=0;c=0;break;

}
}
void main() //主函数
{
unsigned char aa[4],i;
while(1)
{
key_scan();

P2=wei[0]; // 选中第一个数码管
P0=seg[mode]; //第一个数码管显示存在变量mode里的数

/*******************************************
下面部分应该为从AD检测一个电压
*******************************************/
START=1; //P1^5 置1
delay(10); //延时
START=0; //P1^5 置0
while(EOC==0); //如果P1^6为0,一直循环等待
OE=1; //P1^7置1
temp=P3; //把P3端口上8位数赋值给变量temp

dianya=(5.0/255)*temp; //8位AD值转换成电压显示值
dianya1=dianya*10;
aa[2]=dianya1/10; //把转换后的值除10
aa[3]=dianya1%10; //把转换后的值求模

for(i=2;i<4;i++)
{
P2=wei[i]; //数码管2,3分别位选
if(i==2)
P0=seg[aa[i]]&0x7f; //显示转换后的电压值aa[2]并加上点 (除10的值)
else P0=seg[aa[i]]; //显标转换后的电压值aa[3](求模值)
delay(1);
}
}
}

2. 单片机关于STARTUP.A51

用包含一词好像有点不妥,当在kiel C中新建项目时,会问:
Copy standard 8051 Starup Code to Project Forder and add file to Project?
翻译为:复制8051启动代码到项目并和添加文件到项目?

其实无论您选是还是否,您的代码中都将包含该文件。
该文件的作用是 初始化 内外部 RAM使其清零,另外还初始化SP等。
如果上述提示框您选否,对哪些RAM清零将采用默认的方式。
如果您想改变RAM清零区域(假如希望复位时某些RAM不被清零时会很有用。),您可以选是,这样该文件的一个副本将添加到您的项目,您可以根据需要改写此文件。

其他SP,SAMLL/COMPACT、LARGE模式的重入函数的堆栈和指针的初始化等和RAM的道理是一样的。

3. 请教单片机的启动过程

看过一篇文章说道:

CPU启动后到有两种方式:
1、CPU重启后,将其PC寄存器设为特定地址,只要用户的起始程序存在这个地址,就可以被正确执行;
——貌似51就是启动后将PC寄存器设为00H。

2、CPU重启后,会将CPU中存储中断矢量表地址的寄存器设为某特定地址,接着引发RESET中断,程序
员只要把中断矢量表存储在这个地址。并指定RESET中断的处理程序为自己写的某个函数,则该函数就可以在
开机后被CPU执行。
——中断矢量表不是固定在FLASH内部的一段内存吗?怎么又多了个存储中断矢量表的寄存器?
——栈、堆等的初始化到底是在RESET中断的执行之前还是之后?

由于,应用到的程序一直是用C写的,很少去关心单片机的启动过程,往往编译器也有现成的傻瓜版启动代码,
至于汇编毕业后就都忘得7788了。所以,单片机启动过程这一块我还是很乱很迷糊的,希望哪位有经验的朋友
能够指导或者做个概述一下,万分感谢!~

4. 单片机C语言程序,看不懂,求讲解

“T0中断服务程序不是一个子程序吗?但没看见在主程序中调用这个子程序啊,求讲解这个程序命令的运行过程,定时器怎么中断的?”
该子程序是在硬件产生中断的时候,跳转到相应中断入口后,再跳转到这个中断服务程序的。请注意函数后面的“interrupt x”声明,这是C51的扩展内容。
“用示波器测波形是测p1.0引脚,为什么是这个引脚,怎么确定的?咐族仿p1_0不是个变量名吗?”
P1_0这个符号在前面的头文件穗漏 t89c51cc02.h 中有定义。至于“为什么是这个引脚”,是由硬件设计及本程序共同确定的。P1_0(不是你写的p1_0,C语言要区分衡纤大小写哦)代表P1口的第0管脚,在头文件中通过sbit定义。
“为什么T0中断服务程序和主程序中都有T0的初值,设置还是一样,他们有什么关系?”
主程序前面的是对Timer0初始化,赋以初值。执行 TR0 = 1; 这一句以后,Timer0就开始运行了——TL0与TH0组成的13位计数器开始不断递增。当13位全部为1之后,再递增就全部为0,此时溢出事件会触发产生定时器0,同时计数器仍然在继续计数——为了让时间间隔保持一致,就需要再度将计数器赋以初值。

阅读全文

与单片机启动文件讲解相关的资料

热点内容
java程序员一天多少行代码 浏览:942
丧尸危机java 浏览:121
华为手机怎么去除app标记未读信息 浏览:852
java监控文件夹 浏览:803
群控服务器主机怎么转变普通电脑 浏览:705
手机怎么调整app大小 浏览:453
加密门禁卡揭秘 浏览:137
词释pdf 浏览:991
安卓手机上如何停止自动续费 浏览:880
加密编码摘要 浏览:785
疫情命令党 浏览:496
java转sql 浏览:705
android获取apn 浏览:74
phpfpm进程池 浏览:793
解压掏耳朵音频 浏览:676
爬香山解压 浏览:953
算法导论回溯 浏览:345
开盘指标源码查询 浏览:528
有道云保存服务器出错 浏览:641
生成360文件夹 浏览:1006