金牌会员
积分 1652
威望 434
贡献 1092
兑换币 103
注册时间 2012-9-20
在线时间 63 小时
30 贡献
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include "MC9S12XS128.h"
#pragma LINK_INFO DERIVTIVE "mc9s12xs128b"
//用宏定义行场中断的使能开关
#define EN_HS IRQCR_IRQEN=1 //开行中断
#define STOP_HS IRQCR_IRQEN=0 //关行中断
#define EN_VS PIEJ|=0x40 //开场中断
#define STOP_VS PIEJ&=0x00 //关场中断
//宏定义
#define LINE_MAX 70 //每行采集的点数,列数
#define ROW_MAX 105 //采集到的行数
//定义变量
unsigned char image[ROW_MAX][LINE_MAX]={0}; //图像数据
unsigned int SampleRow=0,SampleLine=0;
unsigned int changshu=0,jiange=0; //用来计算场数
unsigned char a[80];
unsigned int j=0,i=0;
int c,b;
void delay()
{
for(c=0;c<6;c++)
for(b=0;b<7;b++);
}
/***************************************************/
//函数功能:端口的设定
//函数名称:PORT_Init()
/***************************************************/
void PORT_Init()
{
DDRA=0X00; //A口设置为输入
DDRE&=0XFD; //E1口设置为输入
DDRJ_DDRJ6=0; //PJ6口设置为输入
//SCI的设置
DDRS_DDRS1=1; //表示输出
DDRS_DDRS0=0; //表示输人
}
/***************************************************/
//函数功能:串口初始化SCI0
//函数名称:SCI0_Init()
/***************************************************/
void SCI0_Init()
{
SCI0BD=65; //SCI波特率=BUSCLK/(16*65)=38400
SCI0CR1=0X00; //正常工作使能,SCI等待模式使能,8位数据位
SCI0CR2=0X0C; //使能发送接收端,用来验证图像信号的,接收中断使能
}
/***************************************************/
//函数功能:SCI的接收(读)
//函数名称:SCI_Read()
/***************************************************/
unsigned char SCI_Read()
{
if(SCI0SR1_RDRF==1) //表明数据从位移寄存器传输到SCI数据寄存器
{
SCI0SR1_RDRF=1; //读取数据寄存器会将RDRF清除,重新置位
return SCI0DRL; //返回数据寄存器的数据
}
}
/***************************************************/
//函数功能:行中断初始化
//函数名称: HS_J7Init()
/***************************************************/
void HS_IRQInit()
{
STOP_HS; //关闭中断
IRQCR_IRQE=1;
// STOP_HS; //IRQ为下降沿触发
// PIEJ_PIEJ7=1; //开中断
EN_HS;
}
/***************************************************/
//函数功能:场中断初始化 PE1口外部中断
//函数名称?VS_IRQInit()
/***************************************************/
void VS_PJ6Init()
{
STOP_VS; //IRQ中断触发中断
PPSJ_PPSJ6=1; //J6口设置为 卮シ⒂行?
EN_VS; //使能IRQ触发中断
}
/***************************************************/
//函数功能:设置主频40M
//函数名称:PLL_Init()
/***************************************************/
void PLL_Init()
{
CLKSEL=0X00; //时钟选择,关闭锁相环
PLLCTL_PLLON=1; //锁相环电路允许
SYNR=0X53; //SYNR=19
REFDV=0x07; //fVC0=fPLL=2*fOSC*(SYNR+1)/(REFDV+1)=2*16M*20/8=80M
while(CRGFLG_LOCK!=1); //等待VCO的稳定
POSTDIV=0; //fBUS=fPLL/2=80M/2=40M
CLKSEL=0X80; //选择由锁相环产生总线周期
}
void tuxiangchuli()
{
// #if SCI0 //如果常量位真(非0),就执行程序1否则终止预处理命令
unsigned char row,col;
// #endif //终止预处理命令
// #if SCI0
while((SCI0SR1&0X80)==0);
SCI0DRL=0xff;
for(row=0; row<ROW_MAX;row++)
{
//每行发送一个0表示换行
for(col=0;col<LINE_MAX;col++)
{
while((SCI0SR1&0X80)==0);
// if(image_data[row][col]==0) SCI0DRL=255; //255表示白点
// else SCI0DRL=1; //1表示黑点
SCI0DRL=image[row][col];
}
}
while((SCI0SR1&0X80)==0);
SCI0DRL=0;
while((SCI0SR1&0X80)==0);
SCI0DRL=0; //发送2个零,表示发送结束
//#endif
}
void main(void) {
/* put your own code here */
PLL_Init(); //主频的初始化
PORT_Init(); //端口的初始化
HS_IRQInit(); //行中断的初始化
VS_PJ6Init(); //场中断的初始化
SCI0_Init() ;
EnableInterrupts;
while(1)
{
/* if(changshu>1)
{
DisableInterrupts;
}*/;
}
/* please make sure that you never leave main */
}
#pragma CODE_SEG NON_BANKED
void interrupt 24 VS(void)
{ PIFJ_PIFJ6=1; //清行中断标志1;
changshu++; //表示进的场数
if(changshu==1)
{
// changshu=0; //场数的计算
SampleRow=0; //行数的计算
SampleLine=0;
// EN_HS ; //开行中断
// PIFJ_PIFJ6=1;
// STOP_VS; //关场中断
}
else if(changshu==60001)
{
SampleRow=0; //行数的计算
SampleLine=0;
// EN_HS ; //开行中断
// PIFJ_PIFJ6=1;
// STOP_VS; //关场中断
}
// else ;
}
#pragma CODE_SEG DEFAULTX
/***************************************************/
//函数功能:行中断
//函数名称: 24号
/***************************************************/
#pragma CODE_SEG NON_BANKED
void interrupt 6 HS(void)
{
//PIFJ_PIFJ6=1;
// STOP_VS;
// STOP_HS; //关闭行中断
SampleRow++; //行的计数
/* if(SampleRow<=60)
{
goto loop;
}
else if(SampleRow<=120) //共采集10行
{
jiange=2;
}
else if((SampleRow>120)&&(SampleRow<=210)) //共采集10行
{
jiange=3;
}
// else if((SampleRow>210)&&(SampleRow<=290)) //共采集10行
// {
// jiange=4;
// }
else //共采集10行
{
jiange=4;
} */
jiange=5;
if(SampleRow%jiange==0)
{
//delay();
for(j=0;j<80;j++)
{
a[j]=image[i][j]=PORTA;
}
i++;
}
//开行中断
// STOP_VS; //关场中断
// loop: EN_HS; //开行中断
if(SampleRow>=525)
{
// STOP_HS;
PIFJ_PIFJ6=1;
// EN_VS; //开场中断
tuxiangchuli();
}
// else EN_HS;
}
#pragma CODE_SEG DEFAULTX
程序中行中断和场中断有问题!!记数场数的参数 记下的次数不对!!求大神知道,看看程序中有什么错误!程序代码是完整版的 可以复制粘贴运行试试!!谢谢!!
我来回答