高级会员
- 积分
- 953
- 威望
- 520
- 贡献
- 249
- 兑换币
- 24
- 注册时间
- 2011-3-1
- 在线时间
- 92 小时
|
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
void ect (void){
TSCR1_TEN=1; //定时器使能
TIOS_IOS0 =0; //定时器通道0为输入捕捉
TIOS_IOS1 =0; //定时器通道1为输入捕捉
TCTL4_EDG0B=0;//定时器0通道为上升沿捕捉方式
TCTL4_EDG0A=1;
TCTL4_EDG1B=1; ////定时器1通道为下降沿捕捉方式
TCTL4_EDG1A=0;
TIE=0x03;//通道0.1中断使能
TFLG1_C0F=1;//清除0通道中断标志位
TFLG1_C1F=1; //清除1通道中断标志位
}
void ad (void){
ATD0CTL1=0x00;//ETRIGSEL=0 is ad通道为外部触发源
//SRES1,SRES0=0、0 is 8位精度选择控制位
// SMP_DIS=0 is 取样前不放电
//ETRIGCH(3,2,1,0) IS 选择通道 AN0
ATD0CTL2=0x40;// 禁止中断 转换后自动清除寄存器(AFFC=1转换后自动清除寄存器)
ATD0CTL3=0x88;//(DJM=1,右对齐 8位精度时转换结果放在ATD0DRxL中;S4C,S3C,S2C,S1C=0001 IS 转换序列长度选择控制位为1 )
ATD0CTL4=0x07;//SMP[2:0]=000 IS 4*AD_CLOCK RS[4:0]=00000 IS f=[Fbusclk/(PRS+1)]*0.5
ATD0CTL5=0x30;//连续转换 多通道转换 通道AN0开始
ATD0DIEN=0x00; //相应的数字信号输入禁止
}
void pll (void){ //64MHZ
CLKSEL=0X00;
PLLCTL_PLLON=1;
SYNR =0xc0 | 0x07; //REFDV=0xc1=193
REFDV=0xc0 | 0x01; // SYNR=11000000|00000111=11000111=0xc7=199
POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
_asm(nop); //1us delay
_asm(nop);
_asm(nop);
_asm(nop);
while(!(CRGFLG_LOCK == 1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL = 1; //engage PLL to system;
}
void sci (void){
SCI1CR1 = 0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
SCI1CR2_TE = 1; //允许发送
SCI0CR2_RE =1; //允许接受
SCI0CR2_RIE=1; //允许接受中断
SCI0BDH=0x01; //botelu=busclock/(bd(h,l)*16)=64MHZ/(416*16)=9600
SCI0BDL=0xa0;
}
//*********************
//发送一个字符函数
//*********************
void shuchuzifu(uchar ch)
{
if (ch =='\n')
{
while(!(SCI0SR1&0x80)) ;
SCI0DRL= 0x0d; //output'CR'
return;
}
while(!(SCI0SR1&0x80)) ; //keep waiting when not empty
SCI0DRL=ch;
}
//*********************
//发送一个字符串函数
//*********************
void shuchuzifuchuan(char ch[])
{
unsigned char ptr=0;
while(ch[ptr])
{
shuchuzifu((unsigned char)ch[ptr++]);
}
}
#define uint unsigned int
#define uchar unsigned char
#define hang_max 30
#define lie_max 40
#define fz 32
uint z;
uint caijihang,caijilie;
uchar tx[30][40];
uint lieshu=0,hangshu=0;
void main(void) {
/* put your own code here */
DDRT=0x00;
pll();
ad();
ect();
sci();
EnableInterrupts;
{
uint e,w;//小延时程序~不过不知道到底执行了多少时间~
for(e=1;e<6;e++)
for(w=0;w<10;w++);
}
for(;;) {
} /* loop forever */
/* please make sure that you never leave main */
}
#pragma CODE_SEG NON_BANKED
void interrupt 10 hangzhongduan(){
TFLG1_C0F=1;//0通道中断标志
for(z=0;z<100;z++)
asm(nop);//防止采集到消隐信号
for(lieshu=0;lieshu<lie_max;lieshu++){
while(ATD0STAT0_SCF!=1);//判断AD转换是否完成
tx[hangshu][lieshu]=ATD0DR0L;//把AD转换结果放到tx数组中保存
}
hangshu++;//行数自加一
lieshu=0;//列数清零
TIE_C0I = 1; //定时器中断使能寄存器,只有其为一TFLG才能有用
if( hangshu>hang_max) //判断一场数据是否收集完成
{
TIE_C0I = 0; //关闭行中断
TIE_C1I = 1; //打开场中断
}
}
void interrupt 9 changzhongduan() {
TIE_C0I = 0; //关闭行中断
TIE_C1I = 0;//关闭场中断]
TFLG1_C1F=1; //清零
hangshu=0;//行数初始化
lieshu=0; //列数初始化
/**************************************
* Send Image *
**************************************/
for(caijihang = 0; caijihang < hang_max; caijihang++ )
{
for( caijilie = 0; caijilie < lie_max; caijilie++ )
{
if(tx[caijihang][caijilie] > fz)
shuchuzifu('1');
else
shuchuzifu('0');
for(z=0;z<50000;z++)
asm(nop);
}
shuchuzifu('\n');
}
shuchuzifu('\n');
/**************************************
* End of Sending *
**************************************/
for(z=0;z<2000;z++)
asm(nop);
TIE_C0I = 1;
} |
|