简易PROTUES的定时器仿真
仿真示意圖:
?單片機程序:
#include ?<REG51.H>
#include ?<intrins.h>
#include ?<math.h>
#define ? uchar unsigned char
#define ? uint unsigned int
sbit RS=P2^6;
sbit E=P2^7;
sbit key0=P2^0;
sbit key1=P2^3;
sbit pluse=P3^2;
float data_ad;
float time_0;
float distance=1000;
float speed=0;
unsigned char count; ? //定義變量統計中斷累計次數
float s,m,h; ? //定義變量儲存秒、分鐘和小時
uchar FirstFlag;
void shuchu(void);
void _delay_ms(uchar z)
{
? uint x,y;
? for(x=z;x>0;x--)
? ? for(y=110;y>0;y--);
}
void wr_commamd_lcd1602( uchar data_lcd1602)
{ ? ??
? E=0;
? RS=0;
? P0=data_lcd1602;
? E=1;
? E=0;
? _delay_ms(15);
}
void wr_data_lcd1602( uchar data_lcd1602)
{
? E=0;
? RS=1;
? P0=data_lcd1602;
? E=1;
? E=0;
? _delay_ms(10);
}
void lcd1602_init( )
{
? wr_commamd_lcd1602(0x01);
? wr_commamd_lcd1602(0x02);
? wr_commamd_lcd1602(0x06);
? wr_commamd_lcd1602(0x0F);
? wr_commamd_lcd1602(0x14);
? wr_commamd_lcd1602(0x3c);
? wr_commamd_lcd1602(0xc0);
}
void init_timer()
{
? ? TMOD=0x01; ? ? ? ? ? ? ? ?//使用定時器T0的模式1
?? ?TH0=0XFC; ? ?//定時器T0的高8位設置初值
?? ?TL0=0X18; ? ?//定時器T0的低8位設置初值
?? ?EA=1; ? ? ? ? ? ? ? ? ? ? //開總中斷
?? ?ET0=1; ? ? ? ? ? ? ? ? ? ?//定時器T0中斷允許
?? ?TR0=1; ? ? ? ? ? ? ? ? ? ?//啟動定時器T0
?? ?EX0=1;
?? ?count=0; ? ? ? ? ? ? ?//中斷次數初始化為0
?? ?s=0; ? ? ? ? ? ? ? ? ?//秒初始化為0
?? ?m=0; ? ? ? ? ? ? ? ? ?//分鐘初始化為0
?? ?h=0; ? ? ? ? ? ? ? ? ?//小時初始化為0
}
void main( )
{?
? uchar data_test=123;
? uint ?flag1;
? flag1=0;
? key0=0;
? key1=0;
? init_timer();
? lcd1602_init( );//液晶初始化
? while(1)
? {?
}
}
?void shuchu()
?{
?uint ?i,j;
?? ? ?time_0=m+s/1000;
?? ? ? speed=(distance/time_0);
? ? ? wr_commamd_lcd1602(0xc0);//設定光標位置
? ? ? wr_data_lcd1602('T');//D
? ? ? wr_data_lcd1602('=');//=
? ? ?
?? ? i=time_0/1;
? ? ? wr_data_lcd1602(0x30+i);//整數 ?1.234
? ? ? wr_data_lcd1602('.');//小數點
? ? ? i=time_0*10;
? ? ? i=i%10;
? ? ? wr_data_lcd1602(0x30+i);//0.1
? ? ? i=time_0*100;
? ? ? i=i%10;
? ? ? wr_data_lcd1602(0x30+i);//0.01
? ? ? i=speed*1000;
? ? ? i=i%10;
? ? ? wr_data_lcd1602(0x30+i);//0.001 ?
? ? ??
// ? ? ?wr_data_lcd1602(0x00);//空格
? ? ? //wr_data_lcd1602(0x00);//空格
? ? ? wr_data_lcd1602('v');//v
? ? ? wr_data_lcd1602('=');//=
? ? ? j=(int)speed/1000;
? ? ? wr_data_lcd1602(0x30+j);//整數 ?1.234
?? ? ?i=((int)speed/100)%10;
?? ? ?wr_data_lcd1602(0x30+i);//整數 ?1.234
?? ? ?i=((int)speed/10)%10;
?? ? ?wr_data_lcd1602(0x30+i);//整數 ?1.234
?? ? ?i=((int)speed%10);
?? ? ?wr_data_lcd1602(0x30+i);//整數 ?1.234
? ? ? wr_data_lcd1602('.');//小數點
? ? ? i=speed*10;
? ? ? i=i%10;
? ? ? wr_data_lcd1602(0x30+i);//0.1
? ? ? i=speed*100;
? ? ? i=i%10;
? ? ? wr_data_lcd1602(0x30+i);//0.01
// ? ? ?i=speed*1000;
// ? ? ?i=i%10;
// ? ? ?wr_data_lcd1602(0x30+i);//0.001 ?
}
void T() ?interrupt 0
{
? ?FirstFlag++;
? ?while(pluse==0);
? ?if(FirstFlag >= 2)
?? ?{
?? ??? ?FirstFlag = 0;
?? ??? ?shuchu();
?? ??? ?}
}
/*******************************************************
函數功能:定時器T0的中斷服務函數
********************************************************/
?void Time0(void ) interrupt 1 using 1 //定時器T0的中斷編號為1,使用第1組工作寄存器
? {
? if(FirstFlag == 1)
?? ?{
?? ??? ? ? ? ? ?s++; ? ? ?//秒加1?? ??? ??? ??? ??
?? ??? ? ?if(s==1000) ? //如果計滿60秒
?? ??? ??? ? {
?? ??? ??? ? ?s=0; ? ? //秒清0
?? ??? ??? ? ?m++; ? ? //分鐘加1
?? ??? ? ? ?}
?? ? ??? ?if(m==60) ? ?//如果計滿60分
?? ??? ? ? {
?? ??? ??? ? ? m=0; ? //分鐘清0?
//?? ??? ??? ? ? h++; ? ?//小時加1
?? ??? ? ? ?}
//?? ? ? ? if(h==99) ?//如果計滿24小時
//?? ??? ? ? {
//?? ??? ??? ? ? h=0; ? //小時清0
//?? ??? ? ? }
?? ? ? TH0=0XFC; ? //定時器T0高8位重新賦初值
?? ??? ?TL0=0X18; ? //定時器T0低8位重新賦初值?? ??? ?
? } ?
?? ? }
想要源文件請到資料中下載(名稱定時器仿真)
總結
以上是生活随笔為你收集整理的简易PROTUES的定时器仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word vba 控制光标常用代码
- 下一篇: Numpy学习---Task03---数