上程序:
main.c
#include
#include "Timer.h"
/********P1口低有效******************/
void main(void)
{
init();//中断初始化
while(1)
{
}
}
Timer.h
#ifndef _TIMER_H_
#define _TIMER_H_
extern void init(void);
#endif
Timer.c
#include
int k=0;//占空比
unsigned int count=0;//计数
unsigned int BOOL=0;//由暗到亮,BOOL=1,由亮到暗
#define max 99
#define min 0
#define led_state P1
void init(void)
{
TMOD=1; //定时器0,工作方式1
TH0=0xff; //装入初值200us
TL0=0x47;
TR0=1; //开始定时
ET0=1;
EA=1;//CPU开放中断
}
void inter(void) interrupt 1
{
static int temp_k=0;/*如果定义成局部变量,则
必须定义成静态局部变量,静态局部变量是在编译时
赋初值的,只赋初值一次,以后每次调用函数时
不再重新赋初值而只是保留上次函数调用结束时的值。*/
TH0=0xff;
TL0=0x47;
if(++count>=100) //0-99次不成立,共100次
{
count=0;
if((k<=max)&&(0==BOOL))
{
k++;
if(k>max)
{
BOOL=1;
k=max;
}
}
if((k>=min)&&(1==BOOL))
{
k--;
if(k{
BOOL=0;
k=min;
}
}
temp_k=k;
}
if(temp_k>0)
{
led_state=0x00;
temp_k--;
}
else
led_state=0xff;
}
备注:C程序设计教程 谭浩强 P171-174仔细看看
关于静态局部变量几点注意:
1.静态局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值;
2.静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放;
3.对静态局部变量是在编译时赋初值的,即只赋初值一次。自动变量赋初值是在函数调用时进行,每调用一次函数,重新给次初值;
4.如果定义局部变量时不赋初值的话,则对静态局部变量编译时自动赋初值0(对数值型变量)或空字符(对字符型变量),而自动变量如不赋初值,则它的值是不确定的;
5.静态局部变量在函数调用结束后仍然存在,但是其它的函数不能引用它。因为他是局部变量,只能被本函数引用;
6.三种局部变量存储位置不一样:自动变量存储在动态存储区,静态局部变量存储在静态存储区,寄存器变量存储在CPU的寄存器中。
需要用到静态局部变量的情况:
1.需要保留函数上一次调用结束时的值;
2.如果初始化后,变量只被引用而不改变其值,则这时用静态局部变量比较方便,以免每次调用时重新赋值。
三种局部变量:
auto变量
static局部变量
register变量
关键字:单片机 静态局部变量 static
引用地址:
单片机之静态局部变量static
推荐阅读最新更新时间:2024-03-16 15:31
学习笔记-avr单片机C编程1
这几天在看AVR单片机的书。ASURO的项目的编程是建立在已有的成熟函数上,所以导致我对AVR单片机的运行机理(中断、定时器的使用)不甚了解。突然一个个超声波模块的程序放在眼前,才发现我连AVR单片机的了解基本上等于零。另外一个项目需要用mega128控制直流电机,还有和无线、有线遥控器的通信,电路(模块)需要自己搭起来,那么就必须知道AVR单片机的原理和编程。 和已经学过的51单片机相比,MEGA系列单片机是十分高级的单片机,功能强大,因而在构造和使用上也复杂了一些。 存储器区别,AVR分为5个部分,访问指令上有区别。 输入输出,51是准双向口,每个端口只有一个寄存器。而AVR的I/O口是标准双向口,
[单片机]
图文教你理解单片机STM32时钟
众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。 其中,高速时钟(HSE和HSI)提供给 芯片 主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号. 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采用8M
[单片机]
单片机实例---定时器控制点阵显示0~9
显示状态:点阵上每隔1s显示一个数字,显示到9又重头显示不断循环 #include reg52.h #include intrins.h typedef unsigned int u16; typedef unsigned char u8; u8 flag=0; //时间标志位 #define lie_io P0 //定义P0端口 sbit RCLKK = P3^5; sbit SRCLK = P3^6; sbit SER = P3^4; //串行输入 unsigned char code lie = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; un
[单片机]
台系MCU厂商第三季度再传涨价
据台媒工商时报报道,马来西亚祭出封城措施以围堵新冠肺炎疫情,同步让微控制器(MCU)价格再度看涨。法人指出,在IDM厂率先喊涨后,义隆、松翰、纮康及九齐等MCU厂有望在第三季跟进调涨,涨幅落在双位数水准。 马来西亚因疫情封城,虽然半导体产业仍旧可维持六成人力上班维持营运,不过MCU市场目前正处于严重供不应求状况,在IDM大厂封测厂产能降载情况下,下半年MCU市场将更加吃紧。 不仅如此,中国大陆晶圆代工厂中芯国际及华虹等厂商传出下半年将优先供应中国大陆IC设计厂产能,因此恐将排挤到台湾MCU厂商。 供应链指出,中芯国际及华虹等晶圆代工厂早在2020年底前就通知台湾IC设计厂此事,台湾MCU厂商早已将产能全面移回台湾晶圆
[半导体设计/制造]
PIC16C74单片机SPI方式读写串行EEPROM程序
; list p=16C74, st=off ; PORTC PIN DESCRIPTION ; SCK bit 3, SDI bit 4, SDO bit 5, CS bit 7 ; Fosc = 10.0 MHz, thus each instr. cycle = 400ns ;***************Ram Register Definitions******************************* rxdata equ 25h addr equ 26h loops equ 27h ;***************Bit Definitions***************************
[单片机]
51单片机硬件定时器设定的初值问题
网上查了很多解释关于51单片机硬件定时设定的文章,发现说的不是特别透彻,可能大家觉得一些类似基本感念的问题就不用澄清了,所以对于我这样的入门小白理解起来有些障碍,这里我把自己的理解解释的细致多一些,希望能给同道中人一些帮助。 说到定时前需要澄清几个概念:震荡周期,状态周期,机器周期,指令周期。(学习什么知识概念必须掌握清楚,否则就“糊”了!) 震荡周期:(来自百度百科)在单片机系统中,定时器需要借助单片机内部提供的脉冲进行定时,此时,定时的依据是CPU提供的周期性振荡,振荡一次所需的时间称为振荡周期。单片机系统也可以通过外部晶体振荡器(也被称为晶振)提供振荡进行工作。 对于震荡周期的理解:计算机系统中通常需要同时处理多
[单片机]
汽车芯片,正式过剩
去年一年,经济疲软,芯片行业遭受寒冬侵蚀,尤其在消费、工业领域,砍单、减产明显。彼时,汽车芯片是芯片行业的唯一救星,正值汽车行业电气化变革热潮,叠加汽车芯片缺乏,可以说,汽车芯片是那时候半导体行业“全村的希望”。 而自去年下半年开始,汽车芯片市场开始疯狂内卷,行业开始忧心行业前景,供需关系逐渐开始有失衡迹象。直到今年初,汽车芯片跌价严重,库存过大,巨头的汽车板块开始松动下滑。这标着,这一个市场,终于正式迎来过剩的结局。 巨头开始发出警示 汽车芯片行业,本来有着自己的“特权”,但随着库存水位逐渐升高,供应能力逐渐恢复,供应关系开始逆转,汽车芯片也不再是奇货可居。 回看疫情期间,芯片生产开始短缺,彼时汽车制造商不愿
[汽车电子]
基于51单片机的喷墨打印机控制技术
单片机应用系统中最常用的输出打印设备是微型打印机,例如TP系列、UP系列打印机等,对它们的控制技术也较为成熟。但是近年来随着通用打印机的广泛使用,微型打印机的缺点也日益明显:一是通用性及互换性不强;二是打印输出文档的幅面过小,不便于装订及存档。而通用打印机都配有国际标准并行接口(CENTRONICS)和串行接口(RS232/422),纸张大小可任意选择。这些特点是微型打印机所无法抗衡的。因此在越来越多的单片机应用系统中逐渐趋向于使用通用打印?魑?蛴∈涑錾璞浮1疚慕樯芰艘訫CS-51系列单片机为核心,通过CENTRONICS国际标准8位并行接口控制驱动HP-DJ 600/800系列喷墨打印机的硬件接口电路没计方法及控制程序设计方法。
[单片机]