?? chengxu.c
字號:
/********************************************************************
匯誠科技
實現(xiàn)功能:此版配套測試程序
使用芯片:STC12C2052AD
晶振:11.0592MHZ
波特率:9600
編譯環(huán)境:Keil
作者:yang
QQ:790244909
網(wǎng)站:www.ourhc.cn
淘寶店:匯誠科技 華龍電子直銷:http://hlelectrony.taobao.com
【聲明】此程序僅用于學(xué)習(xí)與參考,引用請注明版權(quán)和作者信息!
/********************************************************************
********************************************************************/
#include<STC12C5A60S2.H> //庫文件
#include <intrins.h>
#include<eprom.h>
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
#define DUAN P2 //P0口控制段
#define WEI P1 //P2口控制位
/********************************************************************
初始定義
*********************************************************************/
//數(shù)碼管顯示段碼
code uchar seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};
//數(shù)碼管顯示位碼
sbit wei1=P1^0; //位的控制端
sbit wei2=P1^1;
sbit wei3=P1^2;
sbit wei4=P1^3;
uchar numb[4]; //定義字符串用于數(shù)值轉(zhuǎn)換
//按鍵
sbit key2=P3^2;
sbit key1=P3^3;
//模擬量輸入端
sbit A1=P1^5;
sbit A2=P1^6;
//輸入控制端
sbit IN1=P3^7;
sbit IN2=P1^7;
//輸出控制端
sbit OUT1=P3^4;
sbit OUT2=P3^5;
//全局變量和標著位變量
uchar timesnum;
uchar setnum;
uchar setnum1;
uint xstimes=180;
bit flag=0;
bit zfflag=0;
bit xsflag=0;
bit changeflag=0;
/********************************************************************
延時函數(shù)
*********************************************************************/
void delay(uchar x) //延時程序 0.002秒
{
uchar m,n,s;
for(m=x;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
/********************************************************************
求值函數(shù)
*********************************************************************/
void t_to_dis(uchar num)
{
uint x;
x=num*4;
numb[0]=0; //顯示千位
numb[1]=x/100; //顯示百位
numb[2]=x%100/10; //顯示十位
numb[3]=x%10; //顯示個位
}
/********************************************************************
顯示函數(shù)
*********************************************************************/
void display() //顯示函數(shù)
{
WEI&=0XF0;
DUAN=seg7code[numb[0]];
wei1=1;
delay(2);
WEI&=0XF0;
DUAN=seg7code[numb[1]];
wei2=1;
delay(2);
WEI&=0XF0;
DUAN=seg7code[numb[2]];
wei3=1;
delay(2);
WEI&=0XF0;
DUAN=seg7code[numb[3]];
wei4=1;
delay(2);
WEI&=0XF0;
}
/********************************************************************
IO口初始化函數(shù)
*********************************************************************/
void init_all(void)
{
P2M1=0;
P2M0=0xff;
P1M1=0x80;
P1M0=0x0f;
P3M1|=0x80;
P3M0&=0x7f;
}
/********************************************************************
按鍵掃描函數(shù)
*********************************************************************/
void key_scan(void)
{
if(xsflag==1)
t_to_dis(setnum); //數(shù)值變換
else
t_to_dis(timesnum);
if(key1==0) //增加次數(shù)
{
delay(5);
if(key1==0)
{
while(!key1);
xsflag=1;
setnum++; //keynum=0為模式0,繼電器吸合300ms ,keynum=1繼電器吸合12s
if(setnum>=100)
setnum=100;
IapEraseSector(0); //擦除扇區(qū)
IapProgramByte(5,setnum);
xstimes=0;
changeflag=1;
}
}
if(key2==0) //按鍵掃描,key2按下模式變化一次
{
delay(5);
if(key2==0)
{
while(!key2);
xsflag=1;
setnum--; //減小次數(shù)
if(setnum==0||setnum>=120)
setnum=0;
IapEraseSector(0); //擦除扇區(qū)
IapProgramByte(5,setnum);
xstimes=0;
changeflag=1;
}
}
}
/********************************************************************
定時器T0初始化*********************************************************************/
void timer0init(void)
{
TMOD=0X01; //定義定時器工作方式
TH0=(65536-25000)/256;
TL0=(65536-25000)%256;
ET0=1;
TR0=1;
EA=1;
}
/********************************************************************
主函數(shù)
*********************************************************************/
void main()
{
init_all(); //初始化IO
timer0init(); //定時器初始化
setnum1=setnum=IapReadByte(5);
while(1)
{
key_scan(); //鍵盤掃描
if(xstimes>=180)
xsflag=0;
if(IN2==0&&flag==0) //尋找位置
{
delay(10);
if(IN2==0)
{
delay(2);
//while(!IN1);
OUT1=!OUT1;
flag=1;
}
}
if(flag==1&&IN1==0) //flag=1上電不計數(shù),找到位置開始計數(shù)
{
delay(5);
if(IN1==0)
{
delay(5);
while(!IN1);
if(zfflag==0&×num<(setnum1+1))
timesnum++;
else
timesnum--;
if(timesnum>=(setnum1+1))
{
delay(60);
zfflag=1;
OUT1=!OUT1;
}
if(timesnum==0)
{
delay(5);
if(timesnum==0)
{
t_to_dis(timesnum);
zfflag=0;
if(changeflag==1)
{
changeflag=0;
setnum1=setnum;
}
while(IN2);
OUT1=!OUT1;
}
}
}
}
}
}
/********************************************************************
定時器T1中斷函數(shù)
*********************************************************************/
void timer0(void)interrupt 1 using 1
{
TH0=(65536-25000)/256;
TL0=(65536-25000)%256;
xstimes++;
display(); //顯示函數(shù)
}
/********************************************************************
結(jié)束
*********************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -