📄 yupengdeng.c
字号:
/*********************************************************************************************/
#include<AT89X51.H> // 包含头文件
#include <absacc.h>
#include <stdio.h>
#include <intrins.h>
#define reset() {WDT=0x1e;WDT=0xe1;} //看门狗复位宏定义
/* 与编译器无关的数据类型定义 */
/********************************************************************************************/
typedef unsigned char uint8; // 无符号8位整型变量
typedef signed char int8; // 有符号8位整型变量
typedef unsigned short uint16; // 无符号16位整型变量
typedef signed short int16; // 有符号16位整型变量
typedef unsigned int uint32; // 无符号32位整型变量
typedef signed int int32; // 有符号32位整型变量
typedef float fp32; // 单精度浮点数(32位长度)
typedef double fp64; // 双精度浮点数(64位长度)
/********************************************************************************************/
uint32 deda; //0 //1ms计时单元
uint32 sec; //0 //计时秒
uint8 min; //0 //计时分
/* 定义位变量 */
sbit adccs=P2^3;
sbit adcclk=P2^4;
sbit adcdo=P2^5;
sbit pwm=P2^6;
sbit LED=P2^0;
sfr WDT=0xa6;
bit flag; //0 //5min中断采集数据标志
static uint8 percent; // 用于保存占空比中输出低电平的时间份额,总共10份
uint8 ch;
/**********************************函数声明表************************************************/
void init_timer0(); //定时器T0初始化
void init_timer1(); //定时器T1初始化
/********************************************************/
/* A/D采集 */
/********************************************************/
void delay1(unsigned char x)
{
unsigned char i;
for(i=0;i<x;i++)
{};
}
void adcck(void) //时钟函数
{
adcclk=1;delay1(2);
adcclk=0;delay1(2);
}
unsigned char readadc(void) //读出TLC0831转换数据函数
{
unsigned char i;
//uchar ch;
adccs=0;
adcck();ch=0;
for(;adcdo==1;)adcck();
for(i=0;i<8;i++)
{
adcck();
ch=(ch<<1)|adcdo;
}
adccs=1;
return(ch); //返回值,即转换后的数据
}
/***********************************延时子程序 kx1ms******************************************/
void delay (uint32 k)
{uint32 i,j;
for(i=0;i<k;i++)
{for(j=0;j<120;j++)
{;}
reset();
}
}
/***********************************定时器T0初始化********************************************/
void init_timer0() //1ms
{TMOD=0x11;
TH0=0xfc;
TH0=0x66;
TR0=1;ET0=1;
}
/***********************************定时器T1初始化********************************************/
void init_timer1() //0.5ms
{//TOMD=0x11;
TH0=0xff;
TH0=0x33;
TR1=1;ET1=1;
}
/*********************************************************************************************/
/*************1ms定时中断服务子函数T0*****************/
void time0(void) interrupt 1 using 1
{
TH0=0xfc;
TL0=0x66;
deda++;
if (deda>=1000){sec++;deda=0;}
//if (sec>=60) {min++; sec=0;}
//if (min>=5) {min=0;flag=1;}
if (sec>10)
{
//flag=1;
sec=0;
readadc();
if ( ch>=0&&ch<=15) percent=10;
else if (ch>15&&ch<=45) percent=9;
else if (ch>45&&ch<=75) percent=8;
else if (ch>75&&ch<100) percent=7;
else if (ch>100&&ch<=150) percent=6;
else if (ch>150&&ch<200) percent=3;
else if (ch>=200&&ch<250) percent=2;
else if (ch==255) percent=5;
}
reset();
//flag=0;
}
/*************0.5ms定时中断服务子函数T1*****************/
void time1(void) interrupt 3 using 2
{
static uint8 circle; //tt用来保存当前时间在1秒中的位置
TH1=0xff;
TL1=0x33;
TF1=0;
circle++;
if(circle==10)
{
circle=0;
}
if(circle<=percent) // 加入该句的目的是避免灭灯时发生闪烁
pwm=0;
else
pwm=1;
}
/*******************************************主函数**********************************************/
void main ()
{
init_timer0(); //定时器T0初始化
init_timer1(); //定时器T1初始化
EA=1;
percent=5;
while (1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -