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