单片机c语言代码详细解释?单片机编程入门基础知识
大家好,如果您还对单片机c语言代码详细解释不太了解,没有关系,今天就由本站为大家分享单片机c语言代码详细解释的知识,包括单片机编程入门基础知识的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
单片机C语言编写共阳0~999,最好解释详细点!
/***数显秒表,范围0~999***/
/***源程序默认硬件环境:52单片机,12MHz晶振,3位共阳数码管,P0口段选,P10~P12高电平位选(NPN三极管驱动),P12为最高位数码管***/
#include"reg52.h"//包含52头文件
#define TRUE 1//定义布尔量'1':真
#define FALSE 0//定义布尔量'0':假
#define uchar unsigned char//定义无符号字符型数据简称
#define uint unsigned int//定义无符号整型数据简称
#define th0 0xfc
#define tl0 0x18//1ms at 12MHz(定时器工作模式1状态)
#define SEG_Num 3//数码管位数
#define SEG_Data P0//数码管段驱动接口
#define SEG_En P1//数码管位驱动接口
#define SEG_AllOff(SEG_En&=0xf8)//关闭所有数码管(位驱动)
#define DisTimeAt1msCount 5//单'位'数码管显示时间,数码管刷新频率f=1/(N×t),其中 N为数码管位数, t为单'位'数码管显示时间
#define T1sAt1msCount 1000//1秒计数值(在定时器为1ms情况下计数)
#define TimesEnd 1000//显示内容范围 0~999
uchar code SEG_B_List[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管代码表"0-9"
uint Sec;
uchar bdata Flag=1;
sbit DisplayFlag=Flag^0;//显示标志位
sbit TimesUpFlag=Flag^1;//时间更新标志位
void Timer0() interrupt 1//定时器0中断函数
{
static uchar t1ms;//定义静态变量 t1ms定时计数寄存空间
static uint t1ms_sec;
TL0=tl0;
TH0=th0;//重赋 1ms定时初值
t1ms=++t1ms%DisTimeAt1msCount;//先计数值加1,后对计数范围进行限制0~(DisTimeAt1msCount-1)
if(!t1ms) DisplayFlag=TRUE;//若定时计数值归0,则表示计数值曾到达单'位'显示时间(DisTimeAt1msCount),显示标志置位
t1ms_sec=++t1ms_sec%T1sAt1msCount;//在 T1sAt1msCount(1000)范围内加1
if(!t1ms_sec) TimesUpFlag=TRUE;//若归0,则1s时间到,时间更新标志位置位
}
void SystemInit()//系统初始化函数
{
TMOD=0x01;//关闭定时器1,开启定时器0,且工作在模式1(16位定时器)
TH0=th0;
TL0=tl0;//装定时初值(1ms at 12MHz)
TR0=1;//启动计时
ET0=1;//允许定时器0中断
EA=1;//开启系统中断功能
}
float Pow_Self(float x,uint y)//自编简易 x的 y次方函数,y只能是非负整数
{
float sum;
if(x==0&& y==0) return;//0的 0次方无意义
else if(x==0) sum=0;//可有可无,y!=0的情况已经包含x=0,不加不影响结果,但影响运算速度
else if(y==0) sum=1;//除上述情况外,任何数的 0次方均为 1
else if(y==1) sum=x;//任何数的 1次方均为本身
else if(y>1) sum=Pow_Self(x,--y)*x;//递归调用,降幂
return sum;//返回计算结果
}
void TimesUpdata()//时间更新函数
{
if(TimesUpFlag)//若时间更新标志为真
{
Sec=++Sec%TimesEnd;//Sec(秒)在 TimesEnd(0~999)范围内加1
TimesUpFlag=FALSE;//清时间更新标志位
}
}
void Display(uint dis_num)//显示函数,显示内容为无符号整型数据 dis_num
{
static uchar dis_loca;//定义静态变量显示位置
if(DisplayFlag)//若显示标志位为真(单'位'显示时间结束),则执行以下任务
{
DisplayFlag=FALSE;//清显示标志位
dis_loca=++dis_loca%SEG_Num;//先对显示位置加1,后对变量范围进行限制 0~(SEG_Num-1)
SEG_AllOff;//关闭所有数码管显示(位驱动)
SEG_Data=SEG_B_List[(dis_num/(uint)(Pow_Self(10,dis_loca)))%10];//将显示内容(dis_num)本次需显示的位(dis_loca)上的数值转成代码,并送到数据端口
SEG_En|=1<<dis_loca;//开启本次需要显示的位驱动
}
}
void main()//主函数
{
SystemInit();//调用系统初始化函数
while(1)//循环系统
{
TimesUpdata();//调用时间更新函数
Display(Sec);//调用显示函数显示内容为 Sec
}
}
单片机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,同时计数器仍然在继续计数——为了让时间间隔保持一致,就需要再度将计数器赋以初值。
一段单片机C语言,求大神逐句翻译一下。
#include<REGX51.H>//头文件
#define uchar unsigned char//变量关键字更改
#include<intrins.h>//头文件
uchar code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0};
//字符数组定义
void delay()//子函数定义
{ uchar i,j;//变量定义
for(i=0;i<15;i++)//for语句,执行15次
for(j=0;j<250;j++)//执行250次
{_nop_();}//共执行250*15次空函数,延时操作
}
uchar seg7(uchar a)//子函数定义
{return tab[a];}//返回tab数组内第a个变量的值
void main(void)//主函数
{ uchar i,j,k,x,y;//变量定义
P1=0xff;//port1全部置位
P0=0xff;//port0全部置位
y=0;//y赋0
while(1)//无限循环
{ j=0xf7;//j赋11110111
k=y;//y赋给k
for(i=0;i<4;i++)//4次循环
{
P0=seg7(k);//P0=第K个元素的值
k++;//k=k+1
P1=_cror_(j,i);//P1口带返回的移位操作
delay();//延时
P1=0xff;//P1全部置高
}
x++;//x=x+1
if(x==15){x=0;y++;}//如果15次,x=0,y=y+1
if(y==8)y=0;//8*15次,y=0,重新开始循环
}
}
文章到此结束,如果本次分享的单片机c语言代码详细解释和单片机编程入门基础知识的问题解决了您的问题,那么我们由衷的感到高兴!