武汉科技大学本科毕业设计
附录A
超速报警器系统主要的程序代码: 头文件部分: #include
初始化部分函数:
//--------------初始化I/O口-------------// void Init_IO(void) {
DDRK_DDRK0 = 1; //TF卡RESET端 DDRK_DDRK1 = 1; //TF卡CLK端 DDRK_DDRK2=1; //TF卡DATA端 DDRK_DDRK3=0; //TF卡BUSY端 DDRA_DDRA0=1; //用于闪烁报警
DDRA_DDRA6=1; //用作I2C总线的时钟线 DDRA_DDRA7=1; //用作I2C总线的数据线
DDRJ_DDRJ7=1; //利用PJ7测程序执行的时间 }
void Init_portk() {
PORTK_PK0=1; PORTK_PK1=1; PORTK_PK2=1; PORTA_PA0=0; }
- 31 -
武汉科技大学本科毕业设计
//-------------初始化锁相环------------// void Init_PLL(void) {
CLKSEL &=0x7F; //设置OSCCLK作为系统时钟 PLLCTL &=0x8F; //禁止锁相环
//PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1), fbus=PLLCLK/2 SYNR=0xC9; REFDV=0x81;
PLLCTL |=0x70; //使能锁相环 asm NOP; asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK锁定
CLKSEL |= 0x80; //设置PLLCLK为系统时钟 }
信息采集部分:
//----------启动I2C总线函数---------//
void start_I2C() {
unsigned char i;
SDA=1; //发送起始条件的数据信号 for(i=0;i<9;i++) _asm(nop); //1.26us
SCL=1; //起始条件建立时间大于4.7us,延时 for(i=0;i<36;i++) _asm(nop); //5us
SDA=0; //发送起始信号 for(i=0;i<31;i++) _asm(nop); //起始条件锁定时间大于4us延时,4.3us SCL=0;
for(i=0;i<16;i++) _asm(nop); //钳住I2C总线,准备发送或则接受数据,2.2us }
//---------结束I2C总线函数-----------// void stop_I2C() {
unsigned char i;
- 32 -
武汉科技大学本科毕业设计
SDA=0;
for(i=0;i<9;i++) _asm(nop); //发送结束条件的数据信号 SCL=1;
for(i=0;i<36;i++) _asm(nop); //结束条件建立时间大于4us,5us SDA=1;
for(i=0;i<31;i++) _asm(nop); //发送I2C总线结束信号,4.3us }
//---------字节数据发送函数----------// void send_byte(unsigned char c) {
unsigned char i,j;
for(i=0;i<8;i++) //要发送的数据长度为8位 {
if((c<
for(j=0;j<9;j++) _asm(nop);
SCL=1; //置时钟线为高,通知被控器开始接收数据位
for(j=0;j<36;j++) _asm(nop); //保证时钟高电平周期大于4us SCL=0; }
for(i=0;i<16;i++) _asm(nop); //八位发送完后,释放数据线,开始接收应答信号 SDA=1; //SDA是一个双向线,这里似乎有问题?
for(i=0;i<16;i++) _asm(nop); SCL=1;
for(i=0;i<25;i++) _asm(nop); DDRA_DDRA7=0; if(SDA==1) Ack=0; else Ack=1; DDRA_DDRA7=1; SCL=0;
for(i=0;i<16;i++) _asm(nop); }
- 33 -
武汉科技大学本科毕业设计
//---------字节数据接收函数----------// unsigned char receive_byte() {
unsigned char i,j,retc; retc=0;
SDA=1; //置数据线方式为接收方式 for(i=0;i<8;i++) {
for(j=0;j<9;j++) _asm(nop);
SCL=0; //置时钟线为0,准备接收数据位 for(j=0;j<36;j++) _asm(nop); //延时4.7us以上
SCL=1; //置时钟线为高,使数据线上数据有效 for(j=0;j<16;j++) _asm(nop); DDRA_DDRA7=0; retc=retc<<1;
if(SDA==1) retc=retc+1;
for(j=0;j<16;j++) _asm(nop); //读数据位,存入retc中 }
DDRA_DDRA7=1; SCL=0;
for(j=0;j<16;j++) _asm(nop); return(retc); }
//---------应答子函数------------// void Ack_I2C(unsigned char a) {
unsigned char i; if(a==0) SDA=0; else SDA=1;
for(i=0;i<25;i++) _asm(nop); SCL=1;
for(i=0;i<36;i++) _asm(nop); //时钟低电平周期大于4us
SCL=0; //清时钟线,钳住I2C总线以便继续接收
for(i=0;i<16;i++) _asm(nop);
- 34 -
武汉科技大学本科毕业设计
}
//------AD转换通过I2C总线发送命令字节数据函数-----//
unsigned char I2C_send_byte(unsigned char address,unsigned char control_word) {
start_I2C(); send_byte(address);
if(Ack==0) return(0); send_byte(control_word);
if(Ack==0) return(0); stop_I2C(); return(1); }
//----AD转换通过I2C总线读取字节数据函数---// unsigned char I2C_read_byte(unsigned char address) {
unsigned char c; start_I2C(); send_byte(address+1); if(Ack==0) return(0); c=receive_byte();
Ack_I2C(1); //发送非就答位 stop_I2C(); //结束总线 return(c); }
//---------8位精度的AD采集以及I2C总线的实现--------// void sampling_voltage() {
I2C_send_byte(PCF8591,0x43); //ADC1,模数转换2,热敏电阻 voltage_data=I2C_read_byte(PCF8591); }
字模的数据处理部分:
/******************对字模进行坐标变换,使其正确的显示出来*************/ byte data_flag=0;
- 35 -