⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51

📁 51单片机应用系统典型模块开发大全
💻
字号:
#include <reg51.h>#define uchar unsigned char#define uint  unsigned intsbit DQ=P1^0;							//DS18B20数据I/O口sbit din=P3^0;							//MAX7221数据输入端sbit CS=P3^1;							//MAX7221片选输入端sbit clk=P3^2;							//MAX7221时钟输入端uchar code disp_dot[]={    0xfe,0xb0,0xed,0xf9,    0xb3,0xdb,0xdf,0xf0,    0xff,0xfb,};			//共阴极显示代码uchar code dispcode[]={    0x7e,0x30,0x6d,0x79,    0x33,0x5b,0x5f,0x70,    0x7f,0x7b,0x01,0x00};			//共阴极显示代码uchar code CrcTable[256]={    0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,    157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,    35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,    190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,    70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,    219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,    101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,    248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,    140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,    17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,    175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,    50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,    202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,    87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,    233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,    116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53};uchar code SN[8][7]={    0x00,0x00,0x00,0xB8,0xC5,0x30,0x28,    0x00,0x00,0x00,0xB8,0xC5,0x31,0x28,    0x00,0x00,0x00,0xB8,0xC5,0x32,0x28,    0x00,0x00,0x00,0xB8,0xC5,0x33,0x28,    0x00,0x00,0x00,0xB8,0xC5,0x34,0x28,    0x00,0x00,0x00,0xB8,0xC5,0x35,0x28,	0x00,0x00,0x00,0xB8,0xC5,0x36,0x28,	0x00,0x00,0x00,0xB8,0xC5,0x37,0x28,};/*各检测回路上DS18B20内部的64位ROM中的后7个字节,CRC字节可以通过调用CRC()函数计算获得*/uchar disp_buf[5]={0x00,0x00,0x00,0x00,0x00};   //显示数据缓冲区uchar Tem_H,Tem_L;								//用于存储温度转换值高8位和低8位bit Flag=0;										//正、负温度值符号标志位,0为正,1为负/************************函数声明***********************/void delay(int us);								//延时函数bit Init_DS18B20(void);							//DS18b20初始化函数uchar Read_bit(void);							//DS18b20读一个字节void Write_bit(uchar val_bit);					//DS18b20写一个字节uchar Read_byte(void);							//DS18B20读字节函数void Write_byte(uchar com);						//DS18B20写字节函数int ReadTemperature(uchar n);					//DS18b20读取温度void Match_ROM(uchar n);						//寻找ROM匹配DS18B20						uchar CRC(uchar n,uchar j);						//计算CRC校验字节函数void  display(void);							//显示函数void Init_MAX7221(void);						//MAX7221初始化函数void Write_7221(uchar com,uchar da);			//MAX7221写字节程序void adj_dat(uchar m);							//显示字节调整函数void l_delay(int n);							//延时函数/*********************主函数***********************/void main(){	uchar i;	Init_MAX7221();	while(1)	{	 		for(i=0;i<8;i++)		{			adj_dat(i);							//显示字节调整函数			display();							//显示函数			l_delay(500);						//延时		}	}	 }/*******************MAX7221初始化********************/void Init_MAX7221(void){    Write_7221(0x0c,0x01);						//正常工作状态,关断模式	Write_7221(0x09,0x00);						//译码选择,非BCD码	Write_7221(0x0a,0x0f);						//亮度调节	Write_7221(0x0b,0x07);						//显示位数}/*****************MAX7221写字节程序********************/void Write_7221(uchar com,uchar da){    uchar temp,i,j;    CS=0;    clk=0;    for (i=0;i<8;i++)							//发送命令    {        temp=com;        if ((temp&(0x80>>i))!=0)            din=1;        else din=0;        clk=1;        for (j=0;j<5;j++);        clk=0;    }    for (i=0;i<8;i++)							//发送数据    {        temp=da;        if ((temp&(0x80>>i))!=0)            din=1;        else din=0;        clk=1;        for (j=0;j<5;j++);        clk=0;    }    CS=1;}/**********************延时函数**************************/void delay(int us){	int i;	for(i=0;i<us;i++);							//11.0592MHz下,延时时间为(24+16*us)}/**********************延时函数**************************/void l_delay(int n){	int i,j;	for(i=0;i<n;i++)		for(j=0;j<1000;j++);}/*******************DS18B20复位函数***********************/bit Init_DS18B20(void){	bit res;	DQ=0;										//拉低DQ线	delay(29);									//延时480us	DQ=1;										//DQ线置高	delay(10);									//延时	res=DQ;										//读取复位响应信号	delay(10);	return(res);								//返回响应值}/*******************DS18B20读位函数***********************/uchar Read_bit(void){	uchar i;	DQ=0;										//拉低DQ线	DQ=1;										//DQ线置高	for(i=0;i<3;i++);							//延时15us	return(DQ);									//返回当前读取值}/*******************DS18B20写位函数***********************/void Write_bit(uchar val_bit){	DQ=0;										//拉低DQ	if(val_bit==1)DQ=1;							//从DQ线发送1	delay(5);									//延时	DQ=1;}/********************DS18B20读字节函数*********************/uchar Read_byte(void){	uchar i;	uchar temp=0;	for(i=0;i<8;i++)	{		if(Read_bit())temp|=0x01<<i;			//向temp写入读取位		delay(6);	}	return(temp);								//返回读取字节}/*********************DS18B20写字节函数*******************/void Write_byte(uchar com){	uchar i,temp;	for(i=0;i<8;i++)	{		temp=com>>i;							//右移i次取低位发送		temp&=0x01;		Write_bit(temp);	}	delay(5);}/*****************DS18B20A校验位计算函数**************/uchar CRC(uchar n,uchar j){    uchar i,crc_data=0;    for (i=0;i<j;i++)							//查表校验        crc_data=CrcTable[crc_data^SN[n][7-1-i]];    return(crc_data);}/*****************DS18B20 ROM匹配程序*****************/void Match_ROM(uchar n){	uchar i,temp;	temp=CRC(n,7);	Write_byte(0x55); 							//调用ROM匹配指令	for(i=0;i<7;i++)	{		Write_byte(SN[n][7-1-i]);				//结算校验值	}	Write_byte(temp);}/*****************温度值正负判断程序******************/uint Get_Tem(uchar dath,uchar datl){	uint temp=0,temp_h=0,temp_l;		temp_h=(uint)dath;	temp=temp_h&0x00ff;	temp_l=(uint)datl;	temp_l&=0x00ff;	temp=(temp<<8)|temp_l;						//去掉符号值后合并成16位数据	if((dath&0x80)==0x80)	{		Flag=1;		temp=~temp+1;							//负数时求补	}	else	{		Flag=0;	}	return(temp);}/***************************温度读取函数****************************/int ReadTemperature(uchar n){	uint temp=0;	float temp1=0;	while(!(Init_DS18B20()));	Write_byte(0xCC); 							//跳过读序号列号的操作	Write_byte(0x44); 							//启动温度转换	while(!(Init_DS18B20()));	Match_ROM(n);	Write_byte(0xBE); 							//读取温度寄存器等(共可读9个寄存器) 前两个就是温度	Tem_L=Read_byte();							//低位	Tem_H=Read_byte();							//高位	temp=Get_Tem(Tem_H,Tem_L);	temp1=temp*0.0625;	temp=temp1*10+0.5; 	return(temp);}/***************************显示数据处理函数**************************/void adj_dat(uchar m){	uint temp;	temp=ReadTemperature(m);					//读温度	if(Flag)		disp_buf[0]=10;	else		disp_buf[0]=11;	disp_buf[1]=temp%1000/100;					//显示百位	if(disp_buf[1]==0)	{		disp_buf[1]=disp_buf[0];		disp_buf[0]=11;	}		disp_buf[2]=temp%100/10;					//显示十位	disp_buf[3]=temp%10;						//显示个位	disp_buf[4]=m+1;}/*************************显示函数******************************/void  display(void){	Write_7221(0x02,dispcode[disp_buf[4]]);		//显示	Write_7221(0x08,dispcode[disp_buf[3]]);		//显示个位	Write_7221(0x07,disp_dot[disp_buf[2]]);		//显示个位	Write_7221(0x06,dispcode[disp_buf[1]]);		//显示个位	Write_7221(0x05,dispcode[disp_buf[0]]);		//显示个位}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -