跪求基于单片机的温湿度监控系统代码?

跪求基于单片机的温湿度监控系统代码?,第1张

#include <reg51.h>

#include <intrins.h>//Keil library (is used for _nop()_ operation)

#include <math.h> //Keil library

#include <stdio.h> //Keil library

unsigned char Tem,Hum

unsigned char Set_Tem,Set_Hum

sbit SS = P1^0 //片选

sbit SCLK = P1^1 //ISD4003 时钟

sbit MOSI = P1^2 //数据输入

sbit MISO = P1^3 //数据输出

sbit LED = P1^7 //指示灯

sbit ISD_INT = P3^2//中断

sbit AN = P1^6//执行

sbit STOP = P1^5 //复位

sbit PR = P1^4 //PR=1 录音PR=0 放音

sbit DATA=P2^0

sbit SCK=P2^1

sbit SCL=P1^1

sbit SDA=P1^0

#define TEMP 0

#define HUMI 1

typedef union

{ unsigned int i

float f

} value

//enum {,EMP,HUMI}

//以上所示为系统的主程序结构,其中子程序可根据系统整个具体的要求进行添加代码,

//刷新LED显示子程序write_led()硬件采用译码器;按键检测子程序check_key()的执行通过读单片机I/O口高低电平识别按键。

//以下所示代码为读温湿度传感器子程序read_ sensor()的程序内容:

/********************************************************************

工程名 SHTxx demo program (V2.1)

文件名: SHTxx_Sample_Code.c

MCU:80C51 family

编译器: Keil Version 6.14

*******************************************************************/

//-------------------------------------------------------------------

// modul-var

//-------------------------------------------------------------------

void warning(void)

void Delay(unsigned int time)

#define noACK 0

#define ACK 1

unsigned int *p_value

#define STATUS_REG_W 0x06 //000 00110

#define STATUS_REG_R 0x07 //000 00111

#define MEASURE_TEMP 0x03 //000 00011

#define MEASURE_HUMI 0x05 //000 00101

#define RESET0x1e //000 11110

//-------------------------------------------------------------------

char s_write_byte(unsigned char value)

//-------------------------------------------------------------------

// 写一个字节,检查应答信号

{

unsigned char idata i,error=0

for (i=0x80i>0i/=2)

{ if (i &value) DATA=1

else DATA=0

SCK=1

_nop_()_nop_()_nop_() //时钟脉冲宽度 5 us

SCK=0

}

DATA=1 //释放DATA

SCK=1 //9个CLK后应答

error=DATA//检查应答信号 (DATA 被拉低)

SCK=0

return error// 如果没有应答则error=1

}//

//-------------------------------------------------------------------

char s_read_byte(unsigned char ack)

//-------------------------------------------------------------------

// 读一个字节,检查应答信号

{

unsigned char i,val=0

DATA=1 //释放DATA信号

for (i=0x80i>0i/=2)

{ SCK=1

if (DATA) val=(val | i)

SCK=0

}

DATA=!ack //如果 "ack==1" ,拉低DATA

SCK=1 //clk #9 for ack

_nop_()_nop_()_nop_() //延时5微秒

SCK=0

DATA=1 //释放DATA

return val

}

//-------------------------------------------------------------------

void s_transstart(void)

//-------------------------------------------------------------------

// generates a transmission start

// _____ ________

// DATA: |_______|

// ___ ___

// SCK : ___| |___| |______

{

DATA=1SCK=0 //初始状态

_nop_()

SCK=1

_nop_()

DATA=0

_nop_()

SCK=0

_nop_()_nop_()_nop_()

SCK=1

_nop_()

DATA=1

_nop_()

SCK=0

}

//-------------------------------------------------------------------

void s_connectionreset(void)

//-------------------------------------------------------------------

//通讯复位: 至少在9 SCK 周期后,DATA=1 传输开始

// _____________________________________________________

// DATA: //|_______|

// ____________ ___

// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___|

{

unsigned char i

DATA=1SCK=0 //初始状态

for(i=0i<9i++) //9 SCK周期

{ SCK=1

SCK=0

}

s_transstart() //通讯开始

}

//-------------------------------------------------------------------

char s_softreset(void)

// resets the sensor by a softreset

{

unsigned char error=0

s_connectionreset() //复位通讯

error+=s_write_byte(RESET) //发送复位命令

return error//如果传感器没有响应则error=1

}

//-------------------------------------------------------------------

char s_read_statusreg(unsigned char *p_value,unsigned *p_checksum)

//-------------------------------------------------------------------

//读效验寄存器状态 (8-bit)

{

unsigned char error=0

s_transstart() //通讯开始

error=s_write_byte(STATUS_REG_R)//发送命令

*p_value=s_read_byte(ACK) //读状态寄存器(8-bit)

*p_checksum=s_read_byte(noACK) //读效验和

return error //如果传感器没有响应则error=1

}

//-------------------------------------------------------------------

char s_write_statusreg(unsigned char *p_value)

//-------------------------------------------------------------------

// writes the status register with checksum (8-bit)

{

unsigned char error=0

s_transstart() //通讯开始

error+=s_write_byte(STATUS_REG_W)// 发送命令

error+=s_write_byte(*p_value) //发送状态寄存器的值

return error//如果传感器没有响应则error=1

}

//-------------------------------------------------------------------

char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)

//-------------------------------------------------------------------

// makes a measurement (humidity/temperature) with checksum

{

unsigned char idata error=0

unsigned int i

s_transstart() //通讯开始

switch(mode)

{ //发送名令

case TEMP : error+=s_write_byte(MEASURE_TEMP)break

case HUMI : error+=s_write_byte(MEASURE_HUMI)break

default : break

}

for (i=0i<65535i++) if(DATA==0) break//等待传感器完成测量

if(DATA) error+=1

*(p_value) =s_read_byte(ACK) //读取第一个字节

*(p_value+1)=s_read_byte(ACK) //读取第二个字节

*p_checksum =s_read_byte(noACK) //读取效验和

return error

}

//-------------------------------------------------------------------

//-------------------------------------------------------------------

void calc_sth11(float *p_humidity ,float *p_temperature)

//-------------------------------------------------------------------

// 计算温度和湿度

// input : humi [Ticks] (12 bit)

// temp [Ticks] (14 bit)

// output: humi [%RH]

// temp

{ const float xdata C1=-4.0

const float xdata C2=+0.0405

const float xdata C3=-0.0000028

const float xdata T1=+0.01

const float xdata T2=+0.00008

float rh=*p_humidity//计算湿度值

float t=*p_temperature // 计算温度值

float rh_lin

float rh_true

float t_C

t_C=t*0.01 - 40

rh_lin=C3*rh*rh + C2*rh + C1

rh_true=(t_C-25)*(T1+T2*rh)+rh_lin

if(rh_true>100)rh_true=100 //如果结果超出了可能的范围就取消

if(rh_true<0.1)rh_true=0.1

*p_temperature=t_C

*p_humidity=rh_true

}

//-------------------------------------------------------------------

float calc_dewpoint(float h,float t)

//-------------------------------------------------------------------

// calculates dew point

// input: humid,ty , temperature

// output: dew point

{ float dew_point,logEx

logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2)

dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx)

return dew_point

}

//-------------------------------------------------------------------

void main_measure()

//-------------------------------------------------------------------

// 使用SHT10功能步骤:

// 1.通讯复位

// 2. 测量温度,湿度

// 3. 计算温度,湿度

// 45. 显示温度,湿度

{ value humi_val,temp_val

float dew_point,error

unsigned char checksum

unsigned int idata i

s_connectionreset()

while(1)

{ error=0

error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI) //测量湿度

error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP) //测量温度

if(error!=0) s_connectionreset()

//如果有错误就复位

else

