// 51单片机C语言编程,这个时钟+秒表可以参考一下。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit qingling=P1^0; //清零
sbit tiaofen=P1^1; //调分
sbit tiaoshi=P1^2; //调时
sbit sounder=P1^7; //naozhong
uint a,b;
uchar hour,minu,sec, //时钟
hour0,minu0,sec0,//秒表
hour1,minu1,sec1;
h1,h2,m1,m2,s1,s2,//显示位
k,s;//状态转换标志
uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*****************函数声明***********************/
void keyscan();
void init();
void delay(uchar z);
void display(uchar,uchar,uchar);
void sounde();
/*****************主函数*************************/
void main()
{
init();
while(1)
{
while(TR1)
{
keyscan(); //扫描函数
while(s==1) //s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间(也是通过调时,调分函数);
{ //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响(一分钟后自动关闭,可手动关闭)。再次切换,s=0.
keyscan(); //s状态切换(0-》1-》2-》0)通过外部中断1实现。
display(hour1,minu1,sec1); //闹钟时刻显示
}
display(hour0,minu0,sec0);//时钟表显示
while(k) /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。0秒表关;1秒表从零计时;2秒表停,显示计时时间*/
{
display(hour,minu,sec); //秒表显示
}
}
}
}
/*****************初始化函数***********************/
void init()
{
a=0;
b=0;
k=0;
s=0;
hour0=0;
minu0=0;
sec0=0;
hour=0;
minu=0;
sec=0;
hour1=0;
minu1=0;
sec1=0;
TMOD=0x11; //定时器0,1工作于方式1;赋初值
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
EX0=1; //秒表中断
EX1=1; //闹钟设定中断
ET0=1;
ET1=1;
IT0=1; //边沿触发方式
IT1=1;
PX0=1;
PX1=1;
TR0=0; //初始,秒表不工作
TR1=1; //时钟一开始工作
}
/*****************定时器0中断*************/
void timer0_int() interrupt 1 //秒表
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
a++;
if(a==2)
{
a=0;
sec++;
if(sec==100)
{
sec=0; //毫秒级
minu++;
if(minu==60)
{
minu=0; //秒
hour++;
if(hour==60) //分
{
hour=0;
}
}
}
}
}
/*************外部中断0中断函数************/
void ex0_int() interrupt 0
{
k++;
if(k==3)
k=0;
if(k==1)
{
TR0=~TR0;
if(TR0==1)
{
hour=0;
minu=0;
sec=0;
}
}
if(k==2)
{
TR0=~TR0;
}
}
/*************外部中断1中断函数************/
void ex1_int() interrupt 2
{
s++;
if(s==3)
s=0;
}
/*************定时器1中断****************/
void timer1_int() interrupt 3 //控制时钟工作
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(s==2)
{
if(hour1==hour0 && minu0==minu1)
sounde();
}
b++;
if(b==20)
{
b=0;
sec0++;
if(sec0==60)
{
sec0=0;
minu0++;
if(minu0==60)
{
minu0=0;
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}
/*************键盘扫描****************/
void keyscan()
{
if(s==1)
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec1=0;
minu1=0;
hour1=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu1++;
if(minu1==60)
{
minu1=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour1++;
if(hour1==24)
{
hour1=0;
}
while(!tiaoshi);
}
}
else //调整时钟时间
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec0=0;
minu0=0;
hour0=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu0++;
if(minu0==60)
{
minu0=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour0++;
if(hour0==24)
{
hour0=0;
}
while(!tiaoshi);
}
}
}
/*************显示函数****************/
void display(uchar hour,uchar minu,uchar sec)
{
h1=hour/10;
h2=hour%10;
m1=minu/10;
m2=minu%10;
s1=sec/10;
s2=sec%10;
P0=0xff;
P2=table[h1];
P0=select[7];
delay(5);
P0=0xff;
P2=table[h2];
P0=select[6];
delay(5);
P0=0xff;
P2=0x40;;
P0=select[5];
delay(5);
P0=0xff;
P2=table[m1];
P0=select[4];
delay(5);
P0=0xff;
P2=table[m2];
P0=select[3];
delay(5);
P0=0xff;
P2=0x40;
P0=select[2];
delay(5);
P0=0xff;
P2=table[s1];
P0=select[1];
delay(5);
P0=0xff;
P2=table[s2];
P0=select[0];
delay(5);
}
/*************闹钟函数****************/
void sounde()
{
sounder=~sounder;
}
/*************延时函数****************/
void delay(uchar z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
⑵ 新概念51单片机C语言教程的介绍
《新概念51单片机C语言教程》是2009年电子工业出版社出版的图书,作者是郭天祥。《新概念51单片机C语言教程:入门、提高、开发、拓展》从实际应用入手,以实验过程和实验现象为主导,循序渐进地讲述51单片机C语言编程方法以及51单片机的硬件结构和功能应用。《新概念51单片机C语言教程:入门、提高、开发、拓展》从实际应用入手,以实验过程和实验现象为主导,循序渐进地讲述51单片机C语言编程方法以及51单片机的硬件结构和功能应用。全书共分5篇,分别为入门篇、内外部资源操作篇、提高篇、实战篇和拓展篇。《新概念51单片机C语言教程:入门、提高、开发、拓展》内容丰富,实用性强,书中大部分内容均来自科研工作及教学实践,许多C语言代码可以直接应用到工程项目中。《新概念51单片机C语言教程》配套光盘提供13讲近30学时的教学视频和《新概念51单片机C语言教程》实例代码,可使读者更快更好地掌握单片机知识和应用技能。《新概念51单片机C语言教程》作者还可提供与《新概念51单片机C语言教程:入门、提高、开发、拓展》配套的单片机实验板。《新概念51单片机C语言教程:入门、提高、开发、拓展》可作为大学本、专科单片机课程教材,适合于51单片机的初学者和使用51单片机从事项目开发的技术人员,也可供从事自动控制、智能仪器仪表、电力电子、机电一体化等专业的技术人员参考。
⑶ 51单片机 串口设计c语言程序简单设计
第一题,已经测试成功:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag, a;
sbit d = P0^0;
void init()
{
TMOD = 0x20; //设置定时器1为工作方式2
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1; //开定时器1
REN = 1; //开串口通信.
SM0 = 0; //设置串口通信方式1
SM1 = 1;
EA = 1; //开总中断.
ES = 1; //开串口中断.
}
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}
void main()
{
init();
a = '4';
while(1) {
if(a == '1') {
d = 0; delay(400);
d = 1; delay(400);
}
else if(a == '2') {
d = 0; delay(200);
d = 1; delay(200);
}
else if(a == '3') {
d = 0; delay(100);
d = 1; delay(100);
}
else if(a == '4') {
d = 1;
}
}
}
void ser() interrupt 4
{
if (TI == 1) {
TI = 0;
}
else if (RI == 1) {
RI = 0;
a = SBUF; //中间变量.
flag = 1;
}
}
⑷ 如何用c语言编程在单片机上做交通信号灯
硬件电路设计
此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。
(1)电路连接图:
三、软件程序(C语言)
以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。
//*****************************//
//程序名:十字路口交通灯控制
//编写人:黄庭剑
//初写时间:2009年1月2日
//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换.
//CPU说明:AT89C51型单片机;24MHZ晶体振荡器
//完成时间:2009年1月6日
//*****************************//
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
sfrp0=0x80;
sfrp1=0x90;
sfrp2=0xA0;
sfrp3=0xb0;//这部分内容其实在“#include<reg51.h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。其实两者是一样的。
sbitsw=p0^0;
sbitOE=P0^6;
sbitLE=P0^7;//74LS373锁存器控制端定义
chardisplay[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};//p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;
//函数声明begin
voiddelay1(intcount);
voiddelay_long(intnumber1,intnumber2);
voidpeople_car_drive();
//函数声明end
//***********************//延时子程序
voiddelay1(intcount)
{inti;
for(i=count;i>0;i--)
{;}
}
voiddelay_long(intnumber1,intnumber2)
{
inta,b;
for(a=number1;a>0;a--)
{
for(b=number2;b>0;b--)
{_nop_();}
}
}
//**********************//延时子程序
voidpeople_car_drive()
{
intp_1=2,i,j=9,p_2=6;//****************//行人通行时,延时20秒
p2=0x09;//南北红灯亮
p3=0x24;//东西绿灯亮
while(p_1-->0)
{LE=1;
OE=0;
if(p_1==0){OE=1;}//当十位数减到0时,只显示个位数
p1=display[p_1];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_1==0&&j==3)break;//减到3时退出循环,让其黄灯闪烁显示
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
//*******************************************************************************//
p2=0x12;//南北黄灯闪烁三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
//*****************以下是车辆通行时延时60秒//
p2=0x24;//南北绿灯亮
p3=0x09;//东西红灯亮
while(p_2-->0)
{LE=1;
OE=0;
if(p_2==0){OE=1;}//当十位数减到0时,只显示个位数
p1=display[p_2];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_2==0&&j==3)break;//减到2时退出循环
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
p2=0x12;//南北黄灯闪烁三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);//南北黄灯闪烁三秒完毕
}
voidmain()//主函数入口处
{
p0=0x01;
p1=0x00;
p2=0x00;
p3=0x00;//初始化各端口
{while(1)
{
if(sw==0)
{people_car_drive();}
else
{
p2=0x00;
p3=0x00;//关闭所有交通灯
}
}
}
}
⑸ 很简的51单片机C语言流水灯程序
1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。
例程:
#include<reg51.h> //51单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit beep=P2^3;
void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{ //delay(500);大约延时500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{
uchar a,i,j;
while(1) //大循环
{
a=0xfe; //赋初值
for(j=0;j<3;j++) for(i=0;i<8;i++) //左移三次
{
P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_crol_(a,1); //将a变量循环左移一位
}
a=0x7f;
for(j=0;j<3;j++) for(i=0;i<8;i++) //右移三次
{
P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_cror_(a,1); //将a变量循环右移一位
}
}
}
2、51单片机是对所有兼容Intel
8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash
rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。
⑹ 单片机c语言编程
单片机的外部结构:
DIP40双列直插;
P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)
电源VCC(PIN40)和地线GND(PIN20);
高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)
内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)
程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)
P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1
单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)
四个8位通用I/O端口,对应引脚P0、P1、P2和P3;
两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)
一个串行通信接口;(SCON,SBUF)
一个中断控制器;(IE,IP)
针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。
C语言编程基础:
十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。
如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。
++var表示对变量var先增一;var—表示对变量后减一。
x |= 0x0f;表示为 x = x | 0x0f;
TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。
While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;}
在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)
#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P1.3
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCC
While( 1 ); //死循环,相当 LOOP: goto LOOP;
}
注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。
在某引脚输出低电平的编程方法:(比如P2.7引脚)
#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2.7
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口。
{
P2_7 = 0; //给P2_7赋值0,引脚P2.7就能输出低电平GND
While( 1 ); //死循环,相当 LOOP: goto LOOP;
}
在某引脚输出方波编程方法:(比如P3.1引脚)
#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P3.1
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
While( 1 ) //非零表示真,如果为真则执行下面循环体的语句
{
P3_1 = 1; //给P3_1赋值1,引脚P3.1就能输出高电平VCC
P3_1 = 0; //给P3_1赋值0,引脚P3.1就能输出低电平GND
} //由于一直为真,所以不断输出高、低、高、低……,从而形成方波
}
将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) )
#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P1_1 = 1; //初始化。P1.1作为输入,必须输出高电平
While( 1 ) //非零表示真,如果为真则执行下面循环体的语句
{
if( P1_1 == 1 ) //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC
{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND
else //否则P1.1输入为低电平GND
//{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND
{ P0_4 = 1; } //给P0_4赋值1,引脚P0.4就能输出高电平VCC
} //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平
}
将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) )
#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P3 = 0xff; //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平
While( 1 ) //非零表示真,如果为真则执行下面循环体的语句
{ //取反的方法是异或1,而不取反的方法则是异或0
P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出
} //由于一直为真,所以不断将P3取反输出到P2
}
注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。
⑺ 单片机编程步骤
一、什么是 nec 单片机
随着大范畴集成电路的显现和发展,将计算机的cpu、ram、rom、定时/数器和多种i/o接口集成在一片芯片上,组成芯片级的计较机,因此单片机早期的含义称为单片微型计较机,直译为单片机。单片机是一种集成在电路芯片,是采用超大范畴集成电路技能把具有数据处理本事的中心处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和间断系统、 定时器 / 计时器 等成果(大要还包括表现驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完竣的计算机系
二、nec单片机的操纵教程详解
1、在智能仪器仪表中的操纵:在各类仪器仪表中引入单片机,使仪器仪表智能化,进步测试的自动化程度和精度,简化仪器仪表的硬件结构,进步其性能价格比。
2、在机电一体化中的操纵:机电一体化产品是指集呆板、微电子技能、计较机技能于一本,具有智能化特征的电子产品。
3、在实时过程控制中的操纵:用单片机实时进行数据处理和控制,使系统保持最佳事变状态,进步系统的事变从命和产品的品格。
4、在人类生活中的操纵:目前国外各种家用电器已普通采用单片机代替传统的控制电路。
5、在此外方面的操纵:单片机除以上各方面的操纵,它还遍布操纵于办公自动化范围、商业营销范围、汽车及通信、计较机外部装备、暗昧控制等各范围中。
以上就是为大家整理的关于单片机含义及其具体操纵教程的全部内容了。此外小编还额外为大家整理了单片机的优点:低电压、低功耗、集成度高、可靠性高、体积小、控制成果强等。希望通过这篇文章能够给想要了解单片机相关知识的朋友带来一些帮助。另外大家如果想了解更多单片机的知识可以通过图书查阅、网络查阅等方式。
⑻ 谁有《零基础学单片机C语言程序设计 第2版-赵建领 & 薛园园》电子书百度网盘资源下载
《零基础学单片机C语言程序设计 第2版-赵建领 & 薛园园》网络网盘txt最新全集下载
链接:
style 内容包括51系列单片机开发环境和流程、程序设计基础以及编程指南,并给出了一些常用的典型案例。
⑼ 单片机数字温度计设计用C语言写程序
#include<reg51.h>
#defineucharunsignedchar
sbitBEEP=P3^7; //接控制继电器
sbitDQ=P3^6; //接温度传感器18B20
uchart[2],number=0,*pt; //温度值
ucharTempBuffer1[4]={0,0,0,0};
ucharTmax=50,Tmin=10;
uchardistab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};
ucharcurrtemp;
voidt0isr()interrupt1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P2=1<<number;
if(number==2)P0=distab[TempBuffer1[0]]&0x7f;
elseP0=distab[TempBuffer1[0]];
number++;
if(number>3)number=0;
}
voiddelay_18B20(unsignedinti)
{
while(i--);
}
/**********ds18b20初始化函数**********************/
voidInit_DS18B20(void)
{
bitx=0;
do{
DQ=1;
delay_18B20(8);
DQ=0;//单片机将DQ拉低
delay_18B20(90);//精确延时大于480us
DQ=1;//拉高总线
delay_18B20(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败,继续初始化
}while(x);
delay_18B20(20);
}
/***********ds18b20读一个字节**************/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
/**************读取ds18b20当前温度************/
unsignedchar*ReadTemperature(unsignedcharrs)
{
unsignedchartt[2];
delay_18B20(80);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
delay_18B20(80);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度
tt[0]=ReadOneChar();//读取温度值低位
tt[1]=ReadOneChar();//读取温度值高位
return(tt);
}
voidcovert1(void) //将温度转换为LED显示的数据
{
ucharx=0x00,y=0x00;
t[0]=*pt;
pt++;
t[1]=*pt;
if(t[1]&0x080)//判断正负温度
{
TempBuffer1[0]=0x0c; //c代表负
t[1]=~t[1]; /*下面几句把负数的补码*/
t[0]=~t[0]; /*换算成绝对值*********/
x=t[0]+1;
t[0]=x;
if(x==0x00)t[1]++;
}
elseTempBuffer1[0]=0x0a; //A代表正
t[1]<<=4; //将高字节左移4位
t[1]=t[1]&0xf0;
x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它
x>>=4; //右移4位
x=x&0x0f; //和前面两句就是取出t[0]的高四位
y=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节
TempBuffer1[1]=(y%100)/10;
TempBuffer1[2]=(y%100)%10;
t[0]=t[0]&0x0f; //小数部分
TempBuffer1[3]=t[0]*10/16;
if(currtemp<Tmin||currtemp>Tmax)BEEP=1;
elseBEEP=0;
}
voidconvert(chartmp)
{
uchara;
if(tmp<0)
{
TempBuffer1[0]=0x0c;
a=~tmp+1;
}
else
{
TempBuffer1[0]=0x0a;
a=tmp;
}
TempBuffer1[1]=(a%100)/10;
TempBuffer1[2]=(a%100)%10;
}
main()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
out=1;
flag=0;
ReadTemperature(0x3f);
delay_18B20(50000); //延时等待18B20数据稳定
while(1)
{
pt=ReadTemperature(0x7f);//读取温度,温度值存放在一个两个字节的数组中
if(dismod==0)covert1();
delay_18B20(30000);
}
}