
C语言CPU测试温度程序
// Target : M8
// Crystal: 80000Mhz
/
不可在RESET时做LCD显示,因为DS18B20的复位回应时间只有80us,显示一个字符的时间
远大于这个值
/
#include <iom8vh>
#include <macrosh>
#include "1602Driverh"
#define Set_DQ1 DDRC |= 0x08; PORTC |= 0x08; //总线拉高
#define Set_DQ0 DDRC |= 0x08; PORTC &= 0xf7; //总线置低
#define Read_DQ PINC&0x08 //读总线
#define MatchROM 0xcc //匹配ROM
#define WriteMode 0x4e //写模式
#define TH 0x64 //设置温度上限100
#define TL 0x8a //设置温度下限-10
#define MatchTemp 0x7f //写温度匹配寄存器,12bit
#define ConverTem 0x44 //DS18B20温度转换命令
#define Get_Value 0xbe //读取温度寄存器值
char DelayMs = 0;
void port_init(void)
{
DDRD = 0xff;
PORTD = 0xff;
DDRB = 0xff;
PORTB = 0xff;
DDRC = 0xff;
PORTC = 0xff;
}
//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 15uSec
// actual value: 14875uSec (08%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //setup
TCNT1L = 0x89;
OCR1AH = 0x00;
OCR1AL = 0x77;
OCR1BH = 0x00;
OCR1BL = 0x77;
ICR1H = 0x00;
ICR1L = 0x77;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xFF; //reload counter high value
TCNT1L = 0x89; //reload counter low value
if (DelayMs > 0)
{
DelayMs --;
}
}
void Delay_15us(unsigned int n)
/---Ms延时函数---/
{
DelayMs=n;
while(DelayMs > 0);
}
/
功能:主机向总线写0
/
void Writr0(void)
{
Set_DQ1;
Set_DQ0;
Delay_15us(5);
Set_DQ1;
Delay_15us(1);
}
/
功能:主机向总线写1
/
void Writr1(void)
{
Set_DQ1;
Set_DQ0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
Set_DQ1;
Delay_15us(2);
}
/
功能:向总线写一个字节
输入:需要写的字
/
void WriteBits(char Byte)
{
char i = 0;
for (i=0;i<8;i++)
{
if (Byte & 0x01)
{
Writr1();
}
else
{
Writr0();
}
Byte>>=1;
}
}
/
功能:DS18B20复位程序
返回:总线复位成功,返回1
/
char Reset1820(void)
{
static char CheckTimes = 0;
static char CheckValue = 1;
Delay_nms(1);
Set_DQ1;
Set_DQ0; //拉低总线480us
Delay_15us(34);
Set_DQ1;
DDRC &= 0xf7; //设置端口为输入状态,读取数据
PORTC |= 0x08;
while(PINC&0x08); //等待,直至确认复位成功
CheckValue = Read_DQ;
Delay_15us(32);
return CheckValue;
}
void Init1820(void)
{
if (Reset1820() == 0x08)
{
LCD_Write_String(0,0,"1820 Not Detect!");
LCD_Write_String(0,1," ");
}
else
{
LCD_Write_String(0,0,"Init DS18B20 OK!");
LCD_Write_String(0,1," ");
}
WriteBits(MatchROM);
WriteBits(WriteMode);
WriteBits(TH);
WriteBits(TL);
WriteBits(MatchTemp);
}
/
功能:从总线中读取数据位
返回:读取值
/
char ReadBit(void)
{
char i = 0;
char Read_Value = 0;
Set_DQ1;
Set_DQ0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
Set_DQ1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
DDRC &= 0xf7; //设置端口为输入状态,读取数据
PORTC |= 0x08;
asm("nop");
Read_Value = Read_DQ;
Delay_15us(3);
return Read_Value;
}
/
功能:从总线读取一个字节
返回:读取到的字符
/
char ReadBits(void)
{
char i = 0;
char b = 0;
char ReadBits_Value = 0;
for (i=8;i>0;i--)
{
ReadBits_Value = ReadBits_Value>>1;
b = ReadBit();
if(b)
{
ReadBits_Value = ReadBits_Value|0x80;
}
}
//DEC_Num_Disp(0,1,ReadBits_Value,5);
return ReadBits_Value;
}
/
功能:获得温度值
返回:温度值--摄氏温度
/
char Get_Temperature(void)
{
static int TempLow = 0;
static int TempHi = 0;
static char Temp2 = 0;
static long final = 0;
static Sign = 0; //温度的符号位
Reset1820();
WriteBits(MatchROM);
WriteBits(ConverTem);
//Delay_15us(6);
Reset1820();
WriteBits(MatchROM);
WriteBits(Get_Value);
Delay_15us(5);
TempLow = ReadBits(); //温度低位
Delay_15us(5);
Temp2 = ReadBits();
Sign = Temp2&0xf8; //符号位取高5位
TempHi = Temp2&0x07; //温度高位
if (Sign == 0) //正温的数据处理
{
final = (((TempHi)<<8)|TempLow)625;
LCD_Write_String(0,1," ");
}
else
{
final = (~(((TempHi)<<8)|TempLow)+1)625;
LCD_Write_String(0,1,"-");
}
if (final >= 37400)
{
LCD_Write_String(10,1,"Fever!");
}
if ((final < 37400)&(final>36000))
{
LCD_Write_String(10,1,"Normal");
}
if (final<=36000)
{
LCD_Write_String(10,1,"Low! ");
}
Point_Disp(1,1,final,6,3);
return final;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
LCD_Init();
LCD_Write_Char(0x01,0); //清屏
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
Delay_nms(5);
LCD_Write_String(0,0,"1820 Not Detect!");
LCD_Write_String(0,1,"Reset after sure");
Init1820();
Delay_nms(100);
LCD_Write_String(0,0,"Body Temp Test:");
LCD_Write_String(0,1," C ");
while(1)
{
Get_Temperature();
}
}
该条指令的意思时每隔1秒自动检测一次cpu温度
watch -n 1 cat /sys/devices/virtual/thermal/thermal_zone0/temp
CPU温度是大家都关心的,那么如何实时查看CPU的温度呢我在这里给大家介绍以下几种软件,方便大家实时查看CPU温度。
一、Waterfall pro Waterfall Pro
是一款老牌的电脑制冷软件,体积小、功能强大,可以有效控制CPU温度的上升,优化CPU速度,监视CPU占用率和电源消费量。
二、CPUIdle CPUIdle
能够显著降低CPU运行时的温度,延长其使用寿命,同时还能降低CPU的功耗。与其它节能软件不同的是,即使是在超负荷工作的情况下,CpuIdle仍然能够发挥明显的效果。
三、SoftCooler II SoftCooler
是一款绿色芯片降温软件,具有占用系统资源和内存空间少的优点,无须进行任何设置,解压后就可直接使用。
四、VCool VCool
是一款专门为AMD CPU“量身定做”的降温软件。而且是款绿色软件,使用非常简单,占用系统资源少,针对AMD CPU的降温效果还不错。
五、CPU降温圣手
CPU降温圣手是一款体积小巧的CPU降温软件,系统内核处理采用汇编技术,直接对CPU单元进行优化,适合所有型号的CPU产品,对CPU起到良好的优化和保护作用
CPU承受最高温度是个模糊的范围。
一般情况下,CPU温度控制在不超过室温30度以上,也就是说室温是20度,CPU温度控制在不超过50度为宜。
CPU工作温度范围可以在25-75度,过高会重新启动或死机,60度的温度就有些高,温度在50度以下比较合适。
一般的晶体管元件的的标称最高温度是120度。CPU是由晶体管组成的,所以其理论最高热耐受温度应该和晶体管元件一样为120度。
但实际上到了100度左右就会对CPU内部的晶体管造成永久性伤害,过高的温度会使晶体管效能降低,同时加速CPU的老化。
最好将CPU的温度控制在75度以下以维护电脑的稳定性和CPU的寿命。
以上就是关于C#如何获取电脑CPU温度,硬盘温度,主板温度,CPU转速全部的内容,包括:C#如何获取电脑CPU温度,硬盘温度,主板温度,CPU转速、查询cpu温度命令、查看CPU温度的软件有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)