完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
回复本帖可获得 1 分积分奖励! 每人限 1 次 |
#include #include #include #define uint unsigned int #define lucharunsigned long char #define luintunsigned long int //============端口设置程序================// Sbit SPI_SSN=P1.3; Sbit SPI_SCK=P1.4; Sbit SPI_SI=P1.5; Sbit SPI_SO=P1.6; Sbit INT=P1.7; Sbit RS=P0.5; Sbit RW=P0.6; Sbit E=P0.7; //============SPI通信函数声明================// VoidSPI_enable(Void); //SPI片选,使能开 VoidSPI_close(Void); //SPI使能关 Void SPI_sendone(Void); //发送一位数据1 Void SPI_sendzero(Void); //发送一位数据0 VoidSPI_write8(uchar ); //写8位数据 VoidSPI_write32(uchar ); //写32位数据 Luchar SPI_read16(void); //读16位数据 LucharSPI_read32(void); //读32位数据 VoidGP2_peizhi(Void); //TDC-gp2配置 //============LCD 通信函数声明================// Void LCD_wdate(uchar ); //写数据 Void LCD _wcommand(uchar ); //写指令 Void LCD_delay(uint); //延时程序 Void LCD_peizhi(Void ); //LCD配置 //============脉冲产生函数声明================// Voidfire_gene(void); //脉冲产生 //============数据处理函数声明================// Double float aver(Uchar sample[],Uchar i) //时间数据转化为距离 //============数据显示函数================// VoidLCD_xianshi(uchar date[],uchar i) //显示程序 //============主函数入口================// Void main() { Double floatlength; Uchar ss[6]; //5为有效距离数据ASCALL码 Uint R=100; //采样频率 uchar Stat; //TDC数据状态字 Uchar sample[100]; //采样数据 Uchar error[]=”notoscale”; //显示超出量程 Uint i=0; GP2_peizhi(); //上电配置TDC_GP2 LCD_peizhi(); //上电配置LDC TOMD=0x11;//设置T0、T1工作在模式2 TH1=0xFC; TL1=0x78;//定时器1产生5ms定时 While(p1.0); //扫描键盘,等待按下 Whlie(R--) { TR1=1; //启动定时器1 fire_gene(void); //产生5ms脉冲 While(!p1.7); //扫描中断口,等待测量完成 SPI_write32(0xb4); //写入读状态寄存器指令 Stat=SPI_read16(); //读状态寄存器 If(Stat&0x0600>0) //判断测量是正常还是超出量程 { //测量超出量程 SPI_write8(0x70); //TDC上电复位 While(!TF1); //等待停歇结束 Continue; //进行下一次测量 } Else //测量正常 { Sample=SPI_read16(); //读测量数据 i++; //计算测量次数 } SPI_write8(0x70); //TDC上电复位 While(!TF1); //等待下一次测量 TR1=0; } Length=aver(sample, i); //数据处理,将时间数据转化为距离M If(length==0) //超出量程 LCD_Xianshi(error,9); //LCD显示“notoscale” Else { sprintf(ss,"%3.2f", length); //将Length转化为6为ASCALL码 LCD_Xianshi(ss,6); //显示5位有效数据单位M } While(p1.0); //等待按键释放 } //============子程序===============// Voidfire_gene(void) { Do { TH0 = 0xFC; TL0 = 0x0C; //设置定时器初值(对应0.5ms) TR0= 1; //启动定时器0 while( !TF0 ); //等待定时器0溢出 TR0= 0; //停止定时器0 TF0= 0; //清除溢出标志0 p1^=1; }while(!TF1); //等待定时器1溢出 TF1=0; //清除溢出标志 TR1; //启动定时器1,产生5ms停歇 Return; } Double float aver(Uchar sample[],Uchar i) { uchar j; luchar sum; Double float length; For(j=0;j sum+=sample; length=0.00975*(sum/i); //将时间数据转化为距离单位M Return length; } VoidLCD_xianshi(uchar date[],uchar i) { LCD_wcommand(0x80); //第一行最左边显示 For(j=0;j LCD_wdate(date[j]); Return; } //============TDC通信函数===============// VoidSPI_enable(Void) //开启spi 通信,将ssn 置低 { SPI_SSN =0; //ssn 置低 _NOP(); return; } VoidSPI_close(Void) //关闭spi 通信,将ssn 置高 { SPI_SSN=1; //ssn置高 _NOP(); return; } Void SPI_sendone(); //发送一位数据1 { SPI_SCK=1; //SCK高电平 _NOP(); SPI_SI=1; //SI-输出一个高平 _NOP(); SPI_SCK=0; //SCK低电平 _NOP(); return; } Void SPI_sendzero() { SPI_SCK=1; //SCK高电平 _NOP(); SPI_SI=0 //SI-输出一个低平 _NOP(); SPI_SCK=0; //SCK低平 _NOP(); return; } voidSPI_write8(uchar wbuf8) // spi 写入8 位数据 { uchart tmp=0x80; Uint i; SPI_enable(Void); for(i=8;i>0;cnt--) { if((wbuf8&tmp)>0) //判断数据位 SPI_sendone(); //发送1 else SPI_sendzero(); //发送0 tmp /=2; //tmp //右移一位 } SPI_close(); return; } VoidSPI_write32(luchar wbuf32); // spi 写32 位数据 { luint cnt; luchar tmp="0x80000000"; SPI_enable(); for(cnt=32;cnt>0;cnt--) { if((wbuf32&tmp)>0) SPI_sendone(); //发送1 Else SPI_sendzero(); //发送0 tmp /=2; //tmp //右移一位 } _NOP(); SPI_close(); return; } Luchar SPI_read32() { Luint cnt; Luchar tmp="0x80000000"; Lucharrbuf32=0x00000000; SPI_enable(); for(cnt=32;cnt>0;cnt--) { SPI_SCK=1;//SCK 高电平 _NOP(); if((SPI_SO ==1) rbuf32 |=tmp; //判断数据位 tmp /=2; SPI_SCK =0;// SCK 低电平 _NOP(); } _NOP(); SPI_SCK =0;// 确保SCK 低电平 _NOP(); SPI_close(); return(rbuf32); } Luchar SPI_read32() { Luint cnt; Luchar tmp="0x8000"; Lucharrbuf16=0x0000; SPI_enable(); for(cnt=16;cnt>0;cnt--) { SPI_SCK=1;//SCK 高电平 _NOP(); if((SPI_SO ==1)/ rbuf316|=tmp; tmp /=2; SPI_SCK =0;// SCK 低电平 _NOP(); } _NOP(); SPI_SCK =0;// 确保SCK 低电平 _NOP(); SPI_close(); return(rbuf16); } voidGP2_peizhi(void) { Luint REG0,REG1,REG2, REG3, REG4,REG5; Lucharchar PU="0X50";//设置上电复位指令 REG0=0X80008420;//校准陶瓷晶振时间为8 个32k 周期,244.14us.设置高速晶振上电后一直起振.设置测量范围1,自动校准,上升沿敏感 REG1=0X81194900;//预期stop1 脉冲数1 个.计算第一个stop1-stop2 REG2=0X82E00000;//开启所有中断源 REG3=0x83080000;// REG4=0x84200000;// REG5=0X85080000;// SPI_write8(PU);/上电复位 _NOP(); SPI_close(); //确定SSN=0 SPI_write32(REG0); _NOP(); SPI_write32(REG1); _NOP(); SPI_write32(REG2); _NOP(); SPI_write32(REG3); _NOP(); SPI_write32(REG4); _NOP(); SPI_write32(REG5); _NOP(); return; } //============LCD通信函数===============// Void LCD_delay(uint m); //LCD延时程序 { uint y=0; for(;m>0;m--) for(y=0;y<125;y++); } Void LCD_wdate(uchar i ); { EN=0; RS=1; //寄存器选择口rs=1数据选通0为指令选通 RW=0; //读写使能端0为写有效1为读有效 EN=1; //使能端下降沿有效 P2=i; EN=0; delay(300); } Void LCD _wcommand(uchar i) { EN=0;RS=0;RW=0; EN=1; P2=i; EN=0; delay(300); } Void LCD_peizhi(Void ) { LCD_wcommand(0x01); / /显示清屏 。 LCD_wcommand(0x38);/ / 8位数据流1。 LCD_wcommand(0x0f); / /开显示光标显光标闪烁 LCD _wcommand(0x06);//写入一个数据后光标右移AC自动加1。 }![]() ![]() |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
2938个成员聚集在这个小组
加入小组2682 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3005 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2274 浏览 1 评论
4704 浏览 1 评论
2485 浏览 1 评论
952浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3005浏览 2评论
2682浏览 1评论
1084浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-3 02:19 , Processed in 1.309124 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191