- STC系列单片机C语言编程基础模板
- 适用于MCS-51内核的单片机产品(以STC系列单片机为例)
- 以STC12C2052AD单片机P1接口8个LED灯实验电路为例
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( --a != 0){
for(i = 0; i
}
}
/*********************************************************************************************/
- 程序模块
/*********************************************************************************************
程序名: 占用CPU延时程序应用实例
编写人: 杜洋
编写时间: 2009年9月23日
硬件支持: STC12C2052AD 12MHz
接口说明: P1接口8个LED灯
修改日志:
NO.1-
/*********************************************************************************************
说明:本程序可使单片机P1.0接口上的LED灯以1秒为周期闪烁。
/*********************************************************************************************/
#include //通用89C51头文件
sbit LED = P1 ^ 0; //定义闪烁LED
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( --a != 0){
for(i = 0; i
}
}
/*********************************************************************************************/
/*********************************************************************************************/
void main (void){ //主程序
while(1){
LED = ~LED; //取LED相反状态
DELAY_MS(1000); //修改这里的数值看看会有什么变化
}
}
/*********************************************************************************************/
- 应用实例
1. 占用CPU的延时程序应考虑系统时钟频率,本实验以12.000MHz晶体为例。
2. 占用CPU的延时程序还需要考虑单片机的机械周期,12T单片机(AT89C51)与1T单片机(STC11F32XE)的延时长度不同。
3. 请不要使用CPU延时程序作为长时间延时功能使用(如1小时延时)。
4. 程序中的中断处理将影响延时长度。
可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。
- 使用说明
data unsigned char cou = 0; // 定义软计数器,放在程序最前面的寄存器定义部分
/**********************************************************************************************/
void init (void){
TMOD = 0x11; // 定时/计数器0,1工作于方式1
TH0 = 0x3c; // 预置产生50ms时基信号
TL0 = 0xb0;
EA = 1; // 开总中断
ET0 = 1; // 定时/计数器0允许中断
TR0 = 1; // 开闭定时/计数器0
}
/**********************************************************************************************/
/**********************************************************************************************/
void tiem0(void) interrupt 1{ // T/C0中断服务程序(产生50ms时基信号)
if(cou
cou = 20; // 软计数器清零
}
cou--; // 软计数器加1
TH0 = 0x3c; // 重置定时常数
TL0 = 0xb0;
}
/**********************************************************************************************/
- 程序模块
/*********************************************************************************************
程序名: 中断延时程序应用实验
编写人: 杜洋
编写时间: 2009年9月23日
硬件支持: STC12C2052AD 12MHz
接口说明: P1接口8个LED灯
修改日志:
NO.1-
/*********************************************************************************************
说明:本程序可使单片机P1.0接口上的LED灯以1秒为周期闪烁。
/*********************************************************************************************/
#include //通用89C51头文件
sbit LED = P1 ^ 0; //定义闪烁LED
data unsigned char cou = 0; // 软计数器,对10ms时基信号累加到1s
/**********************************************************************************************/
void init (void){
TMOD = 0x11; // 定时/计数器0,1工作于方式1
TH0 = 0x3c; // 预置产生50ms时基信号
TL0 = 0xb0;
EA = 1; // 开总中断
ET0 = 1; // 定时/计数器0允许中断
TR0 = 1; // 开闭定时/计数器0
}
/**********************************************************************************************/
/**********************************************************************************************/
void tiem0(void) interrupt 1{ // T/C0中断服务程序(产生50ms时基信号)
if(cou
cou = 20; // 软计数器清零
LED =~ LED; //让LED灯闪烁
}
cou--; // 软计数器加1
TH0 = 0x3c; // 重置定时常数
TL0 = 0xb0;
}
/**********************************************************************************************/
/*********************************************************************************************/
void main (void){ //主程序
init(); //延时程序(定时器)初始化
while(1){
//无限循环程序(可加入其他程序)
}
}
/*********************************************************************************************/
- 应用实例
1. 中断处理延时程序应考虑系统时钟频率,本实验以12.000MHz晶体为例。
2. 中断处理延时程序还需要考虑单片机的机械周期,一般情况下STC的1T单片机与AT89C51的定时器周期兼容。。
3. 程序中出现其他的中断程序将影响延时准确度。
可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。 - 使用说明