{ humi_val.f=(float)humi_val.i//将整数转换成浮点数

temp_val.f=(float)temp_val.i

calc_sth11(&humi_val.f,&temp_val.f)

//计算温度,湿度

dew_point=calc_dewpoint(humi_val.f,temp_val.f)

//计算dew

//printf("temp:%5.1fC humi:%5.1f%% dew point:%5.1f,\n",temp_v,l.f,humi_v,l.f,dew_point)

}

for (i=0i<40000i++)//----------延时0.8s

}

}

//语音功能子程序

//下面代码为语音芯片使用范例,该功能放在主程序中的warning()子程序中执行。

void delay(unsigned int time) //延迟 n 微秒

{

while(time!=0)

{

time--

}

}

void delayms(unsigned int time) //延迟 n 毫秒

{

TMOD=0x01

for(timetime>0time--)

{

TH0 = 0xfc

TL0 = 0x18

TR0 = 1

while(TF0!=1)

{}

TF0=0

TR0=0

}

}

//************************************

//ISD4002 spi 串行发送子程序,8 位数据

//************************************

void spi_send(unsigned char isdx)

{

unsigned char idata k

SS=0//SS=0 //,s=0,打开 spi 通信端

SCLK=0

for(k=0k<8k++) //先发低位再发高位,依发送。 { i

{

if((isdx&0x01)==1)

MOSI=1

else

MOSI=0

isdx=isdx>>1

SCLK=1

delay(2)

SCLK=0

delay(2)

}

}

//*******************************

//发送 stop 指令

//*******************************

void isd_stop(void)

{

delay(10)

spi_send(0x30)

SS=1

delayms(50)

}

//*******************************

//发送上电指令,并延迟 50ms

//*******************************

void isd_pu(void)

{ delay(10)

SS=0

spi_send(0x20)

SS=1

delayms(50)

}

//发送掉电指令,并延迟 50ms

//*******************************

void isd_pd(void)

{

delay(10)

spi_send(0x10)

SS=1

delayms(50)

}

//*******************************

//发送 play 指令

//*******************************

void isd_play(void)

{

LED=0

spi_send(0xf0)

SS=1

}

//*******************************

//发送 rec 指令

//*******************************

void isd_rec(void)

{

LED=0

spi_send(0xb0)

SS=1

}

//*******************************

//发送 setplay 指令

//*******************************

void isd_setplay(unsigned char adl,unsigned char adh)

{

spi_send(adl) //发送放音起始地址低位

adh=adh||0xe0

spi_send(adh) //发送放音起始地址高位

SS=1

}

//*******************************

//发送 setrec 指令

//*******************************

void isd_setrec(unsigned char adl,unsigned char adh)

{

spi_send(adl) //发送放音起始地址低位

adh=adh||0xa0

spi_send(adh) //发送放音起始地址高位

SS=1

}

//************************************

//芯片溢出,LED 闪烁提醒停止录音

//************************************

void isd_overflow(void)

{

while(AN==0)

{

LED=1

delayms(300)

LED=0

delayms(300)

}

}

//************************************

//检查芯片是否溢出(读,OVF,并返回 OVF 值)

//************************************

unsigned char chk_isdovf(void)

{

SS=0

delay(2)

SCLK=0

delay(2)

SCLK=1

SCLK=0

delay(2)

if (MISO==1)

{

SCLK=0

SS =1 //关闭 spi 通信端

isd_stop() //发送 stop 指令

return 1 //OVF 为 1,返回 1

}

else

{

SCLK=0

SS =1 //关闭 spi 通信端

isd_stop()//发送 stop 指令

return 0 //OVF 为 0,返回 0

}

}

//**********************************************************************

//主程序

//功能:1.录音时,按住 AN 键,LED 点亮开始录音,松开 AN 即可停止录音

// 再次按下 AN 键,LED 点亮开始录第二段音,依次类推,直到芯片溢出。

// 按 stop 键芯片复位

// 2.放音时,按一下 AN 键,即播放一段语音。按 stop 键芯片复位。

//************************************************************************

void voice(void)

{

unsigned char ovflog

while(1)

{

P0=P1=P2=P3=0xff//初始化

while (AN==1) //等待 AN 键按下

{

if (AN==0) //按键防抖动

{delayms(20)}

}

isd_pu() // AN 键按下,ISD 上电并延迟 50ms

isd_pd()

isd_pu()

if (PR==1) //如果 PR=1 则转入录音部分

{

delayms(500)//延迟录音

isd_setrec(0x00,0x00) //发送 0x0000h 地址的 setplay 指令

do

{

isd_rec() //发送 rec 指令

while(AN==0) //等待录音完毕

{

if (ISD_INT==0)//如果芯片溢出,进行 LED 闪烁提示,

isd_overflow()//如果取消录音(松开AN键)则停止录音,芯片复位

}

if (ISD_INT==0)

break

LED=1//录音完毕,LED 熄灭

isd_stop() //发送停止命令

while(AN==1) //如果 AN 再次按下,开始录制下一段语音

{

if(STOP==0) //如果按下 STOP 按键,则芯片复位

break

if (AN==0)

delayms(500)

}

}while(AN==0)

}

else //如果 PR==0 则转入放音部分

{

while(AN==0){}

isd_setplay(0x00,0x00)//发送 setplay 指令,从 0x0000 地址开始放音

do

{

isd_play()//发送放音指令

delay(20)

while(ISD_INT==1) //等待放音完毕的 EOM 中断信号

{}

LED=1

isd_stop() //放音完毕,发送 stop 指令

if (ovflog=chk_isdovf())//检查芯片是否溢出,如溢出则停止放音,芯片复位

break

while(AN==1)//等待 AN 键再次按下

{

if (STOP==0)

break

if(AN==0)

delayms(20)

}

}while(AN==0) // AN 键再次按下,播放下一段语音

}

isd_stop()

isd_pd()

}

}

#define ZLG7290 0x70

#define RADR 0x01

#define uchar unsigned char

#define uint unsigned int

/************************************/

void I2cStart(void)

{

SDA=1

SCL=1

Delay(10)

SDA=0

Delay(10)

SCL=0

}

/************************************/

void I2cStop(void)

{

SDA=0

SCL=1

Delay(10)

SDA=1

Delay(10)

SCL=0

}

/************************************/

void WriteI2cByte(uchar dat)

{

uchar k

SCL=0

for (k=0k<8k++)

{

SDA=(bit)(dat&0x80)

SCL=1

Delay(10)

SCL=0

dat<<=1

}

SCL=0

}

/*************************************/

uchar ReadI2cByte(void)

{

uchar dat,k

for (k=0k<8k++)

{

SCL=0

SDA=1 //一定要将SDA置为高电平,否则不能正常连续取数据

Delay(10)

SCL=1

dat<<=1

if (SDA)

dat|=0x01

SCL=0

Delay(10)

}

SCL=0

return dat

}

/*************************************/

void SendAck(void)

{

SDA=0

Delay(10)

SCL=1

Delay(10)

SCL=0

}

/*************************************/

void SendNoAck(void)

{

SDA=1

SCL=1

Delay(10)

SCL=0

}

/************************************/

void I2cWaitAck(void)

{

uchar ack

SDA=1

SCL=1

Delay(10)

ack=SDA

SCL=0

}

/***********************************************************/

void I2cReadSequence(uchar sla,uchar sbua,uchar *s,uchar len)

{

uchar l

I2cStart()

WriteI2cByte(sla)

I2cWaitAck()

WriteI2cByte(sbua)

I2cWaitAck()

I2cStart()

WriteI2cByte(sla+1)

I2cWaitAck()

for (l=0l<len-1l++)

{

*s=ReadI2cByte()

SendAck()

s++

}

*s=ReadI2cByte()

SendNoAck()

I2cStop()

}

