怎么判断at89c2051是上电复位还是带电复位(用C语言编程)

怎么判断at89c2051是上电复位还是带电复位(用C语言编程),第1张

51没有这个功能吧,不过你可以用其他方法试一试,比如

unsigned char i;

void main()

{

if(i==0)

//上电复位

else

//带电复位

i=1;

while(1);

}

但是我不确定能用,不知道51带电复位会不会清ram

第一个程序是初始化DS18B20用的,是根据时序先置0后置1的过程,这个过程中延时时间的精度很重要,需要根据实际使用的硬件情况时行计算,置0需要保持480-960us;

第二个程序很少看到用,一般是计算时长,在过了相应的时间后直接去读取数据,楼主程序使用循环255次的时间需要根据编译后的汇编代码来计算,请楼主行算一下;感觉楼主的这个程序采用不停检测和循环的做法有些夸张。

楼主要深入了解这个程序,最好还是直接看MAXIM-ICCOM网站上DS18B20的相关资料,重点是时序图和相关的命令流程图,看懂了是很有帮助的。

你好,因为是手机,所以无法贴出程序,但是你的要求很容易实现,我先给你点提示,自己先做一下,不行再回复我。

首先呢,定义两个全局变量,以作十与个并赋值为0,然后编写一个独立键盘函数,分别用于判断SB1~4,若 SB1==0,TR0=1,若SB2==0,TR0=0,若SB3==0,SHI ,若SB4==0,FEN 。主要功能就这样,当然这个并不完美,需要你自己去添加一些功能,然后再编写中断函数。

希望我的回答能帮助到你。

#include<reg52h>

#include<intrinsh>

#define uint unsigned int

#define uchar unsigned char

sbit KEY = P3^0;

uchar aa,num,flag;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(uint ms)

{

uchar t;

while(ms--)  for(t = 0; t < 123; t++);

}

void main()

{

num = 0;

aa = 0;

TMOD = 0x01;

TH0 = (65536 - 50000) / 256;

TL0 = (65536 - 50000) % 256;

TR0 = 1;

ET0 = 1;

EA = 1;

P0 = table[0];

P2 = table[0];

while(1)  {

if(!KEY) {

delay(10);

if(!KEY) {

while (!KEY);

flag++;

if(flag == 1)  TR0 = 0;

if(flag == 2)  {

P0 = table[0];

P2 = table[0];

flag = 0;

    aa = 0;

num = 0;

TR0 = 1;

} } } }

}

void timer0() interrupt 1

{

TH0 = (65536 - 50000) / 256;

TL0 = (65536 - 50000) % 256;

aa++;

if(aa == 20)  {

aa = 0;

num++;

if(num == 60)  num = 0;

P0 = table[num / 10];

P2 = table[num % 10];

}

}

仿真实验截图如下:

void dis_cnter(void) 显示计数器值子程序开始

{uchar i; 定义字符型局部变量i

P3_7=1;P3_6=1; 消隐有效,允许显示

for(i=0;i8;i++) 循环8次

{SBUF=SEG7[cnt];while(!TI);TI=0;} 根据8个单元的计数值查表发送显示

P3_7=0; 关闭消隐,正常显示

} 显示计数器值子程序结束

void cnter(void) 计数转换子程序开始

{uchar i; 定义字符型局部变量i

for(i=0;i7;i++) 循环8次

{if(cnt9){cnt=0;cnt[i+1]++;}}若计数器某位值大于9,则该位回0,

而高位被进位加1

------------------------------------

if(cnt[7]9){for(i=0;i8;i++)cnt=0;} 若计数器最高位值大于9,则计数器全清0

} 计数转换子程序结束

void pt_cnt(void) 输出控制子程序开始

{

if((cnt[0]==pre_cnt[0])&&(cnt[1]==pre_cnt[1])&&

(cnt[2]==pre_cnt[2])&&(cnt[3]==pre_cnt[3])&&

(cnt[4]==pre_cnt[4])&&(cnt[5]==pre_cnt[5])&&

(cnt[6]==pre_cnt[6])&&(cnt[7]==pre_cnt[7])) 若计数值等于预置值

out_flag=1; 输出标志置1

else out_flag=0; 否则输出标志置0

=================================================

if(out_flag)drv=0; 若输出标志为1,输出端(P34)置0,驱动光耦U2

else drv=1; 否则输出端(P34)置1

} 输出控制子程序结束

void main(void) 主程序开始

{ IE=0x84; 开放CPU中断,开放外中断1的中断

IT1=1; 置外中断1为边沿触发

while(1) 无限循环

{P3_6=0;P3_7=1; 禁止发送给显示器,消隐有效

SBUF=0x00;while(!TI);TI=0; 向IC2发送0x00,使IC2输出为全0

if((P3&0x24)!=0x24)keydown_flag=1; 检测P32、P35是否为高电平。

若不为高电平,说明有键按下,键被按下标志置1

else keydown_flag=0; 否则,键被按下标志置0

-------------------------------------------------------------------------------

SBUF=0xfe;while(!TI);TI=0; 向IC2发送0xfe

if(!P3_2)set_flag=!set_flag; 若P32为0,说明S9键按下,标志set_flag取反

==================================================

if(!set_flag){cnter();dis_cnter();pt_cnt();delay(100);}

若标志set_flag为0,调用计数、显示计数、输出控制的子程序

else {scan_key();dis_pre_cnter();delay(10);}

否则标志set_flag为1,调用扫描S1~S8键、显示预置值的子程序

=====================================================

if(keydown_flag)delay(300); 因有键按下,调用延时300mS子程序,

以免调整键值的速度过快

}

} 主程序结束

void extern_int1(void) interrupt 2 using 1 外中断1服务子程序

{

cnt[0]++; 计数器的最低位加1

}

以上就是关于怎么判断at89c2051是上电复位还是带电复位(用C语言编程)全部的内容,包括:怎么判断at89c2051是上电复位还是带电复位(用C语言编程)、DS18B20初始化C语言程序,求解释,越详细越好、AT89C51单片机用C语言编写一个99秒倒计时的程序,要求复位或上电2位数码管显示00,可用SB3预设每按一次数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10623493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存