单片机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语言应用100例的内容简介
《单片机C语言应用100例》在编写时力求通俗、易懂,硬件原理讲解以“有用、够用”为原则,内容讲解以“紧密结合实践”为特色。因此,《单片机C语言应用100例》特别适合单片机零起点的初学者使用,可作为高等院校控制类专业学生、电子爱好者及各类工程技术人员的参考用书,也可作为高职高专及中专院校的单片机课程教学用书。
51单片机C语言程序
//你原来的b2,b2都是死循环,这是不行的,只有主函数才可以死循环。
//你的主函数结构也有问题。
//为你增加了一个按键检测的函数。
//下列程序通过了实验测试。
//b1输出的周期大约0.9s。
//b2输出的周期大约0.6s。
//K为触动开关,reg为红灯,bice为绿灯,b1、b2各为一个方波,
//按第一次触动开关时红灯亮、b1输出,
//按第二次绿灯亮、为b2输出,
//按第三次都关闭.
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint a;
void b1();
void b2();
sbit t= P1^0;
sbit k= P3^5;
sbit reg= P3^3;
sbit bice= P3^2;
void delay(uchar z)
{
uint x,y;
for(x= z; x> 0; x--) for(y= 110; y> 0; y--);
}
bit key()
{
bit kkk;
kkk= k;//读入按键.
if(kkk== 1) return 0;//没有按下.
delay(5);//延时.
if(k== kkk) return 1;//两次相等.
return 0;
}
void main()
{
while(1){
P3= 0xff;
while(!key());//静等按下第一次.
reg= 0;
bice= 1;
while(!key()) b1();//没有按下第二次就循环等待.
reg= 1;
bice= 0;
while(!key()) b2();//没有按下第三次就循环等待.
}
}
void b1()
{
P1= 0xfe; a= 50000; while(a--);
P1= 0xff; a= 50000; while(a--);
}
void b2()
{
P1= 0xfe; a= 30000; while(a--);
P1= 0xff; a= 30000; while(a--);
}
好了,文章到这里就结束啦,如果本次分享的单片机c语言指令汇总和单片机编程入门基础知识问题对您有所帮助,还望关注下本站哦!