📄 c8051020最终应用程序.c
字号:
#include <c8051f020.h> // SFR declarations
#include <stdio.h>
#include <intrins.h>
sbit P11=P1^1;
sbit P30= P3^0;
sbit P31= P3^1;
sbit P32= P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
//char data keyflag; //定时器2和键盘中断标志 (由int改为char,看好不好使)
char adval2;
char adval1;
int ef2;
int m;
int n;
int ef1;
char data keyflag; //定时器2和键盘中断标志 (由int改为char,看好不好使)
char keyvalue;
char data danflag;
char data shuangflag;
char command;
int v;
void Serial_Init()
{
CKCON |= 0x20; //定时器2使用系统时钟
T2CON=0x30; //用定时器2作UART0的波特率发生器
RCAP2H=0xFF;
RCAP2L=0xB8; //波特率是9600 (不分频是FFB8,CKCON=0X20;分频是FFFA,CKCON=0X00)
PCON|=0x80;
SCON0=0x50; //配置UART0为方式1,禁止接收 ;允许接收 0x50 182 page
IE |= 0x10;
TI0=0;
RI0=0; //清除UART接收 发送完成标志
TR2=1; //启动定时器2
}
void SYSCLK_Init(void)//时钟配置
{
int j;
OSCXCN=0x67; //启动外部振荡器 22.1184mhz
for(j=0;j<256;j++); //等待振荡器起振
while(!(OSCXCN & 0x80)); //等待晶体振荡器稳定
OSCICN=0x88;
CKCON=0x20; //定时器2使用系统时钟(用于串口时钟)
//定时器0,1,4使用系统时钟的12分频
}
//初始化配置
void config() /////端口初始化
{
WDTCN = 0xde;
WDTCN = 0xad;
//交叉开关配置
XBR0=0x04; //UART0的RX0,TX0连接到2个端口引脚
XBR1=0x94; //INT0联到P0.2
XBR2=0xc0; //交叉开关允许
P0MDOUT=0xff;
IE |= 0x05; //INT0中断允许
P1MDOUT=0x00;//设计成漏极开路,使成为输入引脚,重要
P1=0xff;
P2MDOUT=0x00;
P2=0xff;
P3MDOUT=0xff;
P74OUT=0xf3;
//P74OUT=0xff;
P5=0xff;
_nop_();
_nop_();
_nop_();
return;
}
//延时
void delay(unsigned int x1)//延时
{
while(--x1)
{ }
return;
}
void keytab()//键盘应用程序
{
unsigned char idata scancode;
unsigned char idata keycode;
//P7口高4位对应接上拉电阻的4行,低4位对应无上拉电阻的4列。
delay(200); //有键按下,去抖动
if((P7 & 0xf0)==0xf0) return; //如果检测不到,推出键盘处理程序
scancode=0xfe;
while(scancode !=0xff) //循环扫描是否有键按下
{
P7=scancode;
keycode=P7;
if((keycode & 0xf0)!=0xf0) break ; //说明有键按下
scancode=((keycode<<1)|0xf0);
}
keycode=~keycode;
_nop_();
//////////////////////////////////////////////////////////////////////
if(keycode==0x43)//单通道
{ P31=0;//关闭时钟
keyvalue=0;
if(danflag==0)
{danflag=1;
shuangflag=0;}
SBUF0=0x55;
while (TI0==0);
TI0=0;
SBUF0=0xaa;
while (TI0==0);
TI0=0;
command |= 0x01;//设置命令字
command &=0xfd;
SBUF0=command;
while (TI0==0);
TI0=0;
P6 &=0xfd;
delay(1000);
P6|=0x04;
P31=1;
}
///////////////////////////////////////////////////////////////////
if(keycode==0x83)//双踪
{P31=0;
keyvalue=1;
if(shuangflag==0)
{danflag=0;
shuangflag=1;}
SBUF0=0x55;
while (TI0==0);
TI0=0;
SBUF0=0xaa;
while (TI0==0);
TI0=0;
command |= 0x02;
command &=0xfe;
SBUF0=command;
while (TI0==0);
TI0=0;
P6 &=0xfd;
delay(1000);
P6|=0x04;
P31=1;
}
/////////////////////////////////////////////////////////////////////
if(keycode==0x13)//采样率1k,2
{ P31=0;
P32=1;
P33=0;
P34=0;
SBUF0=0x55;
while (TI0==0);
TI0=0;
SBUF0=0xaa;
while (TI0==0);
TI0=0;
command &= 0xcf;
command |=0x04;
SBUF0=command;
while (TI0==0);
TI0=0;
P6 &=0xfd;
delay(1000);
delay(1000);
P6|=0x04;
P31=1;
keyvalue=2;
}
//////////////////////////////////////////////////
if(keycode==0x23)//采样率20k
{ P31=0;
P32=1;
P33=1;
P34=0;
SBUF0=0x55;
while (TI0==0);
TI0=0;
SBUF0=0xaa;
while (TI0==0);
TI0=0;
command &= 0xef;
command |=0x0c;
SBUF0=command;
while (TI0==0);
TI0=0;
P6 &=0xfd;
delay(1000);
delay(1000);
P6|=0x04;
P31=1;
keyvalue=3;
}
///////////////////////////////////////////////////////////////200k
if(keycode==0x41)
{ P31=0;
P32=0;
P33=0;
P34=1;
SBUF0=0x55;
while (TI0==0);
TI0=0;
SBUF0=0xaa;
while (TI0==0);
TI0=0;
command &= 0xf3;
command |=0x10;
SBUF0=command;
while (TI0==0);
TI0=0;
P6 &=0xfd;
delay(1000);
delay(1000);
P6|=0x04;
P31=1;
keyvalue=4;
}
//////////////////////////////////////////////////////////1M
if(keycode==0x81)
{P31=0;
P32=1;
P33=0;
P34=1;
command &= 0xf7;
command |=0x14;
SBUF0=0x55;
while (TI0==0);
TI0=0;
SBUF0=0xaa;
while (TI0==0);
TI0=0;
SBUF0=command;
while (TI0==0);
TI0=0;
P6 &=0xfd;
delay(1000);
delay(1000);
P6|=0x04;
P31=1;
keyvalue=5;
}
///////////////////////////////////////////////////////////2M
if(keycode==0x11)
{P31=0;
P32=0;
P33=1;
P34=1;
command &= 0xfb;
command |=0x18;
SBUF0=0x55;
while (TI0==0);
TI0=0;
SBUF0=0xaa;
while (TI0==0);
TI0=0;
SBUF0=command;
while (TI0==0);
TI0=0;
P6 &=0xfd;
delay(1000);
delay(1000);
P6|=0x04;
P31=1;
keyvalue=6;
}
if(keycode==0x21)/////////////////////////////////20M
{ P31=0;
P32=1;
P33=1;
P34=1;
command |=0x1c;
SBUF0=0x55;
while (TI0==0);
TI0=0;
SBUF0=0xaa;
while (TI0==0);
TI0=0;
SBUF0=command;
while (TI0==0);
TI0=0;
P6 &=0xfd;
delay(1000);
delay(1000);
P6|=0x04;
P31=1;
keyvalue=7;
}
if(keycode==0x4f)
{
keyvalue=8;
}
if(keycode==0x8f)
{
keyvalue=9;
}
if(keycode==0x1f)
{
keyvalue=10;
}
if(keycode==0x2f)
{
keyvalue=11;
}
if(keycode==0x47)
{
keyvalue=12;
}
if(keycode==0x87)
{
keyvalue=13;
}
if(keycode==0x17)
{
keyvalue=14;
}
if(keycode==0x27)
{
keyvalue=15;
}
_nop_();
P7 = 0xf0;
return;
}
void Key_Int0(void) interrupt 0 using 3
{
EX0=0;
P31=0;
if (keyflag==0) keyflag=1; //相当于键盘处理程序执行完后才能再次接收按键,否则不进行键盘处理
EX0=1;
}
void fasong(void) interrupt 2 using 3
{
EX1=0;//关中断0
P31=0;//关闭写信号
if(danflag==1)
{
ef2=0;
addr2: if(ef2<=1024)
{ef2=ef2+1;//7202中有1024个储存单元,所以计1024个数,如果到了1024个数就是取完了,继续下一次传输
P30=1;
delay(50);//50是20k的读取速度
P30=0;
delay(50);
adval2=P2;
SBUF0=adval2;
while (TI0==0);
TI0=0;
goto addr2;}
else {
P6 &=0xfd;//复位,使7202读写指针回到开始位置
delay(1000);
P6|=0x04;
P31=1;//开通写信号
}
}
if(shuangflag==1)//双踪传输数据
{ef2=0;
addr12:if(ef2<=1024)
{ef2=ef2+1;
P30=1;
delay(50);//50是20k的读取速度
P30=0;
delay(50);
m+=1;
adval2=P2;
SBUF0=adval2;
while (TI0==0);
TI0=0;
P6 |=0x01;//产生读取7202数据方波
delay(50);
P6 &=0xfe;
delay(50);
n+=1;
adval1=P1;
SBUF0=adval1;
while (TI0==0);
TI0=0;
goto addr12;}
else {
P6 &=0xfd;//复位,使7202读写指针回到开始位置
delay(1000);
P6|=0x04;
P31=1;//开通写信号
}
}
EX1=1;
}
void main (void) //初始化要根据各个器件的逻辑(谁先谁后,否则7202出错)
{
Serial_Init();
SYSCLK_Init();
config();
//选151工作频率
P32=1;
P33=0;
P34=0;
//cpld初始化
P4=0x00;
delay(1000);
P4=0x02;
//////////
//复位7202///
P6 &=0xfd;
delay(1000);
delay(1000);
P6|=0x04;
//初始化各个标志和命令字(command)八位命令字*** ### $$ 中的 ***为空掉没用到 ###为调节AD采样率 $$调节通道
keyflag=0;
danflag=1;
shuangflag=0;
command=0x05;
P7 = 0xf0; //P7口高4位对应接上拉电阻的4行,低4位对应无上拉电阻的4列。
EA=1;
while(1)
{if (keyflag==1)
{
keytab();
keyflag=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -