test_12

hardware.c

#include <hardware.h>

/*************  本地常量声明    **************/
unsigned char code t_display[]={                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码

unsigned char all_disp[][8] = {
	{12,16,16,16,16,16,16,16},//tempture
	{24,16,16,16,16,16,16,16},//para
	{10,16,16,16,16,16,16,16}//dac
};

unsigned char *smg = all_disp[0];
unsigned char Y4 = 0X00;
unsigned char Y5 = 0X00;

void all_init(){

			unsigned char i;

	P0 = 0X00;P2 = P2 & 0X1F | 0XC0;P2 &= 0X1F; 
	P0 = ~t_display[smg[i]];P2 = P2 & 0X1F | 0XE0;P2 &= 0X1F; 
	P0 = T_COM[i];P2 = P2 & 0X1F | 0XC0;P2 &= 0X1F;
	i++;
	if(i == 8) i = 0;	
	
	P0 = Y5;
	P2 = P2 & 0X1F | 0XA0;
	P2 &= 0X1F; 

	P0 = ~Y4;
	P2 = P2 & 0X1F | 0X80;
	P2 &= 0X1F; 


	
}

unsigned char key_code[4][4] = {
	4,8,12,16,
	5,9,13,17,
	6,10,14,18,
	7,11,15,19,

};
unsigned char key_state = 0;
unsigned char key_value = 0;

void Key_scan(){

	unsigned char R,C;
	
	P3 = 0X0F;
	P4 = 0x00;
	
	if(~P3&0X0F){
	  if(key_state < 255) 
			key_state++;
		
		if (P33 == 0)
			R = 0;
		if (P32 == 0)
			R = 1;
		if (P31 == 0)
			R = 2;
		if (P30 == 0)
			R = 3;
		
		/* IO操作 */
		P3 = 0xF0;
		P4 = 0xFF;
		
		if (P44 == 0)
			C = 0;
		if (P42 == 0)
			C = 1;
		if (P35 == 0)
			C = 2;
		if (P34 == 0)
			C = 3;

		key_value = key_code[R][C];
		
		
		
	}
	else //没有按键按下
	{
		key_value = 0;
		key_state = 0;
	}


}

void Timer0_Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x20;				//设置定时初始值
	TH0 = 0xD1;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	EA = 1;
	ET0 = 1;
}

unsigned char key_10ms;
unsigned char dac_5ms;
void Time0_isr() interrupt 1
{
	
	key_10ms++;
	dac_5ms++;
	all_init();


}

hardware.h

#ifndef __HARDWARE_H__
#define __HARDWARE_H__
#include <STC15F2K60S2.H>

extern unsigned char key_10ms;
extern unsigned char Y4;
extern unsigned char Y5;
extern unsigned char key_state;
extern unsigned char key_value;
extern unsigned char *smg;
extern unsigned char all_disp[][8];
extern unsigned char dac_5ms;

void Timer0_Init(void);
void Key_scan();

#endif

iic.c

