金牌会员
积分 1090
威望 612
贡献 308
兑换币 214
注册时间 2012-3-10
在线时间 85 小时
毕业学校 孟坝中学
5 贡献
大家看看我这个程序
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
unsigned char Image_Data[60][74];
//基于16M外部晶振
//byte nM 预设定的总线频率
//函数可能存在问题,仅供参考演示
void SetBusCLK_nM(byte nM)
{
MMCCTL1=0X00;
PKGCR =0X06;
DIRECT =0x00;
IVBR =0xFF;
ECLKCTL=0xC0;
CPMUPROT =0x26; //停止保护时钟配置寄存器
CPMUCLKS_PSTP=0; //
CPMUCLKS_PLLSEL=1; //应用PLL
CPMUCLKS =0x80; //允许PLL分频
//CPMUSYNR =nM-1; //设置分频因子
CPMUSYNR =0xc0|(nM-1); //设置分频因子
CPMUREFDIV =0x80|0x00; //pllclock=2*(1+SYNR)= MHz;
CPMUPOSTDIV=0x00; // Set the post divider register
//CPMUPOSTDIV=0x00; // Set the post divider register
CPMUPLL =0x10; // Set the PLL frequency modulation
while(CPMUFLG_LOCK == 0); /* Wait until the PLL is within the desired tolerance of the target frequency */
CPMUPROT=0x00; /* Enable protection of clock configuration registers */
}
void PWM_Init(void)
{
//SB,B for ch2367
//SA,A for ch0145
PWMPRCLK = 0X44; //clockA,CLK B 32分频:6000k //预分频寄存器
PWMSCLA = 0x01; //对clock SA 进行2*PWMSCLA=2分频;pwm clock=clockA/4=10KHz;分频寄存 107k
PWMSCLB = 0X06; //clk SB=clk B/(2*pwmsclb)=10KHZ 分频寄存
// PWMCTL_CON67=1 --- 通道6、7 级联成一个16位的PWM通道 150k
//pwm1
//PWMCNT2 = 0;
PWMCTL_CON01=1; //--- 通道0、1 级联成一个16位的PWM通道
PWMCTL_CON23=1;
PWMCTL_CON67=1;
//PWMCAE_CAE0=1; // 左对齐 1居中对齐置为0左对齐 只有输出通道被关闭后才能对其进行设置
PWMCAE_CAE1=0; //通道时钟周期*PWMPER23
PWMCAE_CAE3=0;
PWMCAE_CAE7=0;
//PWMPOL_PPOL0=1; // 极性设置 寄存器 通道对外输出波形先是高电平然后再变为低电平
PWMPOL_PPOL1=1; // PWMDTY23/PWMPER23
PWMPOL_PPOL3=1; //(PWMPER23-PWMDTY23)/PWMPER23
PWMPOL_PPOL7=1;
/*PWMPER1 =4000; // 周期寄存器设置 100HZ
PWMDTY1 =800; // 占空比寄存器设置中值39
PWMPER3 =100;
PWMDTY3 =0;
PWMPER7 =100;
PWMDTY7 =50;*/
PWMPER01 = 20000; //周期10ms; 75Hz;
PWMDTY01 = 2300; //高电平时间为430 16.7 加左3800减右3000;
PWMPER23 = 5000; //周期10ms; 100Hz;
PWMDTY23 = 600;
PWMPER67 = 3000; //周期10ms; 100Hz;
PWMDTY67 = 0;
//PWMCLK_PCLK0 = 1; //0 1 4 5时钟源的选择 1通道的时钟源设为SA 0通道的时钟源设为A
PWMCLK_PCLK1 = 1;
PWMCLK_PCLK3 = 0;
PWMCLK_PCLK7 = 0;
//PWME_PWME0 = 1;
PWME_PWME1 = 1;
PWME_PWME3 = 1;
PWME_PWME7 = 1;
}
//计数初始化//
void time1Init(void)
{
//TIOS_IOS0=0;
//TCTL4=0x02;
//TIE_C0I=1;
PACTL_PAEN=0;//0-16b计数禁止,1允许,先禁止
PACTL_PAMOD=0;//0-计数模式,1-门时计数模式,设0
PACTL_PEDGE=0;//0下降沿,1-上升沿,指定有IOC7-PT7口输入,此位受PACTL_PAMOD影响,此设0
PACTL_CLK1=0;//当计数位外部脉冲,此设置无意义,都设0
PACTL_CLK0=0;
PACTL_PAOVI=0;//0-溢出中断禁止,1-允许,本例计数个数有time0时钟中断读取,不需要溢出中断,设0
PACTL_PAI=0;//0禁止中断,1允许,设0
PACNT=0;//计数器寄存器的值,可以使0000~FFFF,先清0
//PAFLG_PAOVF=1;//计数溢出FFFF>0000
PAFLG_PAIF=1;//脉冲数入1=IOC7-PT7,最大65536个脉冲
PACTL_PAEN=0;//16b计数允禁止
}
//--------------------行场初始化------------------//
void ECT0_Init(void)
{
TSCR1=0x80; //允许主时钟,允许预分频时钟
TIOS=0x40; //PT4,PT6均为输入捕捉
TCTL3=0x09; //PT6捕捉下降沿,PT4捕捉上升沿
TFLG2=0x80;//清主时钟溢出中断标志位
TFLG1=0xFF;//清PT4,PT6中断标志位
TIE=0x00; //关PT4,PT6中断
}
//--------------------定时器初始化------------------//
void ECT0_Init_time(void)
{
TIOS=0x40; //定时器通道0设置为输出比较
TC6=0x00ee; //赋初值,当TCNT从0计数到此值时第一次进入中断
TCTL1=0x10; //其他七路与定时器断开 执行的动作时:0通道输出清零
TSCR2=0x06; //溢出中断禁止 64M/64=1微秒,计一个数用1微秒
TSCR1=0x80; //使能定时器
TIE=0x00; //通道0输出比较中断允许 通道1、2、6、7输入捕捉中断允许
}
//---------------图像初始化------------------//
void tuxiang_init()
{
TIE_C5I=1;
TIE_C4I=1;
TIE_C6I=1;
TIE_C7I=1;
}
void SCI_Init(void)
{
SCI0BD=31; /*波特率为115200 误差为0.0079*/
//SCI0BD =BusCLK_nM/16/9600;
SCI0CR1=0;/*一个起始位8位数据位一位停止位,无奇偶校验*/
SCI0CR2=0x2C;/*TIE=0发送中断申请,TCIE发送完成中断,RIE接受完成中断,ILIE空闲中断,TE允许发送,RE允许接收
7 6 5 4 3 2
*/
}
void SEND(unsigned char DATE)
{
while(!(SCI0SR1_TDRE==1));
SCI0DRH=0;
SCI0DRL=DATE;
_asm(nop);
}
void ling()
{
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
SEND(0x00);SEND(0x00);
}
//求绝对值
int abs_1(int xn)
{
if(xn<0)xn=-xn;
return(xn);
}
int abs_stub(int anx,int bnx)
{
if(anx>=bnx) return anx-bnx;
else return bnx-anx;
}
int absa(int an)
{
if(an>=0)return an;
else return -an;
}
void delay(unsigned int time)
{
unsigned int i,j,k;
for(i=0;i<125;i++)
{
for(j=0;j<125;j++)
{
for(k=time;k>0;k--);
}
}
}
void delay1(unsigned int time)
{
unsigned int i,j,k;
for(i=0;i<80;i++)
for(j=0;j<125;j++)
for(k=time;k>0;k--);
}
void main(void)
{
unsigned char i,j;
// unsigned char T,T1,T2,n=0,m=0;
SetBusCLK_nM(48);
SCI_Init();
PWM_Init();
ECT0_Init();
ECT0_Init_time();
time1Init();
DDRA=0x00;
DDRD=0xFF;
PORTD=0xff;
DDRB=0xFF;
DDRC=0xFF;
tuxiang_init();
EnableInterrupts;
for(;;)
{
if(flag==2)
{
for(i=0;i<50;i++)
{
for(j=0;j<74;j++)
{
if(Image_Data[j]>0xa0)
{
Image_Data[j]=1;
SEND(0x01);
}
else
{
Image_Data[j]=0;
SEND(0x00);
}
}
}
flag=0;
PORTD_PD7=~PORTD_PD7;
TIE_C4I=1; //开行中断
TIE_C5I=1; //开场中断
_FEED_COP(); // feeds the dog
}
}
}
#pragma CODE_SEG NON_BANKED //定时器通道0输入捕捉中断
void interrupt 20 SCI_R(void)
{
volatile unsigned char da;
if(SCI0SR1_RDRF==1)
da=SCI0DRL;
SEND(da);
}
void interrupt 12 LINE0(void)
{
unsigned char n;
TFLG1_C4F=1;
Line_C++;
if((Line_C%3==0)&&(flag==1))
{
for(n=0;n<74;n++)
{
Image_Data[ROW][n]=PORTA;
}
if(ROW==55)
{
TIE_C4I=0; //开行中断
}
ROW++;
}
if(Line_C>240) //为什么要用这个数字
{
Line_C=0;
}
}
void interrupt 13 ROW0(void)
{
TFLG1_C5F=1;
PORTD_PD6=~PORTD_PD6; //PACTL_PAEN=1;//16b计数允许
Line_C=0;
ROW=0;
flag++;
if(flag==2)
{
TIE_C4I=0; //开行中断
TIE_C5I=0; //开场中断
}
}
void interrupt 14 dingshi(void)
{
unsigned int m;
TFLG1_C6F=1;
TIE_C6I=0;
PACTL_PAEN=0;//16b计数禁止
PORTD_PD3=~PORTD_PD3; //PACTL_PAEN=1;//16b计数允许
m=TCNT;
TC6=m+10000; //10000*1us=10ms定时时间
PACTL_PAEN=1;//16b计数禁止
TIE_C6I=1;
}
按照这个程序用蓝牙应该能看到赛道情况啊,可是我的界面是这样的,为什么呀谁能帮我看看,谢谢了
我来回答
附件:
您需要 登录 才可以下载或查看,没有帐号?注册