
可以用_nop_( )函数来实现微秒级的延时。
_nop_(); // 直接当成一条语句使用,产生一条NOP指令NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。
注:使用该函数时,需要将头文件#include<intrinsh>包含进源文件中。
1、reg52h中声明了特殊功能寄存器的地址,属于单片机软件最基本的头文件,源程序中一般必须要包含的。具体到程序中:P0,P2均在其中定义,如注掉第一行编译会出错,也就是说用到了对P0、P2的定义
2、mcuh不是51标准头文件,属于软件编制人员自己编制的头文件(你没有提供这个文件),里面至少包含了诸如“typedef unsigned char uchar;”的语句,用以声明uchar数据类型,因为uchar并不属于标准的数据类型,只是搞单片机软件设计的人员自己做的简化,其他编程人员一看就明白。也就是说用到了uchar数据类型的声明。
3、从程序上看只用到了与P2、P0口相关的电路,动态扫描显示汉字;P0应该是行选择,P2应该是列选择。
粗看一下,感觉上这个软件执行有问题
1、可能什么都看不清,因为主程序中delay()的延时太短,是毫秒级的,这样每个汉字刚显示完就被第二个汉字刷新了。
2、假设每一个汉字显示1秒钟(假设delay为1ms延时),那么软件至少应变为
t = 1000;
while(--t)
{//固定显示“大”1秒钟
disp_zifu(&led_hanzi[i][0]);
delay();
}
t = 1000;
while(--t)
{//固定显示“小”1秒钟
disp_zifu(&led_hanzi1[i][0]);
delay();
}
。。。。。
因为是动态显示模式,任何一个时刻只能点亮8列LED等,若要在视觉上看到汉字,需要不断刷新送显示,利用人眼的视觉驻留特性才能看到汉字;
3、主程序中的i变量无初值,一次循环完成后也未复位会有问题
你可以按照以下步骤编写STC8G1K08芯片的LED点亮和灭的时间控制程序:
设置芯片的时钟和计数器,以便实现时间控制。例如,可以使用定时器或延时函数来控制时间。
在主函数中编写程序,实现LED点亮和灭的时间控制。可以使用if语句或while语句来判断时间是否达到要求,然后控制LED灯的点亮和灭。
在main函数中添加延时函数,以实现上电后30秒后LED灯开始点亮的要求。
下面是一个简单的示例程序,仅供参考:
#include<reg52h>
sbit LED=P1^0;
void delay(unsigned int i)
{
while(i--);
}
void main()
{
unsigned int count=0; //计数器,用于实现30秒的延时
while(count<30000) //上电后30秒开始执行程序
{
delay(1000); //每次延时1秒
count+=1000;
}
LED=1; //点亮LED
delay(3000); //LED持续3秒
LED=0; //灭掉LED
while(1); //芯片不工作
}
在上述程序中,使用了一个计数器来实现上电后30秒的延时,然后LED点亮并持续3秒后灭掉,最后芯片不工作。需要注意的是,示例程序仅供参考,具体实现方式需要根据实际情况进行调整和优化。
#include<stc89h>
#define uchar unsigned char
#define uint unsigned int
void TI2_way0(uint numerical);//定时器2 16位定时计数 numerical 定时计数数值 传统方式
void TI2_way1(uint numerical);//定时器2 16位自动重装定时计数 numerical 定时计数数值
void TI2_RUNset(bit state,way,control);//计数器/定时器2 运行与设置函数
/定时器2相关函数开始/
void TI2_way0(uint numerical) //定时器2 numerical 定时计数数值
{
numerical=(65536-numerical); //计算出定时值
TH2=(numerical/256); //定时器2的高8位计数值
TL2=(numerical%256); //定时器2的低8位计数
}
/定时器2 16位自动重装定时计数 numerical 定时计数数值/
void TI2_way1(uint numerical)//定时器2 16位自动重装定时计数 numerical 定时计数数值
{
//numerical=(65536-numerical); //计算出定时值
TH2=RCAP2H=(numerical/256); //定时器2的高8位计数值
TL2=RCAP2L=(numerical%256); //定时器2的低8位计数
}
/
计数器/定时器2 运行与设置函数
state 0关闭定时计数器2 1启动定时计数器2
way 0定时器模式 1计数器模式
control 0:16位自动重装定时器计数器 1:16位捕获
/
void TI2_RUNset(bit state,way,control)//计数器/定时器2 运行与设置函数
{
//IPH=PT2H; //定时器2中断优先级控制高位
RCLK=0;//接收时钟标志,0:使用定时器1作为串口接收发生器 1:使用定时器2作为串口接收发生器
TCLK=0;//发送时钟标志,0:使用定时器1作为串口发送发生器 1:使用定时器2作为串口发送发生器
switch(control) //启动方式选择
{
case 0x00:CP_RL2=0;EXEN2=0;break; // 0:16位自动重装定时器计数器
case 0x01:CP_RL2=1;EXEN2=1;break; // 1:16位捕获 捕获模式使能位
}
switch(way) //启动方式选择
{
case 0x00:C_T2=0;break; //定时器模式
case 0x01:C_T2=1;break; //计数器模式
}
TR2=state;//定时器2的启动控制位,1:启动定时器 0:停止定时器
ET2=1; //定时器2中断使能位
EA =1; //打开总中断
}
/
void Timing_count2() interrupt 5 //引脚P10
{
TF2=0;//定时器2溢出标志,由硬件置1,必须由软件清0
EXF2=0;//定时器2的外部标志,由硬件置1,必须由软件清0
}
/
int runlinght()
{int i,j;
j=1;
for(i=0;i<8;i++)
{P[i]=(j<<i); //假设输出高点亮
timedelay();
};
时间的问题,这里你只要在延时函数里解决就OK了,你在主函数里面计算调用点灯函数的次数,再用这个标志去改变延时函数的参数。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)