/************************************************************/

void I2cWriteSequence(uchar sla,uchar sbua,uchar *s,uchar len) //wr

{

uchar k

I2cStart()

WriteI2cByte(sla)

I2cWaitAck()

WriteI2cByte(sbua)

I2cWaitAck()

for (k=0k<lenk++)

{

WriteI2cByte(*s)

I2cWaitAck()

s++

}

I2cStop()

}

/**************************************************************/

void I2cWriteByteToSlaver(uchar sla,uchar sbua,uchar dat)

{

I2cStart()

WriteI2cByte(sla)

I2cWaitAck()

WriteI2cByte(sbua)

I2cWaitAck()

WriteI2cByte(dat)

I2cWaitAck()

I2cStop()

Delay(10)

}

/**************************************************************/

uchar I2cReadByteFromSlaver(uchar sla,uchar sbua)

{

uchar dat

I2cStart()

WriteI2cByte(sla)

I2cWaitAck()

WriteI2cByte(sbua)

I2cWaitAck()

I2cStart()

WriteI2cByte(sla+1)

I2cWaitAck()

dat=ReadI2cByte()

SendAck()

SendNoAck()

I2cStop()

return dat

}

/**************************************************/

void main()

{

voice()//完成语音芯片的初始化 置入工作状态

s_softreset()

while(1)//进入程序主循环

{

main_measure()//读温湿度传感器 得到温度值Tem 湿度值Hum

/* if(Tem>Set_Tem &&Hum >Set_Hum)//设置报警区间

{

warning()//执行警告 启动报警

} */

}

}

显示频率,幅度可调,可产生四种波形,正弦波,方波,锯齿波,三角波,希望你能喜欢,给你发了一张效果图,喜欢的话别忘了采纳我的回答啊,邮箱就不给你发了

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

#define DAdata P0 //DA数据端口

sbit DA_S1= P2^0// 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存

sbit DA_S2= P2^1// 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存

sbit key= P3^2

uchar wavecount//'抽点'计数

uchar THtemp,TLtemp//传递频率的中间变量

uchar judge=1//在方波输出函数中用于简单判别作用

uchar waveform//当其为0、1、2时,分别代表三种波

uchar code freq_unit[3]={10,50,200}//三种波的频率单位

uchar idata wavefreq[3]={1,1,1}//给每种波定义一个数组单元,用于存放单位频率的个数

uchar code lcd_hang1[]={"Sine Wave " "Triangle Wave " "Square Wave " "Select Wave: " "press No.1 key! "}

uchar idata lcd_hang2[16]={"f= Hz "}

uchar code waveTH[]={

0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe}

uchar code waveTL[]={

0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波频率调整中间值

0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波频率调整中间值

0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c}

/*************************************************************************************************/

uchar code triangle_tab[]={ //每隔数字8,采取一次

0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78,

0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff,

0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80,

0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00}

uchar code sine_tab[256]={

//输出电压从0到最大值(正弦波1/4部分)

0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,

0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,

0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,

//输出电压从最大值到0(正弦波1/4部分)

0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,

0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,

0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,

//输出电压从0到最小值(正弦波1/4部分)

0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,

0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,

0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,

//输出电压从最小值到0(正弦波1/4部分)

0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,

0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,

0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80}

void delay(uchar z)

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

void triangle_out() //三角波输出

{

DAdata=triangle_tab[wavecount++]

if(wavecount>64) wavecount=0

DA_S1=0//打开8位输入寄存器

DA_S1=1//关闭8位输入寄存器

}

void sine_out() //正弦波输出

{

DAdata=sine_tab[wavecount++]

DA_S1=0//打开8位输入寄存器

DA_S1=1//关闭8位输入寄存器

}

void square_out() //方波输出

{

judge=~judge

if(judge==1) DAdata=0xff

else DAdata=0x00

DA_S1=0//打开8位输入寄存器

DA_S1=1//关闭8位输入寄存器

}

