#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <avr/delay.h>
#define bitset(var, bitno) ((var) |= (1 << (bitno)))
#define bitclr(var, bitno) ((var) &= ~(1 << (bitno)))
#define uchar unsigned char
#define uint unsigned int
#define LED_NUM PORTD
#define LED_VALUE PORTC
#define ADC_KEY 5
#define SOUND_OUT 0x20
#define XTAL 8
volatile uint v = 0;
volatile uchar adc_channel = 0;
volatile uint16_t hot_warning[4]={300,350,400,450};
volatile uchar setting_mode = 0;
volatile uchar auto_mode = 0x00;
const static uchar disp_table[22] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x01,0x02,0x04,0x08,0x10};
// 溫度表 -10 度到 105 度
const uint v_table[116]={
895,932,969,1006,1045,1085,1125,1166,1208,1250, //-10 ---- -1
1294,1338,1382,1427,1473,1519,1566,1614,1661,1709,//0 ---- 9
1758,1807,1856,1905,1955,2004,2054,2104,2154,2204,//10 ---- 19
2253,2303,2353,2402,2451,2500,2549,2597,2645,2692,//20 ---- 29
2740,2786,2832,2878,2923,2968,3012,3056,3099,3141,//30 ---- 39
3183,3224,3265,3304,3344,3382,3420,3457,3493,3529,//40 ---- 49
3564,3599,3632,3665,3698,3729,3760,3791,3820,3849,//50 ---- 59
3878,3905,3932,3959,3985,4010,4034,4058,4082,4105,//60 ---- 69
4127,4149,4170,4191,4211,4231,4250,4269,4287,4304,//70 ---- 79
4322,4339,4355,4371,4387,4402,4417,4431,4445,4459,//80 ---- 89
4472,4485,4497,4510,4522,4533,4545,4556,4566,4577,//90 ---- 99
4587,4597,4607,4616,4625,4634};//100 ---- 105
const uchar sound[]={ //樂曲數据表
0x45,0x48,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x49,0x4a,
0x49,0x48,0x48,0x48,0x48,0x48,0x45,0x48,0x4a,0x4a,
0x48,0x4a,0x4c,0x4c,0x4b,0x4a,0x49,0x49,0x49,0x49,
0x49,0x4c,0x4b,0x4a,0x4a,0x4a,0x49,0x48,0x48,0x49,
0x4a,0x4c,0x4b,0x4b,0x4b,0x4b,0x4b,0x46,0x46,0x45,
0x45,0x45,0x47,0x48,0x49,0x49,0x4a,0x49,0x48,0x48,
0x48,0x48,0x48,0x48,
0x00,0x00
};
const uint TONETABLE[15]={ //音調頻率數据表
64580,64684,64777,64820,64898,64968,65030,65058,
65110,65157,65178,65217,65252,65283,65297
};
volatile uint toneconst;
void delay_1ms(void)
{
uint i;
for (i=0;i<(uint)(XTAL*143-2);i++);
wdt_reset();
}
void delay_nms(uint n)
{
uint i;
for (i=0;i<n;i++)
delay_1ms();
}
void disp_led(uint value) //数码输出
{
uchar i,j;
uchar led_data[5]; //5位数码输出
led_data[0] = adc_channel;
if ((value & 0x8000)==0x8000)
{
value &= 0x7fff;
led_data[4] = 16; // 顯示負號 最高位
}
else
{
value &= 0x7fff;
led_data[4] = value/1000; //转成10进制后的最高位
}
led_data[3] = value/100%10;
led_data[2] = value/10%10;
led_data[1] = value%10;
for (j=0;j<20;j++) //决定通道温度显示的时间间隔
{
for (i=0;i<5;i++)
{
LED_VALUE = disp_table[led_data[i]]; //PORTB输出
PORTB=disp_table[led_data[i]]; //PRO仿真有BUG,所以用B口代替
if(i==2)
{
PORTB |= 0x80; // 加上小數點
}
bitclr(LED_NUM,i);
_delay_ms(2); //该延时很重要,关系显示的正常与否
LED_NUM = 0xff; //关闭数码管选通端
}
}
}
SIGNAL(SIG_ADC) //中断形式ADC转换
{
uint temp;
temp = ADCL; //取低8位
temp |= (int)ADCH<<8; //取高八位
temp = (49*temp)/10; //任意的计算,没什么意义
v += temp;
}
void get_adc_value(uchar adc_pin)
{
v = 0x0000;
ADMUX =adc_pin;
// for(i=0;i<2;i++)
//{
// ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
ADCSRA|= _BV(ADSC);
_delay_ms(10);
// while((ADCSRA & (1<<ADIF))==0);
ADCSRA&= ~_BV(ADSC);
// ADCSRA &= ~(1<<ADIF);
//}
// v = v/2;
}
uchar get_key_value(void) //读入按键值
{
get_adc_value(ADC_KEY);
if (v < 1000)
{
return 0;
}
else
{
if ((v > 3000)&&(v < 3500))
{
return 1;
}
else
{
if ((v > 2000)&&(v < 2800))
{
return 2;
}
else
{
if ((v > 1000)&&(v < 1900))
{
return 3;
}
else
{
return 0;
}
}
}
}
}
void temp_setting(void)
{
uchar key;
key = get_key_value();
if(key==2)
{
adc_channel++;
if (adc_channel>3)
{
adc_channel = 0;
}
}
if(key==3) //自动模式切换
{
if (adc_channel==0)
{
adc_channel = 1;
auto_mode = ~auto_mode;
}
adc_channel--;
}
while(1) // 查鰎盤是否放開
{
get_adc_value(ADC_KEY);
if(v < 500) //按键已经放开
{
break;
}
}
if (key==1) setting_mode = 1; // 设置模式
while(setting_mode==1)
{
key = get_key_value();
if(key==1) //如果还是按着设定模式按键
{
adc_channel++; //选取通道
if (adc_channel>3)
{
adc_channel = 0;
setting_mode = 0;
eeprom_write_word(0x00, hot_warning[0]);
//强制类型转化。指向整型数据的指针转换成指向无符号字符型指针
eeprom_busy_wait();//lay_nms(5);
eeprom_write_word(0x02, hot_warning[1]);
eeprom_busy_wait();//delay_nms(5);
eeprom_write_word(0x04, hot_warning[2]);
eeprom_busy_wait();//delay_nms(5);
eeprom_write_word(0x06, hot_warning[3]);
eeprom_busy_wait();//delay_nms(5);
}
}
else
{
if(key==2)
{
++hot_warning[adc_channel];
}
else
{
if(key==3) --hot_warning[adc_channel];
}
}
while(1)
{
get_adc_value(ADC_KEY);
if(v < 500)
{
break;
}
}
disp_led(hot_warning[adc_channel]);
}
}
uint get_degree(void)
{
uchar x,y;
uint v_big,v_small,v_step;
if (v<100) return(v=0x83E7); // 當沒有信號時顯示-99.9錯誤
for (x=0;x<115;x++) // 查表
{
if (v_table[x] >= v) // 找出電壓區域
{
v_big = v_table[x]; // 區域 高段
v_small = v_table[x-1]; //區域 低段
v_step = (v_big - v_small)/10; // 把區域細分成10份
for (y=0;y<10;y++) // 細分比較
{
v_small += v_step;
if (v < v_small) // 得出結果
{
v = x*10+y;// 其中x*10 為整數部分, y 為小數部分
if (x<10) // 少於10時為負溫度
{
v |= 0x8000; // 加入負號標記
}
else
{
v -= 100; // 0 度修正 因为数组的前10位是负温度。
} //前面的X已经乘以10,所以这里需要减去100
return v;
};
};
};
wdt_reset();
}
return v;
}
void init_port(void)
{
//CLKPR = 0x80;
// CLKPR = 0x00;
DDRC = 0xff;
PORTC = 0x00;
DDRA = 0x00;
PORTA = 0x00;
DDRD = 0xff;
PORTD = 0xff;
DDRB = 0xff;
PORTB = 0x00;
cli();
ADMUX = 0X00;
ADCSRA =_BV (ADEN)|_BV(ADIE)|_BV(ADPS2)|_BV(ADPS1);
sei();
//wdt_enable(WDTO_1S); // 使用看門狗
wdt_reset();
// WDTCR = 0x0F;
// WDTCSR = 0x0F;
}
//**********************************************8
SIGNAL(SIG_OVERFLOW1) //iv_TIMER1_OVF
{
uchar sreg;
sreg=SREG;
cli();
没有合适的资源?快使用搜索试试~ 我知道了~
51单片机经典程序加仿真 4路温度报警器.rar
共5个文件
pwi:1个
c:1个
hex:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 70 浏览量
2023-05-02
17:54:53
上传
评论
收藏 34KB RAR 举报
温馨提示
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。
资源推荐
资源详情
资源评论
收起资源包目录
51单片机经典程序加仿真 4路温度报警器.rar (5个子文件)
4路温度报警器
Makefile 14KB
redianou.hex 8KB
redianou.c 11KB
redianou.DSN 168KB
redianou.PWI 608B
共 5 条
- 1
资源评论
荣华富贵8
- 粉丝: 150
- 资源: 7649
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功