仿真时候没反应,编译没问题。参考书上找的,书上的是STC15F2K60S2单片机(主函数里有一句CLK_DIV=0x03;//STC降频工作,与传统8051兼容),我仿真用的是AT89C51。数码管7SEG-CC
下面是程序:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
#include <math.h>
#include <float.h>
#define uchar unsigned char
#define uint unsigned int
uint i,ii,any;
uchar vv,crc0,crc1,imm,error=0;
float TEMP=0,HUMI=0;
uchar code table[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x01,0};
sbit DIN=P2^3;
sbit LOAD=P2^4;
sbit CLK=P2^5;
sbit SCL_sht=P3^6;
sbit SDA_sht=P3^7;
sbit D1=P1^6;
sbit ERR=P1^1;
/*********************7219命令函数******************************/
void LEE(uint e)
{
uint zz;
LOAD=0;
for(zz=0x8000;zz>0;zz>>1)
{
if(zz&e) DIN=1;
else DIN=0;
_nop_();CLK=1;CLK=0;
}
LOAD=1;
}
/*********************7219显示函数*******************************/
void Disp()
{
uint TEMP_,HUMI_;
uchar sign_;
TEMP_=fabs(TEMP)*10;
HUMI_=HUMI*10;
if(TEMP>=0) sign_=1;
else sign_=0;
if(!error)
{
if(TEMP>=100) LEE(table[TEMP_%10000/1000]+0xf100);
else LEE(table[10+sign_]+0xf100);
LEE(table[TEMP_%1000/100]+0xf200);
LEE(table[TEMP_%100/10]+0xf300+0x80);
LEE(table[TEMP_%10]+0xf400);
LEE(table[HUMI_%10000/1000]+0xf500);
LEE(table[HUMI_%1000/100]+0xf600);
LEE(table[HUMI_%100/10]+0xf700+0x80);
LEE(table[HUMI_%10]+0xf800);
}
else
{
LEE(0xf14f);
LEE(0xf277);
LEE(0xf377);
LEE(0xf47e);
LEE(0xf501);
LEE(0xf601);
LEE(0xf701);
LEE(0xf801);
}
}
/***********************延时函数****************************/
void delay()
{ //延时12us,晶振=12MHz
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*************************SHT启动传输函数**********************/
void SAT_sht11()
{
SCL_sht=0;delay();
SDA_sht=1;SCL_sht=0;delay();
SDA_sht=0;delay();
SCL_sht=0;delay();
SCL_sht=1;delay();
SDA_sht=1;delay();
SCL_sht=0;delay();
SDA_sht=0;delay();
}
/************************SHT11写入函数**********************/
void write_sht11(uchar y)
{
for(ii=0x80;ii>0;ii>>1)
{
if(y&ii) SDA_sht=1;
else SDA_sht=0;
delay();
SCL_sht=1;delay();
SCL_sht=0;delay();
}
SDA_sht=1;delay();
SCL_sht=1;delay();
if(SDA_sht) {
if(!(error&0x08)) error+=0x04;
}
SCL_sht=0;
}
/********************SHT软复位函数************************/
void soft_rest_sht11()
{
SAT_sht11();
SDA_sht=1; SCL_sht=0; delay();
for(ii=0;ii<20;ii++){
SCL_sht=1;delay();
SCL_sht=0;delay();
}
if(error&0x08){
write_sht11(0x1e);
for(ii=0;ii<1000;ii++) delay();
}
SAT_sht11();
error &= 0x03;
}
/*******************读取SHT11函数**********************/
void read_sht11(bit x_ack)
{
vv=0; SDA_sht=1; delay();
for(ii=0;ii<8;ii++){
SCL_sht=1;delay();
vv<<=1;
if(SDA_sht) vv|=1;
delay();
SCL_sht=0;delay();
}
SDA_sht=!x_ack; delay();
SCL_sht=1;delay();
SCL_sht=0;delay();
SDA_sht=1;
}
/***********************SHT11校验函数*******************/
void crc_8()
{
for(ii=0;ii<8;ii++){
if(crc1&0x80){
crc1<<=1;
crc1^=0x31;
}
else crc1<<=1;
}
}
/***********************SHT11工作函数*****************/
void Sht11(uchar yi)
{
if(error&0x0c) soft_rest_sht11();
else SAT_sht11();
write_sht11(yi);
for(ii=0;ii<65532;ii++){
delay();
if(!SDA_sht) break;
}
if(!SDA_sht) {
any=0;
read_sht11(1);
any=vv; any<<=8;
crc1=0; crc1^=yi; crc_8();
crc1^=vv; crc_8();
read_sht11(1);
any+=vv; crc1^=vv; crc_8();
read_sht11(0);
crc0=0;
for(ii=1;ii<0xe0;ii<<=1){
crc0<<=1;
if(vv&ii) crc0++;
}
crc0=vv;
}
else
crc1=!crc0;
}
/*************************温、湿度测量函数*******************************/
void EEi_sht11()
{
Sht11(0x03);
if(crc1!=crc0){
if(!(error&0x08))
error+=0x04;
}
else {
any&=0x3fff;
TEMP=any*0.01-39.65;
}
Sht11(0x05);
if(crc1!=crc0||!any){
if(!(error&0x08))
error+=0x04;
}
else {
error&=0x03;
D1=~D1;
any&=0x0fff;
HUMI=0.0367*any-2.0468-0.0000015955*any*any;
HUMI+=(TEMP-25)*(0.01+0.00008*any);
if(HUMI>99.90||HUMI<0)
HUMI=100;
}
}
/**************************定时器T0中断函数*********************/
void Timer0() interrupt 1
{
TH0=0xa2; TL0=0;
i++;
if(i>62){
i=0;
EEi_sht11();
}
Disp();
if(!error) ERR=1;
else {
ERR=0;
imm++;
if(imm>200){
imm=0;
error=0;
}
}
}
/***************************7219初始化化函数*******************/
void MAX7219_init()
{
LEE(0xf900);
LEE(0xfa0e);
LEE(0xfb07);
LEE(0xfc01);
LEE(0xff00);
}
/******************************主函数**************************/
void main()
{ //CLK_DIV=0x03;
MAX7219_init();
TMOD=0x01;
TH0=0xa2; TL0=0;
TR0=1;
EA=1; ET0=1;
while(1);
}
|