- 积分
- 3306
- 在线时间
- 6321 小时
- 最后登录
- 2024-4-18
- 阅读权限
- 100
- 精华
- 1
- UID
- 5036
- 帖子
- 4977
- 精华
- 1
- 经验
- 3306 点
- 金钱
- 3017 ¥
- 注册时间
- 2005-7-26
|
楼主 |
发表于 2009-9-13 14:53
|
显示全部楼层
又停工了半个月,折腾了个洞洞板的单片机保护板。
程序
#include <STC12C52.h>
#include <STDIO.h>
#include <intrins.h>
unsigned char ms,sec,channel,in1,in2,AD_result[3];
unsigned char code adc_channel[3]={0x80,0x82,0x87}; //定义AD通道引脚、转换速度,
//P1.0是输入1,P1.7是输入2,P1.2是电源电压
sbit out = P1^5;
sbit led1 = P3^3;
sbit led2 = P3^4;
void main(void) //定义无类型函数main(void),主函数,必不可少
{
//--------------------------------------------------------------------------------
//端口初始化。
P1M1 = 0x9f; //1001,1111 P1口初始化
P1M0 = 0x60; //0110,0000 设置P1.0、P1.2,P1.7,为输入
P1 = 0x00; //0000,0000
P1ASF= 0x9f; //1000,0101 设置P1.0、P1.7,为AD转换输入
P3M1 = 0x00; //0000,0000 //P3口初始化
P3M0 = 0xff; //1111,1111 设为强推换输出
P3 = 0X00; //1111,1111
//--------------------------------------------------------------------------------
//数据初始化
ms=0;
sec=0;
channel=0;
in1=0;
in2=0;
//---------------------------------------------------------------------------------
//AD初始化
ADC_CONTR = 0x80; //1000,0000 打开A/D转换电源,打开AD电源,选P1.0为AD通道,转换速度为最慢,每840时钟周期完成一次转换
//看门狗初始化
WDT_CONTR=0x3c; //看门狗初始化
//定时器初始化
TMOD = 0x11; // 定时器0与1,工作模式1, 16位定时方式
TH0 = 0xd1;
TL0 = 0x20; //定时器0送初值,定时时间1ms
AUXR= 0x80; //AUXR = T0x12 T1x12 URAT_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
//第1、2位为设置0时,计数器T0和T1为普通模式,STC单片机专用
//第1、2位为设置1时,计数器T0和T1为12倍速模式
//------------------------------------------------------------------------------------------
//中断允许及中断优先级设定,定时器T0设为最高优先级,AD转换次之,T1为最低
IE = 0xaa; //IE= EA ELVD EADC ES ET1 EX1 ET0 EX0
// 开中断,EADC为ADC转换中断控制位,
// 第2位为ELVD,低压检测中断控制位
IP = 0x02; //IP = PPCA PLVD PADC PS PT1 PX1 PT0 PX0
IPH = 0x22; //IPH= PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H
TCON = 0x00; //TCON= TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
//------------------------------------------------------------------------------------------------------
TR0 = 1; //定时器0开始计数
ADC_CONTR = ADC_CONTR|0x08; //0000,1000 ADCS = 1,启动AD转换
while(1) //主程序循环体
{
if (in1>=75)
out=0;
if (in2>=75)
out=0;
if (AD_result[1]<65)
out=0;
}
}
void timer0() interrupt 1
{
EA=0;
TR0=0;
TH0 = 0x15;
TL0 = 0xa0+TL0+7; //定时器误差校正
TR0=1;
EA=1;
WDT_CONTR=0x3c; //喂狗
if (out==0)
{
ms++;
if (ms<=50)
{
led1=0;
led2=1;
}
else
{
led1=1;
led2=0;
}
if (ms>=100)
{
ms=0;
sec++;
}
if (sec>=12)
{
out=1;
led1=1;
led2=1;
sec=0;
}
}
if (AD_result[0]>=30)
in1++;
else
in1=0;
if (AD_result[2]>=30)
in2++;
else
in2=0;
}
void AD_routine() interrupt 5 //AD转换中断服务程序
{
unsigned char a;
ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG位,停止A/D转换
AD_result[channel] = ADC_RES; //保存返回AD转换的结果
ADC_RES=0;
channel++;
if (channel>=3)
channel=0;
ADC_CONTR = adc_channel[channel];
for(a=250;a!=0;a--);//延时使输入电压达到稳定
ADC_CONTR = ADC_CONTR|0x08; //0000,1000 ADCS = 1,启动转换
} |
|