protues单片机各子程序模块.docx
《protues单片机各子程序模块.docx》由会员分享,可在线阅读,更多相关《protues单片机各子程序模块.docx(20页珍藏版)》请在冰豆网上搜索。
![protues单片机各子程序模块.docx](https://file1.bdocx.com/fileroot1/2022-11/30/ad401163-e278-43fa-81dd-d62e548a1900/ad401163-e278-43fa-81dd-d62e548a19001.gif)
protues单片机各子程序模块
//需要找元器件的符号
/*********************************************************************
LCD1602相关程序
**********************************************************************/
#defineucharunsignedchar
#defineuintunsignedint
//LCD1602端口定义
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
voiddelay(ucharx)//延时
{
uchary;
while(x--)
for(y=0;y<110;y++);
}
voidLCD_write_com(ucharcom)//写指令
{
RS=0;E=0;RW=0;
P0=com;delay(5);
E=1;delay(5);
E=0;
}
voidLCD_write_data(uchardate)//写数据
{
RS=1;E=0;RW=0;
P0=date;delay(5);
E=1;delay(5);
E=0;
}
voidLCD_init()//数据初始化
{
E=0;
LCD_write_com(0x38);delay(5);
LCD_write_com(0x0c);delay(5);
LCD_write_com(0x06);delay(5);
LCD_write_com(0x01);delay(5);
}
/******************************************************************************
DS18B20子程序
******************************************************************************/
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P2^7;//定义
uchartemp0,temp1,i;//温度转换的低位和高位
voiddelay1(ucharn)//n为1时大概6.9us
{
while(n--);
}
ucharInit_DS18B20()//初始化
{
ucharm;
DQ=0;delay1(100);
DQ=1;delay1(4);
m=DQ;delay1(40);
returnm;
}
ucharread_byte()//读字节
{
uchari,n;
for(i=0;i<8;i++)
{
DQ=0;n>>=1;
DQ=1;
if(DQ)n|=0x80;delay1(10);
}
returnn;
}
voidwrite_byte(uchark)//写字节
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=k&0x01;delay1(10);
DQ=1;k>>=1;
}
}
voidread_temp()//读取温度
{
Init_DS18B20();
write_byte(0xcc);
write_byte(0xbe);
temp0=read_byte();
temp1=read_byte();
Init_DS18B20();
write_byte(0xcc);
write_byte(0x44);
delay1(10);
}
/*****************************************************************************/
温度显示
******************************************************************************
voiddisplay()
{
ucharaa,cc,k,i=0;
k=temp_value[1]&0xf8;//与以后是否为负数
if(k==0xf8)//假如为负数
{
temp_value[1]=~temp_value[1];//高位取反
temp_value[0]=~temp_value[0]+1;//低位取反加1
DSY_CODE2[7]='-';//显示负号
if(temp_value[0]==0){temp_value[1]=~temp_value[1]+1;}//低位为0时高位取反加1
}
else
DSY_CODE2[7]='';
cc=(temp_value[0]>>4)|((temp_value[1])<<4);//cc为整数
aa=(temp_value[0]&0x0f)*10/16;//aa为小数*10
disbuffer[0]=cc/10;
disbuffer[1]=cc%10;
disbuffer[2]=aa;
DSY_CODE2[8]=disbuffer[0]+'0';
DSY_CODE2[9]=disbuffer[1]+'0';
DSY_CODE2[10]='.';
DSY_CODE2[11]=disbuffer[2]+'0';
DSY_CODE2[13]='C';
write_com(0x80);
for(i=0;i<16;i++)
write_data(DSY_CODE1[i]);
write_com(0x80+0x40);
for(i=0;i<16;i++)
write_data(DSY_CODE2[i]);
}
/***********************************************************************
多点测温程序
***********************************************************************/
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharSN[8][8]={
{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},
{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},
{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},
{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7},
{0x28,0x34,0xc5,0xb8,0x00,0x00,0x00,0x52},
{0x28,0x35,0xc5,0xb8,0x00,0x00,0x00,0x65},
{0x28,0x36,0xc5,0xb8,0x00,0x00,0x00,0x3c},
{0x28,0x37,0xc5,0xb8,0x00,0x00,0x00,0x0b}
};
ucharcodeDSY_CODE1[]={"CurrentTemp:
"};
ucharDSY_CODE2[]={"TEMP:
"};
sbitDQ=P1^0;
uchartemp_value[]={0x00,0x00};
uchardisbuffer[]={0,0,0};
ucharnum;
voiddelay1(ucharn)//n=1时大概延时6.9us
{
while(n--);
}
ucharow_DS18B20()//DS18B20复位
{
ucharm;
DQ=0;
delay1(100);
DQ=1;
delay1(4);
m=DQ;
delay1(40);
returnm;
}
ucharread_byte()//读取字节
{
uchari;
ucharn=0;
for(i=0;i<8;i++)
{
DQ=0;
n>>=1;
DQ=1;
if(DQ)
n|=0x80;
delay1(10);
}
return(n);
}
voidwrite_byte(uchark)//写字节
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=k&0x01;
delay1(10);
DQ=1;
k>>=1;
}
}
voidread_temp()//读温度
{
uchari,j;
ucharaa,cc,k;
write_byte(0xcc);
write_byte(0x44);
for(j=0;j<8;j++)
{
ow_DS18B20();
delay
(1);
write_byte(0x55);
for(i=0;i<8;i++)
{
write_byte(SN[j][i]);
}
write_byte(0xbe);
temp_value[0]=read_byte();
temp_value[1]=read_byte();
k=temp_value[1]&0xf8;//与以后是否为负数
if(k==0xf8)//假如为负数
{
temp_value[1]=~temp_value[1];//高位取反
temp_value[0]=~temp_value[0]+1;//低位取反加1
DSY_CODE2[7]='-';//显示负号
if(temp_value[0]==0){temp_value[1]=~temp_value[1]+1;}//低位为0时高位取反加1
}
else
DSY_CODE2[7]='';
cc=(temp_value[0]>>4)|((temp_value[1])<<4);//cc为整数
aa=(temp_value[0]&0x0f)*10/16;//aa为小数*10
disbuffer[0]=cc/10;
disbuffer[1]=cc%10;
disbuffer[2]=aa;
DSY_CODE2[8]=disbuffer[0]+'0';
DSY_CODE2[9]=disbuffer[1]+'0';
DSY_CODE2[10]='.';
DSY_CODE2[11]=disbuffer[2]+'0';
DSY_CODE2[13]='C';
write_com(0x80);
for(i=0;i<16;i++)
write_data(DSY_CODE1[i]);
write_com(0x80+0x40);
for(i=0;i<16;i++)
write_data(DSY_CODE2[i]);
}
}
voidmain()
{
init();
ow_DS18B20();
read_temp();
delay(40);
while
(1)
{
read_temp();
}
}
/***********************************************************************
ADC0832获取AD转换结果(模数转换电压)
************************************************************************/
//ADC0832端口定义
sbitCS=P1^0;
sbitCLK=P1^1;
sbitDIO=P1^2;
ucharget_adc()//获得的结果就是k=get_adc();
{
unsignedchari,dat;
CS=1;CLK=0;CS=0;
DIO=1;CLK=1;CLK=0;
DIO=1;CLK=1;CLK=0;
DIO=0;CLK=1;CLK=0;
DIO=1;CLK=1;
for(i=0;i<8;i++)
{
CLK=1;
CLK=0;
dat<<=1;
dat|=(unsignedchar)DIO;
}
CS=1;
returndat;
}
/**************************************************************************
DS1302数字时钟
***************************************************************************/
#defineuintunsignedint
#defineucharunsignedchar
uchardisbuffer[7];
sbitIO=P1^0;
sbitSCLK=P1^1;
sbitRST=P1^2;
voidwrite_byte(ucharx)//写入一字节
{
uchari;
for(i=0;i<8;i++)
{
IO=x&0x01;
SCLK=1;
SCLK=0;
x>>=1;
}
}
ucharread_byte()//读取一字节
{
uchari,b=0x00;
for(i=0;i<8;i++)
{
b|=_crol_((uchar)IO,i);
SCLK=1;
SCLK=0;
}
return(b/16*10+b%16);
}
ucharread_data(ucharaddr)//在指定地址读数据
{
uchardat;
RST=0;SCLK=0;RST=1;
write_byte(addr);
dat=read_byte();
SCLK=1;RST=0;
returndat;
}
voidget_time()//读取时间
{
uchari,addr=0x81;
for(i=0;i<7;i++)
{
disbuffer[i]=read_data(addr);//声明:
disbuffer[0]是秒的值
addr+=2;//disbuffer[1]是分
}//disbuffer[0~6]秒,分,时,日,星期,月,年
}
************************************************************************
**********************************************************************
时钟显示部分
uchari;
ucharLCD_DSY1[]={"DATE00-00-00"};//日期
ucharLCD_DSY2[]={"TIME00:
00:
00"};//时间
voiddisplay()
{
get_time();
LCD_DSY2[12]=disbuffer[0]%10+'0';LCD_DSY2[11]=disbuffer[0]/10+'0';//秒低位,秒高位
LCD_DSY2[9]=disbuffer[1]%10+'0';LCD_DSY2[8]=disbuffer[1]/10+'0';//分
LCD_DSY2[6]=disbuffer[2]%10+'0';LCD_DSY2[5]=disbuffer[2]/10+'0';//时
LCD_DSY1[12]=disbuffer[3]%10+'0';LCD_DSY1[11]=disbuffer[3]/10+'0';//日
//disbuffer[5]是星期
LCD_DSY1[9]=disbuffer[4]%10+'0';LCD_DSY1[8]=disbuffer[4]/10+'0';//月
LCD_DSY1[6]=disbuffer[6]%10+'0';LCD_DSY1[5]=disbuffer[6]/10+'0';//年
LCD_write_com(0x80);
for(i=0;i<16;i++)
LCD_write_data(LCD_DSY1[i]);
LCD_write_com(0x80+0x40);
for(i=0;i<16;i++)
LCD_write_data(LCD_DSY2[i]);
}
/****************************************************************************
4*4矩阵键盘Keyboard
****************************************************************************/
voidkeyboard()//键盘扫描
{
uchara,b;
P1=0x0f;
delay
(2);
a=P0;
if(a!
=0xf0)
delay(10);
if(a!
=0xf0)
{
b=P1^0x0f;//屏蔽高四位
switch(b)//先去确定行
{
case1:
c=0;break;//第一列
case2:
c=1;break;
case4:
c=2;break;
case8:
c=3;break;
default:
c=16;
}
P1=0xf0;
delay
(2);
b=P1>>4^0x0f;
switch(b)//先去确定列
{
case1:
c=c+0;break;//第一行
case2:
c=c+4;break;
case4:
c=c+8;break;
case8:
c=c+12;
}
}
}
/************************************************************************
LCD12864相关程序
*************************************************************************/
#defineucharunsignedchar
#defineuintunsignedint
#definedisp_Off0x3e//关显示
#definedisp_On0x3f//开显示
#definePage_Add0xb8//页地址
#defineCol_Add0x40//列地址
#defineStart_Line0xc0//行地址
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
sbitCS1=P2^3;
sbitCS2=P2^4;
sbitRST=P2^5;
ucharcodewenzi[][32];//文字字模的定义
ucharcodeshuzi[][16];//数字字摸的定义
bitLCD_busy()//检查忙位
{
P0=0xff;RST=1;
RW=1;RS=0;
E=1;E=0;
return(bit)(P0&0x80);
}
voidLCD_write_com(ucharcom)//写命令到LCD
{
LCD_busy();
RW=0;RS=0;E=0;
P0=com;
E=1;E=0;
}
voidLCD_write_data(uchardate)//写数据到LCD
{
LCD_busy();
RW=0;RS=1;
P0=date;
E=1;E=0;
}
voidLCD_Reset()//初始化LCD屏
{
CS1=1;CS2=1;
LCD_write_com(0x38);
LCD_write_com(0x0f);
LCD_write_com(0x01);
LCD_write_com(0x06);
LCD_write_com(Start_Line);
}
voidCLR_12864()//清屏
{
ucharj,k;
CS1=0;CS2=0;
LCD_write_com(Page_Add+0);
LCD_write_com(Col_Add+0);
for(k=0;k<8;k++)
{
LCD_write_com(Page_Add+k);
for(j=0;j<64;j++)
{
LCD_write_com(Col_Add+j);
LCD_write_data(0x00);
}
}
}
voiddisplay_a_char(ucharp,ucharl,ucharn)//显示数字8*16的数字//第P行第L位显示M
{
uchari,j;
for(j=0;j<2;j++)
{
LCD_write_com(Page_Add+p+j);
LCD_write_com(Col_Add+l);
for(i=0;i<8;i++)
LCD_write_data(shuzi[n][8*j+i]);//shuzi为需要的数字
}
}
voiddisplay_a_word(ucharp,ucharl,ucharn)//显示数字16*16的汉字
{
uchari,j;
for(j=0;j<2;j++)
{
LCD_write_com(Page_Add+p+j);
LCD_write_com(Col_Add+l);
for(i=0;i<16;i++)
LCD_write_data(wenzi[n][16*j+i]);//wenzi为需要的数字
}
}
voiddisp_img(ucharcode*img)//显示12864图片不需图片时可以不要
{
ucharj,k;
for(k=0;k<8;k++)
{
CS2=1;CS1=0;
LCD_write_com(Page_Add+k);
LCD_write_com(Col_Add+0);
for(j=0;j<64;j++)
LCD_write_data(img[k*128+j]);
CS2=0;CS1=1;
LCD_write_com(Page_Add+k);
LCD_write_com(Col_Add+0);
for(j=64;j<128;j++)
LCD_write_data(img[k*128+j