单片机延时程序程序求解

Powered by&&&&基于51单片机计算器程序
基于51单片机计算器程序
基于51单片机计算器程序,编程语言用的是C语言。要做好计算器,4KB的程序存储空间已经不够用了,所以这里没有用51单片机,这里用的是AT89S52,拥有8KB程序存储空间。
实现功能:
  1、一定数值范围内的加减乘除、开方、倒数运算,能计算小数、负数,以及记忆功能。
  2、时钟功能,能直接用键盘上的数字键设置时间,一定时间内无操作能自动显示时间。
3、闹铃功能及可控制的按键声音
若举报审核通过,可奖励20下载分
被举报人:
hushiganghu
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行人人网 - 抱歉
哦,抱歉,好像看不到了
现在你可以:
看看其它好友写了什么
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&C8051单片机C语言程序设计的几个深层次问题及解决方法
已有 4241 次阅读
|个人分类:|系统分类:|关键词:单片机,8051,C语言,程序设计
&&&& 当在单片机(8051)环境下编写C语言程序设计时,常常会发生一些奇怪的现象。一个变量明明赋值为500,在运行过程中却莫名其妙地变成1000。 在WINDOWS下运行完全正常的算法,移植到单片机上就会出错。 如果无法保证一个变量的值按照程序设计者的要求变化,程序出现各种乱象就不奇怪了。
&& 这种现象出现在C语言程序比较长,子程序比较多,或是子程序的层次比较多的场合。 因此,在单片机环境下用C语言开发比较大的程序,很容易出现各种问题。
&& 这种问题出在编译器优化上。由于单片机资源有限,编译器采取了很多优化手段来减少资源占用。 在KEIL C上,编译器优化的层次有9级。然而,仅仅是二级优化(Data overlaying),就会导致长程序出现问题。 对于比较长的程序,应该只使用一级优化,更先进的优化最好不要用,否则会出现无法预料的问题。
& 用单片机开发比较长的程序时,应该选择有大容量程序存储空间和数据存储空间的单片机,将编译器优化限制在第一级,其它层次优化尽量避免用。 因为二级优化的数据覆盖手段可以把变量值改变,导致程序运行出错。
本文引用地址:&此文来自科学网陈儒军博客,转载请注明出处。
上一篇:下一篇:
当前推荐数:5
评论 ( 个评论)
作者的精选博文
作者的其他最新博文
热门博文导读
Powered by
Copyright &小木虫 --- 500万硕博科研人员喜爱的学术科研平台
&&查看话题
52单片机的程序问题,程序刚开始可以执行,可是执行一段时间后就不灵敏了!求高人指点
#include &reg52.h&& & & & // 89C52单片机头文件
#include &stdio.h&& & & &
#include &intrins.h&
sbit key1=P1^0;
sbit key2=P1^1;
sfr ISP_CONTR=0xe7;
idata unsigned char dis5_temp_
unsigned int num4=0,temp=0,num5=0;
unsigned char temp_buf_f=0;
unsigned int&&flag=0,flag1=0,flag2=0,flag3=0,flag4=0;
double num2=0,num3=0;
unsigned int num=0,num1=0;
unsigned&&char dis0_temp_buf={&&!@CSB&};
unsigned&&char dis4_temp_buf={&&!&JI&};& & & && &
unsigned&&char dis6_temp_buf={'#'};
unsigned&&char dis7_temp_buf={&&!&KF报警#&};
unsigned&&char dis10_temp_buf={&&!AKF1140&};
idata unsigned&&char dis11_temp_buf={&&!&KG常#&};
idata unsigned&&char dis12_temp_buf={&&!&LF故障#&};
idata unsigned&&char dis13_temp_buf={&&!ALF1140&};
idata unsigned&&char dis14_temp_buf={&&!&LG常#&};
idata unsigned&&char dis15_temp_buf={&&!&KK1#&};
idata unsigned&&char dis16_temp_buf={&&!&KK0#&};
idata unsigned&&char dis17_temp_buf={&&!LL&};
idata unsigned&&char dis18_temp_buf={&&!LH&};
void delayms(unsigned int xms)& & & &&&//延时程序
& & & & unsigned int m,n;
& & & & for(m=m&0;m--)
& & & & & & & & for(n=110;n&0;n--);
void T_init (void)& & & && & //T0用于计数,T2用于定时
& & & & TMOD=0x25;&&& & & && & //设置T1定时器和T0计数器的工作方式
& & & & TH0=0;& & & & & & & & & & & && & //设置T0计数器初值
& & & & TL0=0;
& & & & TR0=1;& & & & & & & & & & & && & // 启动定时器T0
& & & & TH1=0& & & & & & & && & //串口初始化设置
& & TR1=1; & & & & & & & & & & & && &
& & SM0=0;
& & SM1=1;
& & & & REN=0;
& & & & RCAP2H=()/256;& & & & //T2定时器的初始化设置
& & & & RCAP2L=()%256;
& & & & TH2=RCAP2H;
& & & & TL2=RCAP2L;
& & & & T2CON=0x04;& & & &
& & & & ET2=1;
& & & & & & & &
/*void uart0_rx_isr() interrupt 4& & & && & //串口中断
temp_buf=SBUF;
if (temp_buf_f&=17)
& &temp_buf_f=0;
} */& & & && &
void USART_Transmit( unsigned char date )& & & & // 发送数据
while(!TI);
void send_data(unsigned char *buffer, unsigned char len)
unsigned char i=0;
for(i=0;i&i++)&&//数据长度为包长度
&&USART_Transmit(*buffer++);
void shipin_init (void)& & & & & & & & & & & & & & & & & & & & & & & & & & & && &//视频初始化设置
&&send_data(dis0_temp_buf,sizeof(dis0_temp_buf));
&&delayms(10);
void main(void)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //主函数
shipin_init();
// WDT_CONTR=0x34;
& & & & if(flag==1)& & & &
& & & &&&{& &
& & & && &&&flag=0;
& & & & & & & & delayms(2);& & & && &&&
& & & & & & & & if(key1!=0)
& & & & & & & & {
& & & & & & & && &&&flag1=1;
& & & & & & & & & & & & delayms(20);
& & & & & & & & & & & & send_data(dis10_temp_buf,sizeof(dis10_temp_buf));
& & & & & & & & & & & & delayms(10);
& & & & & & & & & & & & send_data(dis11_temp_buf,sizeof(dis11_temp_buf));
& & & & & & & & & & & & delayms(10);
& & & & & & & & & & & &&&
& & & & & & & & }
& & & && & if(key1==0)
& & & & & & & & {& & & &
& & & & & & & & & & & & delayms(10);
& & & & & & & & & & & & if (key1==0)
& & & & & & & & & & & &&&{ flag1=0;
& & & & & & & & & & & && & flag2=1;
& & & & & & & & & & & && & flag3=0;
& & & & & & & & & & & && & num4=0;
& & & & & & & & & & & && & delayms(10);
& & & & & & & & & & & && & send_data(dis7_temp_buf,sizeof(dis7_temp_buf));
& & & & & & & & & & & && & delayms(10);
& & & & & & & & & & & && & send_data(dis15_temp_buf,sizeof(dis15_temp_buf));
& & & & & & & & & & & && & delayms(10);
& & & & & & & & & & & && & send_data(dis18_temp_buf,sizeof(dis18_temp_buf));
& & & & & & & & & & & && & delayms(10);
& & & & & & & & & & & && &
& & & & & & & & & & & &&&}
& & & & & & & & }
& & & & & & & & temp=flag2+flag1;
& & & & & & & & flag1=0;
& & & && &&&if (temp==2)
& & & & & & & & {& & & & temp=0;
& & & & & & & & & & & & flag3=1;
& & & & & & & & & & & & if(num4&=200)
& & & & & & & & & & & & {& & & &
& & & & & & & & & & & && &&&//delayms(1);
& & & & & & & & & & & & & & & & send_data(dis16_temp_buf,sizeof(dis16_temp_buf));
& & & & & & & & & & & & & & & & delayms(10);
& & & & & & & & & & & & & & & & send_data(dis17_temp_buf,sizeof(dis17_temp_buf));
& & & & & & & & & & & & & & & & delayms(10);
& & & & & & & & & & & & & & & & num4=0;
& & & & & & & & & & & & & & & & flag3=0;
& & & & & & & & & & & & & & & & flag2=0;
& & & & & & & & & & & & }
& & & & & & & & }& & & &
& & & & & & & & if(key2!=0)
& & & & & & & & {& & & &
& & & & & & & && && & & & delayms(10);
& & & & & & & && &&&//send_data(dis13_temp_buf,sizeof(dis13_temp_buf));
& & & & & & & & & & & & delayms(10);
& & & & & & & & & & & & send_data(dis14_temp_buf,sizeof(dis14_temp_buf));
& & & & & & & & & & & & delayms(10);
& & & & & & & & }
& & & && &&&if (key2==0)
& & & & & & & & {
& & & & & & & & & & & & delayms(2);
& & & & & & & && & if (key2==0)
& & & & & & & & & & & &&&{
& & & & & & & & & & & && & send_data(dis12_temp_buf,sizeof(dis12_temp_buf));
& & & & & & & & & & & &&&}
& & & & & & & & }
& & & & & & & & sprintf(dis5_temp_buf,&%.1f&,num3) ;& & & && & //速度值保留一位小数
& & & & & & & & delayms(10);
& & & & & & & & send_data(dis4_temp_buf,sizeof(dis4_temp_buf));
& & & && &&&send_data(dis5_temp_buf,sizeof(dis5_temp_buf));
& &&&& & & & send_data(dis6_temp_buf,sizeof(dis6_temp_buf));
& & & & & & & & delayms(10);
& & & & & & & & if(flag4==1)
& & & & & & & & {
& & & & & & & & & & & & flag4=0;
& & & & & & & & & & & & ISP_CONTR=0x20;
& & & & & & & & }
& & & & & & & & delayms(100);
& & & & & & & && &
& & & && &&&
& & & &&&}
}& & & && &
void T2_() interrupt 5& & & & & & & & & & & && &//定时器T2中断
& & & & TF2=0;
& & & & num1++;
& & & & num5++;
& & & & if(num1==10)& & & & & & & & & & & & & & & && &//定时1秒
& & & & {&&
& & & && & num1=0;
& & & && & flag=1;
& & & && & num=256*TH0+TL0;
& & & && & TH0=0;
& & & && & TL0=0;
& & & && & num2=(double)num/27.69;
& & & && & num3=num2;
& & & & }& & & && &
& & & & if(flag3==1)
& & & & & & & & num4++;
& & & & if(num5&=6000)
& & & && & num5=0;
& & & && & flag4=1;
程序就是采集一个脉冲变量,还有两个开关量,为什么那key1开关量,在程序运行一段时间后,给1或者给0都没有变化,但是key2开关量一直都是正常的,跪求高人指点啊 。如果可以,有酬谢。
我试过p3.6,p3.7不行之后,我就改成了p1.0,p1.1,我想是这个的问题的可能性不大,您帮我看看还有没有其他的问题啊,谢谢
之所你让你改端口是排除引脚的复用问题,1.0是52的tx,1.1是txen,你只之前用的两个口也有引脚的第二功能,程序既然能跑,说明功能上应该问题不大,至于失灵,大多都是别的功能影响了,该关的中断没关,该打开的功能没打开。另外这个问题你也应该去专业的单片机论坛上去问,学校和公司的差别还不小,民间单片机和电路高手都很多。
研究生必备与500万研究生在线互动!
扫描下载送金币

我要回帖

更多关于 单片机延时程序 的文章

 

随机推荐