|
本人以前學單片機時學的是匯編,所以C語言的keil單片機編程不是很懂,我打算做一個酒精測試儀的課程設計,這個是我網上找到的程序代碼,我試著編譯,但是總是報錯,想問問各位大師怎么解決,是設置的問題么,希望能有詳細的解答,最好附圖解答。以下是程序代碼:
一:主程序
#include <reg52.h>
#include <stdio.h>
#include<LCD1602.h>
#include<Ds1302.h>
#include<AT24c02.h>
#include<ADC0832.h>
#define uint unsigned int
#define uchar unsigned char
//鍵盤
sbit k0=P1^0;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
//變量
bit flg=0;
//數組
uchar M_time[]={"Time"}; //時間
uchar M_Detect[]={"Detect"}; //檢測
uchar M_Storage[]={"Storage"}; //存儲
uchar stor[4];
//以定義函數
void initial_lcd1602(void);
void delays1(uint n)
{
while(n--);
}
/***************子程序************************/
void chang_h(void)
{
int g;
if(k0==0)
{for(g=0;g<20;){delays1(100);g++;}
if(k0==0)
{wr_data[4]=readtimeR[4]+1;
if(wr_data[4]>0x23)wr_data[4]=0x00;
}
}
if(k1==0)
{for(g=0;g<20;){delays1(100);g++;}
if(k1==0)
{wr_data[4]=readtimeR[4]-1;
if(readtimeR[4]==0x00)wr_data[4]=0x00;
}
}
DS1302_init();
showdata();
Display_List_Char(1,0,lcd_time);
}
/***************************************/
void chang_m(void)
{
int g;
if(k0==0)
{for(g=0;g<20;){delays1(100);g++;}
if(k0==0)
{wr_data[5]=readtimeR[5]+1;
if(wr_data[5]>0x23)wr_data[5]=0x00;
}
}
if(k1==0)
{for(g=0;g<20;){delays1(100);g++;}
if(k1==0)
{wr_data[5]=readtimeR[5]-1;
if(readtimeR[5]==0x00)wr_data[5]=0x00;
}
}
DS1302_init();
showdata();
Display_List_Char(1,0,lcd_time);
}
/*************************************/
void chang_s(void)
{
int g;
if(k0==0)
{for(g=0;g<20;){delays1(100);g++;}
if(k0==0)
{wr_data[6]=readtimeR[6]+1;
if(wr_data[6]>0x23)wr_data[6]=0x00;
}
}
if(k1==0)
{for(g=0;g<20;){delays1(100);g++;}
if(k1==0)
{wr_data[6]=readtimeR[6]-1;
if(readtimeR[6]==0x00)wr_data[6]=0x00;
}
}
DS1302_init();
showdata();
Display_List_Char(1,0,lcd_time);
}
/**************************************************/
//主函數
/**************************************************/
void main()
{
uchar i,dd;
uint g;
uchar show[4];
unsigned int data_temp=0;
initial_lcd1602();
DS1302_init();
delays1(100);
Display_List_Char(0,0,LCD_Code2);
for(g=0;g<100;){delays1(100);g++;}
while(1)
{
if(k0==0|k1==0|k2==0|k3==0)
{
write_lcd_command(0x01); //清屏
for(g=0;g<100;){delays1(100);g++;}
Display_List_Char(0,0,M_time);
Display_List_Char(0,8,M_Detect);
Display_List_Char(1,0,M_Storage);
for(g=0;g<10;){delays1(100);g++;}
/**********************時間**************************/
if(k0==0) //時間
{
write_lcd_command(0x01); //清屏
do
{ if(k3==0) flg=1;
showdata();
Display_List_Char(0,0,lcd_dat+3);
Display_List_Char(1,0,lcd_time);
/************************調時間**************************/
if(k2==0)
{
do
{
Display_One_Char(1,10,'H');
if(k3==0) flg=1;
chang_h();
for(g=0;g<100;){delays1(100);g++;}
if(k2==0)
{do
{
Display_One_Char(1,10,'M');
if(k3==0) flg=1;
chang_m();
for(g=0;g<100;){delays1(100);g++;}
if(k2==0)
{do
{
Display_One_Char(1,10,'S');
if(k3==0) flg=1;
chang_s();
}while(flg==0);
}
}while(flg==0);
}
}while(flg==0);flg=0;
write_lcd_command(0x01);
}
for(g=0;g<500;){delays1(100);g++;}
} while(flg==0);flg=0;
}
/*************檢測*******************/
if(k1==0)
{
write_lcd_command(0x01);
do
{
if(k3==0) flg=1;
data_temp=ADconv();
stor[0]=data_temp;
xs_int(196*data_temp,1);
}while(flg==0);flg=0;
}
/***************存儲****************/
if(k2==0)
{
write_lcd_command(0x01); //清屏
do
{
if(k3==0) flg=1;
for(i=0;i<3;)
{
// i2c_write(0x00+i,0x63+i/*要存的數據*/);
i2c_write(0x00+i,stor[0]/*要存的數據*/);
i++;
}
_nop_();
i=0;
for(i=0;i<3;)
{
dd=i2c_read(0x00+i);/*讀地址數據*/
show[i]=dd;
i++;
}
Display_List_Char(1,0,show);
}while(flg==0);flg=0;
for(g=0;g<500;){delays1(100);g++;}
}
/***************************************/
}
}
}
二:液晶顯示程序
#include<reg52.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define LCDPORT P0
sbit RS=P2^6; //RS數據命令選擇端,高電平數據,低電平命令
sbit RW=P2^7; //RW讀寫選擇端,高電平讀操作,低電平寫操作
sbit EN=P2^0; //EN使能控制端,E高電平跳變為低電平時LCD執行命令
uchar LCD_Code2[] ="Welcome:";
uchar LCD_Code[] ="0123456789ABCDEF-.";
/******************************LCD1602驅動程序*************************************/
void lcd_delay(uchar delaytime)
{
while(delaytime)delaytime--;
}
void write_lcd_command(uchar write_command)
{
lcd_delay(40);
RS=0;
RW=0;
LCDPORT=write_command;
EN=1;
EN=0;
}
void write_lcd_data(uchar write_data)
{
lcd_delay(40);
RS=1;
RW=0;
LCDPORT=write_data;
EN=1;
EN=0;
}
void Display_One_Char( uchar x,uchar y,uchar dat) //x表示行,y表示列
{
switch(x)
{
case 0:
write_lcd_command(0x80+y);
break;
case 1:
write_lcd_command(0xc0+y);
break;
}
write_lcd_data(dat);
}
void Display_List_Char(uchar x,uchar y,uchar *str)
{
switch(x)
{
case 0:
write_lcd_command(0x80+y);
break;
case 1:
write_lcd_command(0xc0+y);
break;
}
while (*str!='\0')
{
write_lcd_data(*str);
str++;
}
}
void xs_int(unsigned int shuju,bit t) //顯示一個數字
{unsigned char huancun[6]={0};
unsigned char biaozhi=0,i;
if (shuju < 10) biaozhi = 1;
else if(shuju < 100) biaozhi = 2;
else if(shuju < 1000) biaozhi = 3;
else if(shuju < 10000) biaozhi = 4;
else if(shuju < 65535) biaozhi = 5;
switch(biaozhi)
{case 5:huancun[5] = shuju/10000;
case 4:huancun[3] = shuju%10000/1000;
case 3:huancun[2] = shuju%1000/100;
case 2:huancun[1] = shuju%100/10;
case 1:huancun[0] = shuju%10;
break;
default:break;
}
for(i=6;i>1;i--)
{if(i==5)Display_One_Char(1,10,'.');
else Display_One_Char(t,15-i,0x30+huancun[i-1]); }
Display_One_Char(t,15,'V');
}
void initial_lcd1602(void) //初始化LCD1602
{
uchar i;
EN=0;
for(i=200;i>0;i--)
lcd_delay(248);
write_lcd_command(0x38); //0x38命令,雙行顯示,顯示5x7的點陣字符
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x38); //再寫一次0x38命令,雙行顯示,顯示5x7的點陣字符
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x0c); //無光標,不閃爍
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x06); //光標右移,文字不移動
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x01); //清屏
for(i=4;i>0;i--)
lcd_delay(248);
}
三:存儲程序
#include<reg52.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define LCDPORT P0
sbit RS=P2^6; //RS數據命令選擇端,高電平數據,低電平命令
sbit RW=P2^7; //RW讀寫選擇端,高電平讀操作,低電平寫操作
sbit EN=P2^0; //EN使能控制端,E高電平跳變為低電平時LCD執行命令
uchar LCD_Code2[] ="Welcome:";
uchar LCD_Code[] ="0123456789ABCDEF-.";
/******************************LCD1602驅動程序*************************************/
void lcd_delay(uchar delaytime)
{
while(delaytime)delaytime--;
}
void write_lcd_command(uchar write_command)
{
lcd_delay(40);
RS=0;
RW=0;
LCDPORT=write_command;
EN=1;
EN=0;
}
void write_lcd_data(uchar write_data)
{
lcd_delay(40);
RS=1;
RW=0;
LCDPORT=write_data;
EN=1;
EN=0;
}
void Display_One_Char( uchar x,uchar y,uchar dat) //x表示行,y表示列
{
switch(x)
{
case 0:
write_lcd_command(0x80+y);
break;
case 1:
write_lcd_command(0xc0+y);
break;
}
write_lcd_data(dat);
}
void Display_List_Char(uchar x,uchar y,uchar *str)
{
switch(x)
{
case 0:
write_lcd_command(0x80+y);
break;
case 1:
write_lcd_command(0xc0+y);
break;
}
while (*str!='\0')
{
write_lcd_data(*str);
str++;
}
}
void xs_int(unsigned int shuju,bit t) //顯示一個數字
{unsigned char huancun[6]={0};
unsigned char biaozhi=0,i;
if (shuju < 10) biaozhi = 1;
else if(shuju < 100) biaozhi = 2;
else if(shuju < 1000) biaozhi = 3;
else if(shuju < 10000) biaozhi = 4;
else if(shuju < 65535) biaozhi = 5;
switch(biaozhi)
{case 5:huancun[5] = shuju/10000;
case 4:huancun[3] = shuju%10000/1000;
case 3:huancun[2] = shuju%1000/100;
case 2:huancun[1] = shuju%100/10;
case 1:huancun[0] = shuju%10;
break;
default:break;
}
for(i=6;i>1;i--)
{if(i==5)Display_One_Char(1,10,'.');
else Display_One_Char(t,15-i,0x30+huancun[i-1]); }
Display_One_Char(t,15,'V');
}
void initial_lcd1602(void) //初始化LCD1602
{
uchar i;
EN=0;
for(i=200;i>0;i--)
lcd_delay(248);
write_lcd_command(0x38); //0x38命令,雙行顯示,顯示5x7的點陣字符
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x38); //再寫一次0x38命令,雙行顯示,顯示5x7的點陣字符
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x0c); //無光標,不閃爍
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x06); //光標右移,文字不移動
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x01); //清屏
for(i=4;i>0;i--)
lcd_delay(248);
}
四:AD轉換程序
#include"reg52.h"
#include<intrins.h>
//******************adc0832****************************//
sbit CS=P3^1; //使能。
sbit CLK=P3^2;//時鐘
sbit Do=P3^3; // 數據輸出
sbit Di=P3^3;//數據輸入
unsigned char CH=0x02;
//通道的選擇:0x02就是單通道0;0x03就是單通道1;
//0x00就是雙通道ch0=“+”; ch0=“-”
//0x01就是雙通道ch0=“-”; ch0=“+”
//*****************************************************//
unsigned char ADconv(void)
{unsigned char i;
unsigned int data_f=0,data_c=0;
Di=1;
CS=1;
_nop_();
CS=0;
Di=1; ;//芯片使能之前的初始化。第一個下降沿
CLK=1;
_nop_();
_nop_();
/****************************************/
CLK=0; // 確定通道模式、第2個下降沿
_nop_();
_nop_();
CLK=1;
Di=(bit)(0x02&CH); //設定通道初始化
_nop_();
CLK=0;
_nop_();
_nop_();
CLK=1;
Di=(bit)(0x01&CH); //設定通道初始化 .第3個下降沿
_nop_();
_nop_();
CLK=0; //AD轉化的初始化完成。
Di=1;
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
CLK=1;
for(i=8;i>0;i--)//得到一個正常排序的8位數據
{
data_f|=Do;
data_f<<=1;
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
}
for(i=8;i>0;i--)//得到一個反序排列的8位數據
{
data_c<<=1;
data_c|=Do;
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
}
CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
CS=1;
_nop_();
_nop_();
return data_f;
}
五:時鐘程序
#include <reg52.h>
#include <stdio.h>
sbit DS1302_CLK = P3^5;
sbit DS1302_IO = P3^6;
sbit DS1302_RST = P3^7;
uchar lcd_dat[]={" 2009-09-26 6"};
uchar lcd_time[]={"21:50:33"};
uchar wr_data[8]={0x09,0x09,0x26,0x06,0x22,0x59,0x50};
uchar readtimeR[8];
void delays(uint n)
{
while(n--);
}
/*****************************************************************************
函數功能:寫DS1302一個字節子程序
入口參數:
出口參數:
*****************************************************************************/
void sendbyte(uchar a)
{
uchar i,temp;
temp=a;
for(i=8;i>0;i--)
{
if(temp&0x01) //先發低位
DS1302_IO=1;
else
DS1302_IO=0;
temp=temp>>1;
DS1302_CLK=1;
delays(5);
DS1302_CLK=0;
delays(5);
}
}
/*****************************************************************************
函數功能:讀DS1302一個字節子程序
入口參數:
出口參數:
*****************************************************************************/
uchar readbyte(void)
{
uchar i,dat=0;
for(i=8;i>0;i--)
{
DS1302_IO=1;
dat>>=1;
if(DS1302_IO)
dat|=0x80;
DS1302_CLK=1;
delays(5);
DS1302_CLK=0;
}
return dat;
}
/*uchar readbyte(void)
{
uchar i;
uchar ucdat=0;
for(i=8;i>0;i--)
{
DS1302_IO=1;
ucdat>>=1;
if(DS1302_IO)ucdat|=0x80;
DS1302_CLK=1;
delays(2);
DS1302_CLK=0;
}
return(ucdat);
}*/
/*****************************************************************************
函數功能:寫DS1302地址子程序
入口參數:add
入口數據:dat
*****************************************************************************/
void write_DS1302(uchar address,uchar dat)
{
DS1302_RST=0;
delays(10);
DS1302_CLK=0;
delays(10);
DS1302_RST=1;
delays(5);
sendbyte(address);
delays(5);
sendbyte(dat);
DS1302_RST=0;
DS1302_CLK=0;
}
/*****************************************************************************
函數功能:讀DS1302地址子程序
入口參數:add
出口參數:readtimeR[]
*****************************************************************************/
uchar read_DS1302(uchar address)
{
uchar timer;
DS1302_RST=0;
delays(2);
DS1302_CLK=0;
delays(2);
DS1302_RST=1;
sendbyte(address);
timer=readbyte();
DS1302_RST=0;
DS1302_CLK=0;
return timer;
}
/*uchar read_DS1302(uchar addr)
{
uchar timedata;
DS1302_RST=0;
delays(2);
DS1302_CLK=0;
delays(2);
DS1302_RST=1;
sendbyte(addr);
timedata=readbyte();
DS1302_CLK=1;
delays(2);
DS1302_RST=0;
return(timedata);
} */
/*****************************************************************************
函數功能:初始化DS1302子程序
入口參數:wr_data[](全局變量)
出口參數:
*****************************************************************************/
void DS1302_init()
{
write_DS1302(0xbe,0x00);
write_DS1302(0x8e,0x00); //關閉保護,若寫0x80,則開啟保護
write_DS1302(0x8c,wr_data[0]); //年
write_DS1302(0x88,wr_data[1]); //月
write_DS1302(0x86,wr_data[2]); //日
write_DS1302(0x8A,wr_data[3]); //星期
write_DS1302(0x84,wr_data[4]); //時
write_DS1302(0x82,wr_data[5]); //分
write_DS1302(0x80,wr_data[6]); //秒
write_DS1302(0x8e,0x80);
}
/*****************************************************************************
函數功能:讀DS1302時間子程序
入口參數:
出口參數:全局變量(year,mouth,data,day,hour,minute,second)
*****************************************************************************/
void read_time(void)
{
readtimeR[0]=read_DS1302(0x8d); //年
readtimeR[1]=read_DS1302(0x89); //月
readtimeR[2]=read_DS1302(0x87); //日
readtimeR[3]=read_DS1302(0x8b); //周
readtimeR[4]=read_DS1302(0x85); //時
readtimeR[5]=read_DS1302(0x83); //分
readtimeR[6]=read_DS1302(0x81); //秒
}
void showdata()
{
read_time();
lcd_dat[3]=(readtimeR[0]>>4)+0x30;
lcd_dat[4]=(readtimeR[0]&0x0f)+0x30;
lcd_dat[6]=(readtimeR[1]>>4)+0x30;
lcd_dat[7]=(readtimeR[1]&0x0f)+0x30;
lcd_dat[9]=(readtimeR[2]>>4)+0x30;
lcd_dat[10]=(readtimeR[2]&0x0f)+0x30;
lcd_dat[14]=(readtimeR[3]&0x0f)+0x30;
lcd_time[0]=(readtimeR[4]>>4)+0x30;
lcd_time[1]=(readtimeR[4]&0x0f)+0x30;
lcd_time[3]=(readtimeR[5]>>4)+0x30;
lcd_time[4]=(readtimeR[5]&0x0f)+0x30;
lcd_time[6]=(readtimeR[6]>>4)+0x30;
lcd_time[7]=(readtimeR[6]&0x0f)+0x30;
}
我想百度了一下,他說幾個子程序要放到同一個子目錄下才行,而后面的未定義警告是由于前面的幾個報錯造成的,我想求解具體的解決辦法。 |
|