单片机大作业-简易温度计设计
通过对AT89S52单片机编程实现功能:
1.通过实现当前温度的实时显示---显示器为 12864液晶显示器
2.实现华氏度和摄氏度的实时转换---温度传感器为 DS18B20温度传感器
3.实现最低温度和最高温度的显示,并通过按钮进行设置
4.实现低于最低温度黄灯报警和高于最高温度红灯报警以及进步电机的正转反转
5.通过设置始终模块实时显示当前的年月日
6.可以通过按钮更改当前日期,时间
单片机引脚接口安排:
单片机图片展示:
流程图展示:
代码部分展示:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char INT8U;
typedef unsigned int INT16U;
#define MAIN_Fosc 11059200UL
#define LCD_data P1
sbit LCD_RS = P3^2;
sbit LCD_RW = P3^1;
sbit LCD_EN = P3^0;
sbit liu=P0^3;
sbit huang=P0^2;
sbit hong=P0^1;
sbit dd=P3^3;
sbit DS = P0^0;
sbit SCK=P0^5;
sbit SDA=P0^6;
sbit RST = P0^7;
sbit k1 = P3^4;
sbit k2 = P3^5;
sbit k3 = P3^6;
sbit k4 = P3^7;
int max=300;
int min=200;
uchar code table[]={0x01,0x02,0x04,0x08,0x01,0x02,0x04,0x08,0x01,0x02,0x04,0x08,0x01,0x02,0x04,0x08};
unsigned char code read_addr[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
unsigned char code write_addr[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
unsigned char timer[]={50,59,23,27,05,14,24};
uchar x=0;
uchar s=0;
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0; }
unsigned char Read_Ds1302_Byte ( unsigned char address ){
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++) {
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp); }
void ds1302_init(){
unsigned char i;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++){
Write_Ds1302_Byte( write_addr[i],timer[i]/10*16+timer[i]%10); } }
void ds1302_read(){
unsigned char i;
uchar time;
for(i=0;i<7;i++){
time= Read_Ds1302_Byte(read_addr[i]);
timer[i] = time/16*10+time%16;}}
void time500(){
int j;
for(j=0;j<57;j++);}
void beep(int t){
int o;
for(o=0;o<t;o++){
dd=1;
time500();
dd=0;
time500();}}
void deep(){
dd=1;
time500();
dd=0;}
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar IRDIS[2];
uchar IRCOM[4];
void dataconv();
void lcd_pos(uchar X,uchar Y);
void delay(int ms){
while(ms--){
uchar i;
for(i=0;i<250;i++){
_nop_();
_nop_();
_nop_();
_nop_();}}}
bit lcd_busy(){
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P1&0x80);
LCD_EN = 0;
return(result);
}
void lcd_wcmd(uchar cmd){
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P1 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_wdat(uchar dat){
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P1 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0; }
void lcd_init(){
lcd_wcmd(0x34);
delay(5);
lcd_wcmd(0x30);
delay(5);
lcd_wcmd(0x0C);
delay(5);
lcd_wcmd(0x01);
delay(5);}
void Delay_Ms(INT16U ms){
INT16U i;
do{
i = MAIN_Fosc / 96000;
while(--i);
}while(--ms);}
void Delay_us(uchar us){
while(us--); }
bit ds_init(){
bit i;
DS = 1;
_nop_();
DS = 0;
Delay_us(75);
DS = 1;
Delay_us(4);
i = DS;
Delay_us(20);
DS = 1;
_nop_();
return (i);}
void write_byte(uchar dat){
uchar i;
for(i=0;i<8;i++){
DS = 0;
_nop_();
DS = dat & 0x01;
Delay_us(10);
DS = 1;
_nop_();
dat >>= 1;}}
uchar read_byte(){
uchar i, j, dat;
for(i=0;i<8;i++){
DS = 0;
_nop_();
DS = 1;
_nop_();
j = DS;
Delay_us(10);
DS = 1;
_nop_();
dat = (j<<7)|(dat>>1); }
return (dat);}
void xianshi(){
uchar code dis1[] = {"ZNWDJ"};
uchar code dis2[] = {"0204"};
uchar code dis3[] = {"aaa,bbb"};
uchar code dis4[] = {"ccc,ddd"};
uchar i;
delay(10);
lcd_init();
delay(200);
lcd_pos(3,0);
i = 0;
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]);
i++;}
delay(200);
lcd_init();
lcd_pos(2,0);
i = 0;
while(dis1[i] != '\0'){
lcd_wdat(dis1[i]);
i++;}
lcd_pos(3,0);
i = 0;
while(dis2[i] != '\0'){
lcd_wdat(dis2[i]);
i++;
}
delay(200);
lcd_init();
lcd_pos(1,0);
i = 0;
while(dis1[i] != '\0'){
lcd_wdat(dis1[i]);
i++;}
lcd_pos(2,0);
i = 0;
while(dis2[i] != '\0'){
lcd_wdat(dis2[i]);
i++;}
lcd_pos(3,0);
i = 0;
while(dis3[i] != '\0'){
lcd_wdat(dis3[i]);
i++;}
delay(200);
lcd_init();
lcd_pos(0,0);
i = 0;
while(dis1[i] != '\0'){
lcd_wdat(dis1[i]);
i++;}
lcd_pos(1,0);
i = 0;
while(dis2[i] != '\0'){
lcd_wdat(dis2[i]);
i++;}
lcd_pos(2,0);
i = 0;
while(dis3[i] != '\0'){
lcd_wdat(dis3[i]);
i++;}
lcd_pos(3,0);
i = 0;
while(dis4[i] != '\0'){
lcd_wdat(dis4[i]);
i++;}
delay(200);
lcd_init(); }
void main(){
uchar code dis5[] = {"当前温度:"};
uchar code sz[]={"0123456789"};
uchar code shij[] = {"年月日时分秒周"};
uchar code shij2[] = {"年周月日时分秒"};
uchar code zg[] = {"最高"};
uchar code zd[] = {"最低"};
uchar i;
uint n;
uchar L, M,d;
xianshi();
beep(200);
Delay_Ms(3);
d=0;
while(1){
k1=1;
k2=1;
k3=1;
k4=1;
lcd_pos(0,0);
i = 0;
while(dis5[i] != '\0'){
lcd_wdat(dis5[i]);
i++;}
lcd_pos(1,0);
ds_init();
write_byte(0xcc);
write_byte(0x44);
ds_init();
write_byte(0xcc);
write_byte(0xbe);
L = read_byte();
M = read_byte();
n = M;
n <<= 8;
n |= L;
n = n * 0.0625 * 10 + 0.5 - 40;
lcd_wdat(sz[(int)(n/100)]);
lcd_wdat(sz[(int)(n/10%10)]);
lcd_wdat('.');
lcd_wdat(sz[(int)(n%10)]);
lcd_wdat('C');
lcd_wdat(' ');
ds1302_read();
lcd_pos(2,0);
lcd_wdat('2');
lcd_wdat('0');
lcd_wdat(sz[timer[6]/10]);
lcd_wdat(sz[timer[6]%10]);
lcd_wdat(shij[0]);
lcd_wdat(shij[1]);
lcd_wdat(sz[timer[4]/10]);
lcd_wdat(sz[timer[4]%10]);
lcd_wdat(shij[2]);
lcd_wdat(shij[3]);
lcd_wdat(sz[timer[3]/10]);
lcd_wdat(sz[timer[3]%10]);
lcd_wdat(shij[4]);
lcd_wdat(shij[5]);
lcd_pos(3,0);
lcd_wdat(sz[timer[2]/10]);
lcd_wdat(sz[timer[2]%10]);
lcd_wdat(shij[6]);
lcd_wdat(shij[7]);
lcd_wdat(sz[timer[1]/10]);
lcd_wdat(sz[timer[1]%10]);
lcd_wdat(shij[8]);
lcd_wdat(shij[9]);
lcd_wdat(sz[timer[0]/10]);
lcd_wdat(sz[timer[0]%10]);
lcd_wdat(shij[10]);
lcd_wdat(shij[11]);
lcd_wdat(shij[12]);
lcd_wdat(shij[13]);
lcd_wdat(sz[timer[5]/10]);
lcd_wdat(sz[timer[5]%10]);
if(k3==0&&d==0){
beep(200);
delay(100);
if(k3==0&&d==0){
min+=10;
beep(200);
delay(200);}
else min-=10;}
if(k4==0&&d==0){
beep(200);
delay(100);
if(k4==0&&d==0){
max-=10;
beep(200);
delay(200);}
else max+=10;}
if(n<min){
liu=1;
huang=0;
hong=1;
P2=table[11-(s%12)];
deep();
s+=1;}
else if(n<max){
liu=0;
huang=1;
hong=1;}
else{
liu=1;
huang=1;
hong=0;
P2=table[(s%12)];
deep();
s+=1;}
if(k1==0){
n=(n*0.18+32)*10;
lcd_pos(1,0);
lcd_wdat(sz[(int)(n/100%10)]);
lcd_wdat(sz[(int)(n/10%10)]);
lcd_wdat('.');
lcd_wdat(sz[(int)(n%10)]);
lcd_wdat('F');
delay(200);
}
if(k2==0 || d==1){
delay(200);
if(k2==0|| d==1){
d=1;
lcd_pos(1,3);
lcd_wdat(shij2[(x%7)*2]);
lcd_wdat(shij2[(x%7)*2+1]);
if(k3==0&&d==1){
delay(100);
if(k3==0){
beep(200);
timer[6-x%7]-=1;
if(6-x%7==6){if(timer[5]-365<0) timer[5]=(timer[5]-365)*-1;
else timer[5]=(timer[5]-365)%8;
timer[5]=timer[5]%8;}
if(6-x%7==4){if(timer[5]-30<0) timer[5]=(timer[5]-30)*-1;
else timer[5]=(timer[5]-30)%8;
timer[5]=timer[5]%8;}
if(6-x%7==3){if(timer[5]-1<0) timer[5]=(timer[5]-1)*-1;
else timer[5]=(timer[5]-1)%8;
timer[5]=timer[5]%8;}
if(timer[5]==0)timer[5]+=1;
ds1302_init();
ds1302_read();}}
if(k4==0&&d==1){
delay(100);
if(k4==0){
beep(200);
timer[6-x%7]+=1;
if(6-x%7==6)timer[5]=(timer[5]+365)%8;
if(6-x%7==4)timer[5]=(timer[5]+30)%8;
if(6-x%7==3)timer[5]=(timer[5]+1)%8;
if(timer[5]==0)timer[5]+=1;
ds1302_init();
ds1302_read();}}
delay(200);}}
if(k2==0&&d==1){
beep(200);
delay(200);
if(k2==0&&d==1){
x=0;
lcd_pos(1,3);
lcd_wdat(' ');
lcd_wdat(' ');
d=0;}
else{x+=1;
if(x%7==1) x+=1;}}
lcd_pos(0,5);
lcd_wdat(zg[0]);
lcd_wdat(zg[1]);
lcd_wdat(zg[2]);
lcd_wdat(zg[3]);
lcd_wdat(sz[max/100]);
lcd_wdat(sz[max/10%10]);
lcd_pos(1,5);
lcd_wdat(zd[0]);
lcd_wdat(zd[1]);
lcd_wdat(zd[2]);
lcd_wdat(zd[3]);
lcd_wdat(sz[min/100]);
lcd_wdat(sz[min/10%10]);}}
void lcd_pos(uchar X,uchar Y){
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y;
lcd_wcmd(pos); }




