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预设每按一次数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)