设单片机系统编写一个完整的C51程序使P1.6和P1,可以使用正确编码加上解压即可。
一、过程:
1、TMOD = 0X02//工作方式寄存器;
2、TH0 = 56//8位的用TH;
3、TL0 = 0//16位跟13位两个都用;
4、EA = 1//开总中断;
5、TR0 = 1//定时器开始计数,return。
二、单片机简介:
1、单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
2、概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。
3、单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效。
三、C51编程:
1、C语言是一种高级程序设计语言,它提供了十分完备的规范化流程控制结构。因此采用C51语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,这样可使整个应用系统程序结构清晰,易于调试和维护。
2、对于一个较大的程序,可将整个程序按功能分成若干个模块,不同的模块完成不同的功能。对于不同的功能模块,分别指定相应的入口参数和出口参数,而经常使用的一些程序最好编成函数,这样既不会引起整个程序管理的混乱,还可增强可读性,移植性也好。
3、在程序设计过程中,要充分利用C51语言的预处理命令。对于一些常用的常数,如TRUE,FALSE,PI以及各种特殊功能寄存器,或程序中一些重要的依据外界条件可变的常量,可采用宏定义"#define"或集中起来放在一个头文件中进行定义,再采用文件包含命令"#include"将其加入到程序中去。这样当需要修改某个参量时,只须修改相应的包含文件或宏定义,而不必对使用它们的每个程序文件都作修改,从而有利于文件的维护和更新。
四、编程的执行原理:
1、计算机对除机器语言以外的源程序不能直接识别、理解和执行,都必须通过某种方式转换为计算机能够直接执行的。
2、程序设计语言编写的源程序转换到机器目标程序的方式有两种:解释方式和编译方式。
3、解释方式下,计算机对高级语言书写的源程序一边解释一边执行,不能形成目标文件和执行文件。
4、编译方式下,首先通过一个对应于所用程序设计语言的编译程序对源程序进行处理,经过对源程序的词法分析、语法分析、语意分析、代码生成和代码优化等阶段将所处理的源程序转换为用二进制代码表示的目标程序。
5、通过连接程序处理将程序中所用的函数调用、系统功能调用等嵌入到目标程序中,构成一个可以连续执行的二进制执行文件。调用这个执行文件就可以实现程序员在对应源程序文件中所指定的相应功能。
这体现了嵌农和码农的价值观区别。嵌农会精心计算一个变量的范围,而码农很少这么做,因为码农默认的数值类型一般是int32,可以满足日常范围需求,甚至像Python那样的语言自带大整数特性,根本不用考虑范围。然而嵌农呢,尤其是你说的c51,是个Intel祖传8位机,本来ram就很少,当然要精心考虑变量的大小了。像int32这样的东西太奢侈了,只能精打细算,根据现实情况精选一个范围合适的类型。鉴于大部分情况并不需要负数,所以用unsigned类型能提高0以上的数值范围。另外需要指出的是很多c51编译器里int类型是16位的。所以嵌农的悲伤就在这里,别人已经开始写算法了,你还在研究这个变量存不存得下的问题。
C51语言,由C语言继承而来的单片机编程语言。
和C语言不同的是,C51语言运行于单片机平台,而C语言则运行于普通的桌面平台。C51语言具有C语言结构清晰的优点,便于学习,同时具有汇编语言的硬件操作能力。对于具有C语言编程基础的读者,能够轻松地掌握单片机C51语言的程序设计。
晚上随手写,也未调试,权当看看
程序有不严谨地方还得调试修改
#include <REGX51.H>
#define STATUS_1S 1
#define STATUS_2S 2
#define STATUS_3S 3
#define STATUS_4S 4
#define STATUS_5S 5
#define STATUS_15S 15
#define STATUS_28S 28
#define STATUS_29S 29
#define STATUS_30S 30
unsigned char flag,status,status_temp=1,status_temp_
sbit K1 = P0^0
sbit K2 = P0^1
sbit RLED = P0^2
sbit YLED = P0^3
sbit GLED = P0^4
void Init(void)
{
ET0=1
TR0=1
RLED=0 //亮
YLED=0
GLED=0
while(status_temp)
{
switch (status)
{
case STATUS_1S: //1S
{
RLED=1 //灭,闪一次
YLED=1
GLED=1
} break
case STATUS_2S: //1S
{
RLED=0 //亮,闪一次
YLED=0
GLED=0
} break
case STATUS_3S: //1S
{
RLED=1 //灭
YLED=1
GLED=1
status_temp=0
} break
}
}
status_temp=1
ET0=0
TR0=0
}
void Init_Timer0(void)
{
TMOD=0x01
// ET0=1
// TR0=1
EA=1
TH0=0X3C
TL0=0XB0 // 未计算,偷楼上的
}
void M_Start(void)
{
TH0=0X3C
TL0=0XB0
ET0=1
TR0=1
RLED=0 //红亮
while(status_temp)
{
switch (status)
{
case STATUS_1S:
{
if(status_temp_==1)
{
YLED=0
}
} break
case STATUS_2S:
{
if(status_temp_==1)
{
YLED=1
}
} break
case STATUS_3S:
{
if(status_temp_==1)
{
YLED=0
status_temp_=0
}
} break
case STATUS_15S: //15S灭,绿亮
{
RLED=1
GLED=0
} break
case STATUS_28S:
{
GLED=1
} break
case STATUS_29S:
{
GLED=0
} break
case STATUS_30S:
{
GLED=1
status=0
status_temp_=1
} break
}
}
ET0=0
TR0=0
status=0
status_temp=1
YLED=1
}
void M_End(void)
{
TH0=0X3C
TL0=0XB0
ET0=1
TR0=1
RLED=0 //亮 1次
YLED=0
GLED=0
while(status_temp)
{
switch (status)
{
case STATUS_1S: //1S
{
RLED=1 //灭一次
YLED=1
GLED=1
} break
case STATUS_2S: //1S
{
RLED=0 //亮二次
YLED=0
GLED=0
} break
case STATUS_3S: //1S
{
RLED=1 ////灭二次
YLED=1
GLED=1
} break
case STATUS_4S: //1S
{
RLED=0 ////亮三次
YLED=0
GLED=0
} break
case STATUS_5S: //1S
{
RLED=1 ////灭三次
YLED=1
GLED=1
status_temp=0
} break
}
}
status_temp=1
ET0=0
TR0=0
}
main()
{
Init()//单片机初始化
Init_Timer0()//定时器初始化
while(1)
{
if(K1==0)
M_Start()//模拟开始
if(K2==0)
M_End()//模拟结束
}
}
void interrupt_time0() interrupt 1 //核对头文件,一致就好
{
TH0=0X3C
TL0=0XB0
flag++
if(flag==20)
{
status++
flag=0
}
}