/*	#   I2C代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include <iic.h>
#include <intrins.h>
#define DELAY_TIME	5
sbit sda = P2^1;
sbit scl = P2^0;
//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
//unsigned char I2CReceiveByte(void)
//{
//	unsigned char da;
//	unsigned char i;
//	for(i=0;i<8;i++){   
//		scl = 1;
//		I2C_Delay(DELAY_TIME);
//		da <<= 1;
//		if(sda) 
//			da |= 0x01;
//		scl = 0;
//		I2C_Delay(DELAY_TIME);
//	}
//	return da;    
//}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
//void I2CSendAck(unsigned char ackbit)
//{
//    scl = 0;
//    sda = ackbit; 
//	I2C_Delay(DELAY_TIME);
//    scl = 1;
//	I2C_Delay(DELAY_TIME);
//    scl = 0; 
//	sda = 1;
//	I2C_Delay(DELAY_TIME);
//}

void dac_pcf8591(unsigned char dat)
{
    I2CStart();
    I2CSendByte(0x90);
    I2CWaitAck();
    I2CSendByte(0x40);  //DAC输出模式
    I2CWaitAck();
    
    I2CSendByte(dat);
    I2CWaitAck();
    I2CStop();
	
}

iic.h

#ifndef __IIC_H__
#define __IIC_H__
#include <STC15F2K60S2.H>

static void I2C_Delay(unsigned char n);
void I2CStart(void);
void I2CStop(void);
void I2CSendByte(unsigned char byt);
//unsigned char I2CReceiveByte(void);
unsigned char I2CWaitAck(void);
//void I2CSendAck(unsigned char ackbit);

void dac_pcf8591(unsigned char dat);
#endif

main.c

#include <STC15F2K60S2.H>
#include <hardware.h>
#include <onewire.h>
#include <iic.h>
#include <intrins.h>
unsigned char screen_mode = 0;
unsigned int para_temp = 25;

bit mode_tow = 0;

float dac_value = 3.25;
float temp_value = 24.25;

static unsigned char dac_char = 255;

void Delay100ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 5;
	j = 144;
	k = 71;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
//float test = 23.45;
void main()
{
//	all_disp[0][5] = (unsigned int)test % 10 ;
	temp_value = read_tempture();
	Delay100ms();
		Timer0_Init();
	
		while(1){
			
		if(key_10ms >= 10){
			key_10ms = 0;
		/*输入 */
		 Key_scan();
		temp_value = read_tempture();
			dac_value = dac_char / 255.0f * 5.0f;
			dac_pcf8591(dac_char);
			/*处理 */
			if(key_value == 4 && key_state == 2){
			screen_mode++;
				if(screen_mode >= 3) screen_mode = 0;
			}
					
			
			if(key_value == 5 && key_state == 2){
			mode_tow = !mode_tow;
			}
			
			if(key_value == 8 && key_state == 2){
				if(screen_mode == 1){
			para_temp--;
				}
			}
					
			if(key_value == 9 && key_state == 2){
				if(screen_mode == 1){
			para_temp++;
				}
			}
			
			
			/*输出*/
			if(screen_mode == 0){//温度
			  smg = all_disp[0];
					Y4 = 0X02; 
				all_disp[0][4] = (unsigned int)temp_value / 10;
				all_disp[0][5] = (unsigned int)temp_value % 10 + 32;
				all_disp[0][6] = (unsigned int)(temp_value * 10) % 10;
				all_disp[0][7] = (unsigned int)(temp_value * 100) % 10;
			
			}
		
			
			if(screen_mode == 1){//参数
			 smg = all_disp[1];
					Y4 = 0X04; 
				all_disp[1][6] = para_temp / 10;
				all_disp[1][7] = para_temp % 10;
			}	
			
			
			if(screen_mode == 2){//dac
				Y4 = 0X08; 
			 smg = all_disp[2];				
				all_disp[2][5] = (unsigned int)dac_value % 10+32;
				all_disp[2][6] = (unsigned int)(dac_value * 10) % 10 ;
				all_disp[2][7] = (unsigned int)(dac_value  * 100 )% 10;
			
			}	
			
			
		if(mode_tow == 0){
			Y4 &= 0XFE;
			if((unsigned int)temp_value < para_temp){
	     dac_char = 0;
			}
			else {
		dac_char = 255;
		}
		}
		
		
					
	if(mode_tow == 1){
	    
		Y4 |= 0X01; 
		if((unsigned int)temp_value <= 20){
		dac_char = 51;
		}
		else if((unsigned int)temp_value >= 40){
		dac_char = 204;
		}
		else if((unsigned int)temp_value > 20 | (unsigned int)temp_value < 40){
		
		dac_char = (unsigned int)((0.15 * temp_value - 2) / 5.0f * 255.0f);
		}
	  }				
	}	
  }
}

onewire.c

/*	# 	单总线代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include <onewire.h>


sbit DQ = P1^4;
//
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

//
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}


float read_tempture()
{
	unsigned char low,high;
	init_ds18b20();
	Write_DS18B20(0XCC);
	Write_DS18B20(0X44);
	
	Delay_OneWire(5);
	
	init_ds18b20();
	Write_DS18B20(0XCC);
	Write_DS18B20(0XBE);
	
	low = Read_DS18B20();
	high = Read_DS18B20();
	
	return  (float)((unsigned int)(high<<8) | low) * 0.0625;




}

onewire.h

#ifndef __ONEWIRE_H__
#define __ONEWIRE_H__

#include <STC15F2K60S2.H>


void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);


float read_tempture();

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值