单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #include <math.H>
- #define uchar unsigned char
- #define uint unsigned int
- uchar i,L,M;
- uchar datas[] = {0, 0, 0, 0, 0};
- sbit ds=P2^2;
- sbit RW = P3^6;
- sbit RS = P3^5;
- sbit EN = P3^4;
- void delay(uchar us)
- {
- while(us--);
- }
- void delayMs(uint a)
- {
- uint i, j;
- for(i = a; i > 0; i--)
- for(j = 100; j > 0; j--);
- }
- /***LCD1602显示***/
- void Read_busy()
- {
- uchar busy;
- P0=0xff;
- RS = 0;
- RW=1;
- do
- {
- EN = 1;
- busy=P0;
- EN=0;
- }
- while(P0&0x80);//0x80:10000000,判断状态字的最后一位是0还是1.如果是0,则为不忙。不忙的话,则可以跳出do....while循环
- }
- //读状态,将液晶的状态发回给单片机
- void writeCmd(uchar cmd)//写1602命令一个字节
- {
- Read_busy();//判断忙
- RS = 0;
- RW=0;
- P0 = cmd;//发送状态字
- EN = 1;//数据送过去以后,1602把它读走。
- EN=0;
- }
- //1602显示字符串函数
- void Write_data(uchar date)
- {
- Read_busy();//判断忙不忙
- RS = 1;
- RW=0;
- P0 = date;//把数据送到数据线上
- EN = 1;
- EN=0;
- }
- void init()
- {
- RW= 0;
- writeCmd(0x38);
- writeCmd(0x0c);
- writeCmd(0x06);
- writeCmd(0x01);
- }
- /****18B20函数****/
- void Init()//DS18B20初始化
- {
- //uchar t;
- ds=1;
- _nop_();//小小的延时
- ds=0;
- delay(75);//拉低总线499.45us;
- ds=1;
- //t=ds;//把ds的值赋给i,等待ds响应,如果i为1,则传回主函数中去,及检测到了DS18B20的响应
- delay(20);
- ds=1;//释放总线
- _nop_();
- //return(t);
- }
- uchar read_byte()//读数据
- {
- uchar i,j,dat;
- for(i=0;i<8;i++)
- {
- ds=0;
- _nop_();
- ds=1;//释放总线
- _nop_();
- j=ds;//获取数据
- delay(10);
- ds=1;
- _nop_();
- dat=(j<<7|dat>>1);//j左移7位,dat右移。一个字节便被存进去了
- return(dat);
- }
- }
- void write_byte(uchar dat)//写数据
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- ds=0;
- _nop_();
- ds=dat&0x01;//当dat最低位为1时。与上以后还是1.所以就满足时序图的要求了。
- delay(10);
- ds=1;//释放总线,准备下一次数据输入
- _nop_();//释放总线要保持1us
- dat>>=1;
- }
- }
- void tempcod(uint t) //温度转化。。。显示温度值函数,t传递的是整形的温度值(t是传过来的温度)
- {
- uchar temp;
- datas[0] = (temp / 10)+'0';//十位转ASCLL码
- datas[1] = (temp % 10)+'0';//个位转ASCLL码
- /* datas[2] = '\'';
- datas[3] = 'c';
- datas[4] = '0';//字符串结束符
- Write_data(12,1,datas[]);//表示显示在横坐标为12,纵坐标在第二行的地方。*/
- }
- void display()
- {
- writeCmd(0x46|0x80);
- Write_data(datas[0]);//显示十位
- Write_data(datas[1]);//显示个位
- Write_data('.');
- Write_data(0xdf);
- Write_data('c');
- }
- main()
- {
- writeCmd(0x38);//显示设置16*2显示
- writeCmd(0x0c);//开显示
- writeCmd(0x06);//地址指针加一
- writeCmd(0x80);//显示的位置(地址)
- writeCmd(0x01);//清屏
- // Write_data(i);
- //while(1);//让程序一直停在这里
- while(1)
- {
- Init();
- write_byte(0xcc);//跳过ROM指令
- write_byte(0x44);//发送温度转化指令
- Init();
- write_byte();//读取暂存器的值
- L=read_byte();//低八位
- M=read_byte();//高八位
- i=M;i<<=8;
- i|=L;
- i=i*0.0625*10+0.5;
- display(i);
- }
- }
复制代码
|