/************1602液晶的相关函数*************/

#define lcd_ports P1

sbit rs=P2^2

sbit rw=P2^3

sbit lcden=P2^4

void write_com(uchar com)

{

rs=0//置零,表示写指令

lcden=0

lcd_ports=com

delay(5)

lcden=1

delay(5)

lcden=0

}

void write_date(uchar date)

{

rs=1//置1,表示写数据(在指令所指的地方写数据)

lcden=0

lcd_ports=date

delay(5)

lcden=1

delay(5)

lcden=0

}

void disp_lcd(uchar addr,uchar *temp1)

{

uchar num

write_com(addr)

delay(1)//延时一会儿???

for(num=0num<16num++)

{

write_date(temp1[num])//或者这样写write_date(*(temp1+num))

delay(1)

}

}

void init_lcd()

{

//uchar num

lcden=0//可有可无???

rw=0//初始化一定要设置为零,表示写数据

write_com(0x38)//使液晶显示点阵,为下面做准备

write_com(0x0c)//初始设置

write_com(0x06)//初始设置

write_com(0x01)//清零

write_com(0x80)//使指针指向第一行第一格

disp_lcd(0x80,&lcd_hang1[3*16])//在第一行显示

disp_lcd(0xc0,&lcd_hang1[4*16])//在第二行显示

}

/********************1602液晶函数声明结束*********************/

void main()

{

uchar i=0

DA_S2=0//使DAC寄存器处于直通状态

DAdata=0

DA_S1=1//关闭8位输入寄存器

init_lcd()

waveform=0

TMOD=0x01//设置定时器0为16位工作方式

IT0=1//设置外部中断0为下降沿触发

ET0=1//开定时器中断

EX0=1

EA=1

while(1)

{

//DAout(0xff)//可输出TTL波形

//DAout(0x80)

//T_temp=32

}

}

void timer0() interrupt 1

{

TH0=THtemp

TL0=TLtemp

if(waveform==0) sine_out()

else if(waveform==1) triangle_out()

else if(waveform==2) square_out()

}

void key_int0() interrupt 0

{

uchar keytemp

uint total_freq//总频率

EA=0TR0=0//关总中断与定时器

delay(5)//延时够吗???

if(key==0) //确实有按键按下而引发中断

{

keytemp=P3&0xf0//获取P3口高四位的值

switch(keytemp)

{

case 0xe0: //选择波形

waveform++

if(waveform>2) waveform=0

break

case 0xd0: //频率按规定单位依次增加

wavefreq[waveform]++

if(wavefreq[waveform]>10) wavefreq[waveform]=1// /*这边要用“>10”,因为它比“=11”可靠

break// 性更高,使加数有个上限,不会一直加下去*/

case 0xb0: //频率按规定单位依次衰减

wavefreq[waveform]--

if(wavefreq[waveform]<1) wavefreq[waveform]=10//这边要用“<1”,因为它比“=0”可靠性更高

break

case 0x70: //TTL输出

DA_S2=1//使DAC寄存器关闭

break

}

THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]//方括号中选取第几个数后,并把该值赋给T_temp

TLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)]

total_freq= wavefreq[waveform] * freq_unit[waveform]//求输出频率(个数*单位)

lcd_hang2[5]=total_freq%10+0x30//在液晶中显示个位,(0x30 在液晶显示中表示数字0)

total_freq/=10lcd_hang2[4]=total_freq%10+0x30//在液晶中显示时十位

total_freq/=10lcd_hang2[3]=total_freq%10+0x30//在液晶中显示时百位

total_freq/=10lcd_hang2[2]=total_freq%10+0x30//在液晶中显示时千位

disp_lcd(0x80,&lcd_hang1[waveform*16])//在第一行显示

disp_lcd(0xc0,lcd_hang2)//在第二行显示

}

wavecount=0//'抽点'计数清零

while(!key)

EA=1TR0=1//开启总中断与定时器

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11140109.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存