初级会员
- 积分
- 156
- 金钱
- 156
- 注册时间
- 2018-8-10
- 在线时间
- 36 小时
|
1金钱
[mw_shl_code=c,true]#include <reg52.h>
#include "SMG4.h"
#include "STCADC.h"
#define Baud 11059200 //波特率,单位Hz
#define Count (unsigned int)(0.05*Baud/12)//计算50ms的计数值
#define TH_M0 (65536-Count)/256//计算装载值高8位
#define TL_M0 (65536-Count)%256//计算装载值低8位
unsigned int Count_T0=0;//定时器0的中断次数
void Delayms(unsigned int t)
{
unsigned int i;
while(t--)
for(i=0;i<10;i++);
}
//主函数
void main(void)
{
InitADC();
IE=0x82;//打开总中断和定时器0的中断
TMOD=0x01;//定时器0配置为16位定时功能
TH0=TH_M0;
TL0=TL_M0;
TR0=1;//启动定时器0
while(1)
{
DisPlay();
Delayms(GK());
}
}
void timer0(void) interrupt 1
{
TH0=TH_M0;TL0=TL_M0;//重装初始值
if(++Count_T0==20)//判断定时器0是否中断了20次,20次*50ms=1s
{
Count_T0=0;//清零
WD(ADC_TEMP());//
}
}
//#include "STCADC.h"
#include <reg52.h>
#include "intrins.h"
#include <math.h>
sfr ADC_CONTR = 0XBC; //转换控制寄存器
sfr ADC_RES = 0XBD; //转换结果高8位
sfr ADC_LOW2 = 0XBE; //转换结果低2位
sfr P1ASF = 0X9D; //I/O口模式
#define ADC_POWER 0X80 //电源位
#define ADC_FLAG 0X10 //标置位
#define ADC_START 0X08 //开启位
//常量表
code unsigned char tempbuf[] ={188,186,184,181,179,177,175,172,170,168,166,165,164,163,
161,158,155,152,149,146,143,139,136,133,130,128,125,122,
119,117,115,112,110,108,105,103,101,99,97,95,93,91,89,87,
85,83,81,79,77,76,74}; //0~50度的对应值,通过热敏电阻的B值表计算所得
//=======延时============
void ADdelay(unsigned char i)
{
while(i--);
}
//=======初始化=========
void InitADC()
{
P1ASF=0xC0; //设P1.6和P1.7为ADC转换
ADC_RES=0;
ADC_CONTR=ADC_POWER; //启动ADC电源
ADdelay(200);
}
//=======P1AD转换启动=======
void ADCP1STA(unsigned char lch)
{
ADC_CONTR=ADC_POWER|ADC_START|lch; //选择一路启动转换采集
}
//=======获取转换结果=======
unsigned char GetADC(void)
{
while(!(ADC_CONTR&ADC_FLAG));
ADC_CONTR&=~ADC_FLAG; //停止AD转换
return ADC_RES;
}
unsigned char ADC_TEMP(void) //温度
{
unsigned char ly_temp; //保存温度值
ADCP1STA(7); //启动AD转换
ly_temp = GetADC(); //读取AD转换值
return ly_temp;
}
void WD(unsigned char T) //温度
{
unsigned char i;
for(i=0;i<50;i++) //比较获得正确的温度值
{
if(T>tempbuf)
break;
}
T=--i;
ly_SMGcp[2]=1; //在第三位数码上显示点
ly_SMGbuf[2]=11; //显示单位C
ly_SMGbuf[3]=10; //第四位不显示
ly_SMGbuf[0]=T/10; //温度的十位和个位分开
ly_SMGbuf[1]=T%10;
}
unsigned char GK()
{
unsigned int ly_gk;
unsigned int ld;
ADCP1STA(6); //启动AD转换
ly_gk=GetADC(); //读取AD转换值
if(ly_gk>100&&ly_gk<10000)ld=200;
else ld=1;
return ld;
}
//#include "SMG4.h"
//头文件:
#include <reg52.h>
//引脚定义:
sbit SMG_q = P3^2; //定义数码管阳级控制脚(千位)
sbit SMG_b = P3^3; //定义数码管阳级控制脚(百位)
sbit SMG_s = P3^4; //定义数码管阳级控制脚(十位)
sbit SMG_g = P3^5; //定义数码管阳级控制脚(个位)
//常量定义:
unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6,0xc8,0x8e};
//表:共阳数码管 0~9 空 C N F
unsigned char table2[]={0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x82,0xff,0xf0,0xc1,0xb1};
//表2:共阳数码管 0~9 空 C N F,因第三位数码管是反过来安装的,因此与上面的显示值有所不同
//变量定义:
unsigned char ly_SMGbuf[4]={0,0,0,0}; //数码管的显示缓冲
unsigned char ly_SMGcp[4]={0,0,0,0}; //数码管的小数点判断值,等于0时不显示小数点,否则显示
//延时子函数
void Sdelay(unsigned char t)
{
while(t--);
}
//显示函数
void DisPlay(void)
{
P2=table[ly_SMGbuf[0]]; //查表输出显示缓冲变量数组0中对应的数码管段值
if(ly_SMGcp[0]) P2&=0x7f; //是否加入小数点显示,等于0时不加小数点,否则显示
SMG_q=0; //选择千位数码管
Sdelay(20); //加入短暂延时,延时可控制刷新频率
SMG_q=1; //关闭千位数码管
P2=table[ly_SMGbuf[1]]; //同上
if(ly_SMGcp[1]) P2&=0x7f;
SMG_b=0;
Sdelay(20);
SMG_b=1;
P2=table2[ly_SMGbuf[2]]; //同上
if(ly_SMGcp[2]) P2&=0x7f;
SMG_s=0;
Sdelay(20);
SMG_s=1;
P2=table[ly_SMGbuf[3]];
if(ly_SMGcp[3]) P2&=0x7f;
SMG_g=0; //同上
Sdelay(20);
SMG_g=1;
}[/mw_shl_code]
|
|