久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
看不懂這個單片機程序的中斷和計數(shù)初值
[打印本頁]
作者:
heicad
時間:
2016-3-11 22:20
標題:
看不懂這個單片機程序的中斷和計數(shù)初值
本帖最后由 heicad 于 2016-3-11 22:22 編輯
下面是一個51單片機的程序:中斷和計數(shù)初值這看不懂
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint num=0; //外部中斷次數(shù)
uchar num1=0;
uint Speed_dat=0;
uint Total_Dis=0;
uchar Beep_speed=40;
sbit KEY1=P3^5;
sbit KEY2=P3^6;
sbit KEY3=P3^7;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
#include"LCD1602.H"
#include"AT24C02.H"
void keyscan()
{
if(!KEY1)
{
delayms(5);
if(!KEY1)
{
if(Beep_speed<255)
Beep_speed++;
while(!KEY1);
}
}
else if(!KEY2)
{
delayms(5);
if(!KEY2)
{
if(Beep_speed>0)
Beep_speed--;
while(!KEY2);
}
}
else if(!KEY3)
{
delayms(5);
if(!KEY3)
{
Write_AT24C02_Byte(0,0);
Write_AT24C02_Byte(1,0);
Total_Dis=0;
dis_Mileage();
while(!KEY3);
}
}
}
void main()
{
uchar dat=0;
float M_dat=0.0;
init_1602();
Init_AT24C02();
dat=Read_AT24C02_Random(0);
Total_Dis=dat*256+Read_AT24C02_Random(1);
dis_Mileage();
TMOD=0X01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;
TR0=1;
IT0=1; //邊沿觸發(fā)中斷
EX0=1;
EA=1;
while(1)
{
if(num1>99)
{
num1=0;
M_dat+=(float)(Cur_Speed/3.60); //每0.1s走的米數(shù)
}
if(M_dat>1000.0) //路程每增加100m儲存一次
{
M_dat-=1000.0;
Total_Dis+=1;
Write_AT24C02_Byte(0,Total_Dis/256);
Write_AT24C02_Byte(1,Total_Dis%256);
dis_Mileage();
}
display();
keyscan();
}
}
void T0_time() interrupt 1 //定時器0
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(num<500)
num++;
else
Speed_dat=0;
if(num1<100)
num1++;
}
void ex_0() interrupt 0 //外部中斷0
{
Speed_dat=(500/num);
num=0;
}
#define uchar unsigned char
#define uint unsigned int
sbit EN=P2^7;
sbit RS=P2^5;
sbit RW=P2^6;
sbit BEEP=P2^0;
sbit LED1=P1^2;
sbit LED2=P1^3;
uchar LCD1602_Table[]="0123456789";
//LCD1602顯示標尺 //0123456789abcdef
uchar code DIS_TAB1[]={" Speed:---Km/h "};
uchar code DIS_TAB2[]={"M: Km---Km/h"};
uint sum_dat=0;
uchar Cur_Speed=0;
extern uint Speed_dat;
extern uint Total_Dis;
extern void delayms(uint xms);
void WRITE_LCD1602_DAT(uchar date)
{
EN=0;
RS=1;
P0=date;
EN=0;
delayms(5);
EN=1;
}
void WRITE_LCD1602_COM(uchar date)
{
EN=0;
RS=0;
P0=date;
EN=0;
delayms(5);
EN=1;
}
void init_1602()
{
unsigned char i;
RW=0;
WRITE_LCD1602_COM(0x38);
WRITE_LCD1602_COM(0x0c);
WRITE_LCD1602_COM(0x06);
WRITE_LCD1602_COM(0x01);
WRITE_LCD1602_COM(0x80);
for(i=0;i<16;i++)
WRITE_LCD1602_DAT(DIS_TAB1[i]);
WRITE_LCD1602_COM(0x80+0x40);
for(i=0;i<16;i++)
WRITE_LCD1602_DAT(DIS_TAB2[i]);
}
void display()
{
static uint dat=0;
static uchar i=0;
if(i<6)
{
i++;
sum_dat+=Speed_dat;
}
else
{
i=0;
dat=sum_dat/10;
sum_dat=0;
}
Cur_Speed=dat;
WRITE_LCD1602_COM(0x80+7);
if(dat/100>0)
WRITE_LCD1602_DAT(LCD1602_Table[dat%1000/100]);
else
WRITE_LCD1602_DAT(' ');
if(dat/10>0)
WRITE_LCD1602_DAT(LCD1602_Table[dat%100/10]);
else
WRITE_LCD1602_DAT(' ');
WRITE_LCD1602_DAT(LCD1602_Table[dat%10]);
WRITE_LCD1602_COM(0x80+9+0x40);
if(Beep_speed/100>0)
WRITE_LCD1602_DAT(LCD1602_Table[Beep_speed%1000/100]);
else
WRITE_LCD1602_DAT(' ');
if(Beep_speed/10>0)
WRITE_LCD1602_DAT(LCD1602_Table[Beep_speed%100/10]);
else
WRITE_LCD1602_DAT(' ');
WRITE_LCD1602_DAT(LCD1602_Table[Beep_speed%10]);
if(dat>Beep_speed)
{
if(i<3)
BEEP=0;
else
BEEP=1;
LED1=0;
LED2=1;
}
else
{
BEEP=1;
LED1=1;
LED2=0;
}
}
void dis_Mileage()
{
WRITE_LCD1602_COM(0x80+0x40+2);
if(Total_Dis/1000>0)
WRITE_LCD1602_DAT(LCD1602_Table[Total_Dis%10000/1000]);
else
WRITE_LCD1602_DAT(' ');
if(Total_Dis/100>0)
WRITE_LCD1602_DAT(LCD1602_Table[Total_Dis%1000/100]);
else
WRITE_LCD1602_DAT(' ');
WRITE_LCD1602_DAT(LCD1602_Table[Total_Dis%100/10]);
WRITE_LCD1602_DAT('.');
WRITE_LCD1602_DAT(LCD1602_Table[Total_Dis%10]);
}
#include<intrins.h>
#define AT24C02_OP_READ 0xa1 // AT24C02器件地址以及讀取操作
#define AT24C02_OP_WRITE 0xa0 // AT24C02器件地址以及寫入操作
//#define AT24C02_MAX_ADDR 0xff // AT24C02最大地址
//unsigned char code dis_code[]={0x7e,0xbd,0xdb,0x7e,0xdb,0xbd,0x7e,0xff};// 寫入到AT24C02的數(shù)據(jù)串
sbit AT24C02_SDA=P1^1;
sbit AT24C02_SCL=P1^0;
//sbit AT24C02_WP=P3^3; //寫保護 “=0”讀寫 “=1” 只讀
/*****************延時子程序***********************/
void Delay_1ms(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=122;j>0;j--);
}
/*****************24C02初始化子程序***********************/
void Init_AT24C02()
{
AT24C02_SDA=1; //總線空閑時,因各設備都是集電極或漏極開路,上拉電阻使SDA和SCL線都保持高電平。
// AT24C02_WP=1;
AT24C02_SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
/*****************24C02起始信號子程序***********************/
void AT24C02_Start()
{
AT24C02_SDA=1;
_nop_();
_nop_();
AT24C02_SCL=1;
_nop_();
_nop_();
AT24C02_SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
AT24C02_SCL=0;
}
/*****************24C02停止信號子程序***********************/
void AT24C02_Stop()
{
AT24C02_SDA=0;
_nop_();
_nop_();
AT24C02_SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
AT24C02_SDA=1;
_nop_();
_nop_();
}
/*****************24C02應答子程序***********************/
void AT24C02_ACK()
{
AT24C02_SDA=1; // 讀取應答
_nop_();
_nop_();
AT24C02_SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
while(AT24C02_SDA); //等待應答信號
AT24C02_SCL=0;
_nop_();
_nop_();
}
/*****************讀出24C02數(shù)據(jù)子程序***********************/
unsigned char Read_AT24C02_DATA()
{
unsigned char i,read_data;
for(i=0;i<8;i++)
{
AT24C02_SCL=1;
_nop_();_nop_();_nop_();_nop_();
read_data<<=1; //從高位到底位
read_data|=(unsigned char)AT24C02_SDA;
AT24C02_SCL=0;
_nop_();_nop_();_nop_();_nop_();
}
return(read_data);
}
/*****************寫入24C02數(shù)據(jù)子程序***********************/
void Write_AT24C02_DATA(unsigned char write_data)
{
unsigned char i;
for(i=0;i<8;i++) // 循環(huán)移入8個位
{
AT24C02_SDA=(bit)(write_data&0x80);
_nop_();
AT24C02_SCL=1;
_nop_();
_nop_();
AT24C02_SCL=0;
write_data<<=1;
}
}
/*****************字節(jié)寫入24C02數(shù)據(jù)子程序***********************/
void Write_AT24C02_Byte(unsigned char addr, unsigned char write_data) // 在指定地址addr處寫入數(shù)據(jù)write_data
{
AT24C02_Start(); //發(fā)起始命令
Write_AT24C02_DATA(AT24C02_OP_WRITE); //從機地址寫命令
AT24C02_ACK();
Write_AT24C02_DATA(addr); //發(fā)送AT24C02的字節(jié)地址
AT24C02_ACK();
Write_AT24C02_DATA(write_data); //發(fā)送數(shù)據(jù)到被尋址的存儲單元
AT24C02_ACK();
AT24C02_Stop(); //停止信號
Delay_1ms(10); //延時等待AT24C02內部數(shù)據(jù)的擦寫
}
unsigned char Read_AT24C02_Current()
// 在當前地址讀取
{
unsigned char read_data;
AT24C02_Start();
Write_AT24C02_DATA(AT24C02_OP_READ);
AT24C02_ACK();
read_data = Read_AT24C02_DATA();
AT24C02_Stop();
return read_data;
}
unsigned char Read_AT24C02_Random(unsigned char addr)
// 在指定地址讀取
{
AT24C02_Start();
Write_AT24C02_DATA(AT24C02_OP_WRITE);
AT24C02_ACK();
Write_AT24C02_DATA(addr);
AT24C02_ACK();
return(Read_AT24C02_Current());
}
復制代碼
作者:
heicad
時間:
2016-3-11 22:20
如果這個看不懂,你需要再繼續(xù)從基礎學起。
簡單地說如果不給定時器設定初值,他就從0開始計數(shù),如果給他一個初值,就從初值基礎上計數(shù),定時器計數(shù)滿后,會產(chǎn)生中斷。定時/計數(shù)器計數(shù)到0FFFFH(16進制)也就是65536計滿,(65536-1000)意思是從64536開始計數(shù),再加1000個機器周期,計數(shù)器滿,產(chǎn)生中斷。至于(65536-1000)/256,就是將256的倍數(shù)裝進定時器的高位寄存器,(65536-1000)%256,就是將256的余數(shù)裝進定時器的低位寄存器,因為51單片機是8位的,所以低位只能計數(shù)到255,再加1便產(chǎn)生進位。進到高8位中。如果你手工計算好以后,將倍數(shù)和余數(shù)分別賦值給TH、TL也是一樣。
作者:
heicad
時間:
2016-3-11 22:21
簡單地說如果不給定時器設定初值,他就從0開始計數(shù),如果給他一個初值,就從初值基礎上計數(shù),定時器計數(shù)滿后,會產(chǎn)生中斷。定時/計數(shù)器計數(shù)到0FFFFH(16進制)也就是65536計滿,(65536-1000)意思是從64536開始計數(shù),再加1000個機器周期,計數(shù)器滿,產(chǎn)生中斷。至于(65536-1000)/256,就是將256的倍數(shù)裝進定時器的高位寄存器,(65536-1000)%256,就是將256的余數(shù)裝進定時器的低位寄存器,因為51單片機是8位的,所以低位只能計數(shù)到255,再加1便產(chǎn)生進位。進到高8位中。如果你手工計算好以后,將倍數(shù)和余數(shù)分別賦值給TH、TL也是一樣。
作者:
heicad
時間:
2016-3-11 22:21
heicad 發(fā)表于 2016-3-11 22:20
如果這個看不懂,你需要再繼續(xù)從基礎學起。
簡單地說如果不給定時器設定初值,他就從0開始計數(shù),如果給 ...
那這個是測速,然后顯示出速度與里程,但我看不出它的半徑什么的設在哪里,能幫解釋一下嗎,中斷那個我問了同學,了解了不少。
作者:
735993584@qq.co
時間:
2017-4-3 21:27
同學,你好啊,你看懂了沒,求解釋。跟你一樣的問題
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
99热这里
|
欧美成人精品欧美一级乱黄
|
国产高清在线视频
|
欧美日韩高清在线
|
久久久综合视频
|
亚洲一区在线视频
|
a天堂视频
|
免费黄色网址在线观看
|
亚洲欧美视频在线观看
|
国产亚洲一区二区三区
|
欧美特黄一级片
|
久久成人免费视频
|
日韩视频免费观看
|
久久综合五月天
|
国产成人91
|
中日韩一级片
|
波多野结衣在线观看一区二区
|
美女毛片视频
|
天天躁日日躁狠狠躁伊人
|
在线看的av
|
a级片在线免费观看
|
天堂一区二区三区
|
伊人成人在线
|
久久久久久久久国产精品
|
国产伦精品一区二区三区免费视频
|
av片在线看
|
精品福利一区
|
九色在线视频
|
亚洲精品www久久久久久广东
|
男女啪啪免费视频
|
在线观看亚洲
|
四虎影院最新地址
|
亚洲激情视频
|
日本免费在线观看
|
亚洲综合伊人
|
香蕉视频一区
|
久久视频免费在线观看
|
www.日本黄色
|
久草国产视频
|
老司机免费福利视频
|
国产乱淫av
|