|
程序如下,原理圖在附件里,運行的結(jié)果是說需要函數(shù)原型,問題在程序中加了表情的地方,本人c不精通,望大神們指導(dǎo)一下該怎么修改
#include <reg52.h> //調(diào)用單片機頭文件
#define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
#define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
uchar d_miao,d_fen = 0,d_shi;
uchar flag_bai_hei; //白天的晚上的標志位
uchar value;
uint bai_3l_price = 60; //白天3千米內(nèi)的單價 6元
uint bai_3w_price = 18; //白天3千米外的單價/千米 1.8元
uint bai_wait_price = 5; //白天等待時的單價/分鐘 0.5元
uint wan_3l_price = 70; //晚上3千米內(nèi)的單價/千米 7元
uint wan_3w_price = 22; //晚上3千米外的單價/千米 2.2元
uint wan_wait_price = 10; //晚上等待時的單價/分鐘 1元
uint distance = 0; //行使的距離
uint zong_jia; //總的價
bit flag_200ms = 0;
bit flag_1s ;
bit flag_time_en = 0;
uchar flag_time_xs = 1; //顯示時間和等待時間切換
sbit beep = P3^7; //蜂鳴器IO口定義
uchar i;
sbit clk = P1^3; //ds1302時鐘線定義
sbit io = P1^4; //數(shù)據(jù)線
sbit rst = P1^5; //復(fù)位線
//秒 分 時 日 月 年 星期
uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a}; //寫地址
uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b}; //讀地址
uchar code init_ds[] ={0x55,0x17,0x15,0x01,0x05,0x15,0x13};
uchar idata miao,fen,shi,ri,yue,week,nian;
uchar t1_num,t2_num; //計時間中斷的次數(shù)
unsigned long speed1,juli,time2;
float f_hz,speed_km,speed_m;
uchar TH11,TL11;
uchar flag_en; //開始計算速度使能
uchar flag_stop_en; //要確定車子是否停下了
uint juli_s; //每秒走的距離
uint juli_z; //總路程
float zhijing = 0.75; //直徑 0.55M
bit flag_1s = 1; //1s
uchar menu_1; //菜單設(shè)置變量
uchar menu_2; //菜單設(shè)置變量
uint shudu; //定義速度的變量
uint bj_shudu = 80; //報警速度
uchar flag_ds_en;
long zong_lc; //總量程
#include "lcd1602.h"
/***********************1ms延時函數(shù)*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
#include "iic.h"
void write_iic_data()
{
write_24c02(0,flag_bai_hei);
write_24c02(1,bai_3l_price % 256); //保存數(shù)據(jù)
write_24c02(2,bai_3l_price / 256); //保存數(shù)據(jù)
write_24c02(3,bai_3w_price % 256); //保存數(shù)據(jù)
write_24c02(4,bai_3w_price / 256); //保存數(shù)據(jù)
write_24c02(5,bai_wait_price % 256); //保存數(shù)據(jù)
write_24c02(6,bai_wait_price / 256); //保存數(shù)據(jù)
write_24c02(7,wan_3l_price % 256); //保存數(shù)據(jù)
write_24c02(8,wan_3l_price / 256); //保存數(shù)據(jù)
write_24c02(9,wan_3w_price % 256); //保存數(shù)據(jù)
write_24c02(10,wan_3w_price / 256); //保存數(shù)據(jù)
write_24c02(11,wan_wait_price % 256); //保存數(shù)據(jù)
write_24c02(12,wan_wait_price / 256); //保存數(shù)據(jù)
}
/****************讀出來保存的數(shù)據(jù)**********************/
void read_iic_data()
{
flag_bai_hei = read_24c02(0);
bai_3l_price = read_24c02(2);
bai_3l_price = bai_3l_price * 256 + read_24c02(1);
bai_3w_price = read_24c02(4);
bai_3w_price = bai_3w_price * 256 + read_24c02(3);
bai_wait_price = read_24c02(6);
bai_wait_price = bai_wait_price * 256 + read_24c02(5);
wan_3l_price = read_24c02(8);
wan_3l_price = wan_3l_price * 256 + read_24c02(7);
wan_3w_price = read_24c02(10);
wan_3w_price = wan_3w_price * 256 + read_24c02(9);
wan_wait_price = read_24c02(12);
wan_wait_price = wan_wait_price * 256 + read_24c02(11);
}
/********************獨立按鍵程序*****************/
uchar key_can; //按鍵值
void key() //獨立按鍵程序
{
static uchar key_new;
key_can = 20; //按鍵值還原
P3 |= 0x78; //對應(yīng)的按鍵IO口輸出為1
if((P3 & 0x78) != 0x78) //按鍵按下
{
delay_1ms(1); //按鍵消抖動
if(((P3 & 0x78) != 0x78) && (key_new == 1))
{ //確認是按鍵按下
key_new = 0;
switch(P3 & 0x78)
{
case 0x70: key_can = 1; break; //得到按鍵值
case 0x68: key_can = 2; break; //得到按鍵值
case 0x58: key_can = 3; break; //得到按鍵值
case 0x38: key_can = 4; break; //得到按鍵值
}
beep = 0;
delay_1ms(50);
beep = 1;
}
}
else
key_new = 1;
}
/*************寫一個數(shù)據(jù)到對應(yīng)的地址里***************/
void write_ds1302(uchar add,uchar dat)
{
rst = 1; //把復(fù)位線拿高
for(i=0;i<8;i++)
{ //低位在前
clk = 0; //時鐘線拿低開始寫數(shù)據(jù)
io = add & 0x01;
add >>= 1; //把地址右移一位
clk = 1; //時鐘線拿高
}
for(i=0;i<8;i++)
{
clk = 0; //時鐘線拿低開始寫數(shù)據(jù)
io = dat & 0x01;
dat >>= 1; //把數(shù)據(jù)右移一位
clk = 1; //時鐘線拿高
}
rst = 0; //復(fù)位線合低
clk = 0;
io = 0;
}
/*************從對應(yīng)的地址讀一個數(shù)據(jù)出來***************/
uchar read_ds1302(uchar add)
{
uchar value,i;
rst = 1; //把復(fù)位線拿高
for(i=0;i<8;i++)
{ //低位在前
clk = 0; //時鐘線拿低開始寫數(shù)據(jù)
io = add & 0x01;
add >>= 1; //把地址右移一位
clk = 1; //時鐘線拿高
}
for(i=0;i<8;i++)
{
clk = 0; //時鐘線拿低開始讀數(shù)據(jù)
value >>= 1;
if(io == 1)
value |= 0x80;
clk = 1; //時鐘線拿高
}
rst = 0; //復(fù)位線合低
clk = 0;
io = 0;
return value; //返回讀出來的數(shù)據(jù)
}
/*************把要的時間 年月日 都讀出來***************/
void read_time()
{
miao = read_ds1302(read_add[0]); //讀秒
fen = read_ds1302(read_add[1]); //讀分
shi = read_ds1302(read_add[2]); //讀時
ri = read_ds1302(read_add[3]); //讀日
yue = read_ds1302(read_add[4]); //讀月
nian = read_ds1302(read_add[5]); //讀年
week = read_ds1302(read_add[6]); //讀星期
}
/*************把要寫的時間 年月日 都寫入ds1302里***************/
void write_time()
{
write_ds1302(write_add[0],miao); //寫秒
write_ds1302(write_add[1],fen); //寫分
write_ds1302(write_add[2],shi); //寫時
write_ds1302(write_add[3],ri); //寫日
write_ds1302(write_add[4],yue); //寫月
write_ds1302(write_add[5],nian); //寫星期
write_ds1302(write_add[6],week); //寫年
}
/**********************設(shè)置ds1302時間函數(shù)**********************/
void set_ds1302time(uchar num,uchar *shi,uchar dat) //調(diào)時
{
if(num == 1)
{
*shi+=0x01;
if((*shi & 0x0f) >= 0x0a)
*shi = (*shi & 0xf0) + 0x10;
if(*shi >= dat)
*shi = 0;
}
else
{
if(*shi == 0x00)
*shi = dat;
if((*shi & 0x0f) == 0x00)
*shi = (*shi | 0x0a) - 0x10;
*shi -=0x01 ;
}
}
#include "menu.h"
/*********************對應(yīng)菜單內(nèi)的處理函數(shù)******************/
void menu_dis()
{
if(menu_1 == 0)
{
if(key_can == 2) //清零 從新計價
{
flag_time_en = 0;
d_shi = 0;
d_fen = 0;
flag_ds_en = 0;
}
if(key_can == 4) //時間和等待的時間的切換
{
flag_time_xs ++; //為1顯示當(dāng)前時間
if(flag_time_xs > 2)
flag_time_xs = 0;
if(flag_time_xs == 0) //顯示時間
{
write_string(1,0," : : W: ");
write_string(2,0," 20 - - ");
}
}
if(flag_200ms == 1)
{
if(distance <= 30)//3公里內(nèi)的價格
{
if(flag_bai_hei == 0)
{
if((d_fen == 0) && (d_miao <= 10))
zong_jia = bai_3l_price;
else
zong_jia = bai_3l_price + (d_shi * 60*60 + d_fen*60 + d_miao) * bai_wait_price -bai_wait_price*10;
}
else
{
if((d_fen == 0) && (d_miao <= 10))
zong_jia = wan_3l_price;
else
zong_jia = wan_3l_price + (d_shi * 60*60 + d_fen*60 + d_miao) * wan_wait_price -bai_wait_price*10;
}
}else //3公里外的價格
{
if(flag_bai_hei == 0)
{
if((d_fen == 0) && (d_miao <= 10))
zong_jia = bai_3l_price + bai_3w_price * (distance - 30) / 10 ;
else
zong_jia = bai_3l_price + bai_3w_price * (distance - 30) / 10 + (d_shi * 60*60 + d_fen*60 + d_miao) * bai_wait_price -bai_wait_price*10;
}
else
{
if((d_fen == 0) && (d_miao <= 10))
zong_jia = wan_3l_price + wan_3w_price * (distance - 30) / 10 ;
else
zong_jia = wan_3l_price + wan_3w_price * (distance - 30) / 10 + (d_shi * 60*60 + d_fen*60 + d_miao) * wan_wait_price -bai_wait_price*10;
}
}
if(flag_time_xs == 1) //顯示當(dāng)前的時間
{
write_sfm2_ds1302(2,0,shi); //顯示時
write_data(':');
write_sfm2_ds1302(2,6,miao); //顯示秒
write_sfm4(2,10,zong_jia);
write_sfm2(1,1,shudu);
write_sfm4(1,9,juli_z);
}
else if(flag_time_xs == 2) //顯示等待時間
{
write_sfm2(2,1,d_fen); //顯示分
write_data(':');
write_sfm2(2,4,d_miao); //顯示秒
write_sfm2(1,1,shudu);
write_sfm4(1,9,juli_z);
}
else //顯示當(dāng)前的時間
{
write_sfm2_ds1302(1,2,shi); //顯示時
write_sfm2_ds1302(1,5,fen); //顯示分
write_sfm2_ds1302(1,8,miao); //顯示秒
write_sfm1(1,14,week); //顯示星期
write_sfm2_ds1302(2,6,yue); //顯示月
write_sfm2_ds1302(2,9,ri); //顯示日
}
}
}
}
/*******************停車計時函數(shù) *****************/
void jishu_chashu()
{
if((flag_1s == 1) && (flag_time_en == 1))
{
if(flag_ds_en == 1)
{
d_miao++; //秒鐘加1
if(d_miao >= 60)
{
d_miao = 0;
d_fen ++; //分鐘加1
if(d_fen >= 60)
{
d_fen = 0;
d_shi++;
if(d_shi >= 24)
{
d_shi = 0;
}
}
}
}
}
}
/*************定時器0初始化程序***************/
void time_init()
{
EA = 1; //開總中斷
TMOD = 0X11; //定時器0、工作方式1
ET0 = 1; //開定時器0中斷
TR0 = 1; //允許定時器0定時
ET1 = 1; //開定時器1中斷
TR1 = 1; //允許定時器1定時
}
/***********外部中斷0初始化程序****************/
void init_int0()
{
EX0=1; //允許外部中斷0中斷
EA=1; //開總中斷
IT0 = 1; //外部中斷0負跳變中斷
}
/***********計算速度函數(shù)**************/
void shudu_dis() //計算速度函數(shù)
{
static uchar value,value1;
if(menu_1 == 0)
{
if(flag_1s == 1)
{
flag_1s = 0;
if(flag_en == 0)
{
value ++;
if(value >= 3) //2秒
{
speed_km = 0; //速度為0
shudu = (uint)speed_km;
value = 0;
flag_time_en = 1;
}
}
if((flag_en == 1))
{
value = 0;
flag_en = 0;
//1s = 1 / 1000000us; // 1m/s=0.001km除以1/3600h=3.6km/h
f_hz =(t2_num * 65536.0 + TH11 * 256 + TL11) / 1000000; //算出來就是秒
speed_m = f_hz * zhijing * 3.14 ; //算出來的是m/s
juli_z = (juli_z + (uint)speed_m) ; //總路程m
speed_km = speed_m * 3.6 ; //(帶個小數(shù)點) km/s
shudu = (uint)speed_km;
zong_lc += speed_m;
distance = juli_z;
value1++;
flag_time_en = 0;
}
}
}
}
/******************主函數(shù)*******************/
void main()
{
P0 = P1 = P2 = P3 = 0XFF; //讓IO口全部輸出高電平
init_1602(); //初始化1602液晶
init_1602_dis_csf(); //初始化1602液晶顯示
read_iic_data(); //把保存的數(shù)據(jù)讀出來
time_init(); //定時器初始化
init_int0();
while(1)
{
key(); //按鍵程序
menu_dis();
if(key_can < 20)
key_with();
shudu_dis(); //計算速度函數(shù)
if(flag_200ms == 1)
{
flag_200ms = 0;
if(menu_1 == 0)
read_time(); //讀時間
if((shi >= 0x21) || (shi <= 5))
flag_bai_hei = 1; //晚上模式
else
flag_bai_hei = 0; //白天模式
}
}
}
/*************定時器0中斷服務(wù)程序***************/
void time0_int() interrupt 1
{
static uchar value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 4 == 0)
flag_200ms = 1;
if(value >= 20)
{
flag_1s = 1;
value = 0;
jishu_chashu();
}
}
/*********************外部中斷0中斷服務(wù)程序************************/
void int0() interrupt 0
{
static uchar value;
switch(value)
{
case 0:
t1_num = 0; //第一次就把變量清零
TH1 = 0;
TL1 = 0;
break;
case 1:
t2_num = t1_num; //保存
TH11 = TH1;
TL11 = TL1;
flag_en = 1;
break;
}
value ++;
if(value >= 2)
value =0;
}
/*************定時器1中斷服務(wù)程序***************/
void time1_int() interrupt 3
{
t1_num++;
}
|
|