单片机 keil,下边程序里的.h文件怎么编写啊

单片机 keil,下边程序里的.h文件怎么编写啊,第1张

库函数的源码你是看不到的。要找实现的话得去百度。自带的都是编译好的东西(用到时直接调用)不是原C程序

至于sin()的实现。如果你学过高数应该知道泰勒展开。

不知道的话直接给你公式:sin(x)=x-(x^3)/3!+(x^5)/5!+(按这规律求和下去,x是弧度)

用一个for循环。要精确的话循环的次数多些就行

#include <reg51h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

#define LCM_Data P0

#define Busy 0x80

sbit RemPin = P3^2;

sbit TxPin = P3^4;

uint length = 0;

uchar flag = 0;

sbit Ceshi1 = P1^2;

sbit Ceshi2 = P1^3;

sbit Ceshi3 = P1^4;

sbit Ceshi4 = P1^5;

sbit P1_0 = P1^0;

sbit P1_1 = P1^1;

sbit P2_0 = P2^0;

sbit P2_1 = P2^1;

sbit P2_2 = P2^2;

sbit P2_3 = P2^3;

sbit P2_4 = P2^4;

sbit P2_5 = P2^5;

void DelayMs(uint Ms)

{

uint i,TempCyc;

for(i=0;i<Ms;i++)

{

TempCyc = 250;

while(TempCyc--);

}

}

void delay25us_40KHz(unsigned char us)

{

while(us--)

{

TxPin = 0;

_nop_();_nop_();

_nop_();_nop_();

_nop_();_nop_();

_nop_();_nop_();

_nop_();_nop_();

_nop_();

TxPin = 1;

_nop_();_nop_();

_nop_();_nop_();

}

TxPin = 1;

}

void init0int() interrupt 0

{

uint timer_us = 0;

TR0=0;

timer_us = TH0256+TL0;

if(timer_us>190)timer_us=timer_us-180;

length = ((unsigned long)(340)timer_us)/2000;

flag = 0;

EA = 0;

}

/===========================================================================

超出测量时间

=============================================================================/

void timer0int (void) interrupt 1

{

TR0=0;

length = 0;

flag = 1;

EA = 0;

}

/===========================================================================

主程序

=============================================================================/

void main(void)

{

EX0 = 1; //允许总中断中断,使能 INT0 外部中断

ET0 = 1; //接受timer0中断

TMOD=0x11; //设定T0为16位时器,设定T1为16位时器

Ceshi1=0;Ceshi2=0;

P2=0x00;

while(1)

{

if(length>3800) {Ceshi4=0;Ceshi3=0;Ceshi2=0;Ceshi1=0 ;}

if((length<=3800)&&(length>3000)) {Ceshi4=0;Ceshi3=0;Ceshi2=0;Ceshi1=1 ;}

if((length<=3000)&&(length>2000)) {Ceshi4=0;Ceshi3=0;Ceshi2=1;Ceshi1=0 ;}

if((length<=2000)&&(length>1000)) {Ceshi4=0;Ceshi3=0;Ceshi2=1;Ceshi1=1 ;}

if((length<=1000)&&(length>0)) {Ceshi4=0;Ceshi3=1;Ceshi2=0;Ceshi1=0 ;}

if(length==0){Ceshi1=0;Ceshi2=0;Ceshi4=0;Ceshi3=0;}

TH0=0x00;

TL0=0x00;

TR0=1; //启动定时器0

EA = 1; //允许所有中断

delay25us_40KHz(15); //发出脉冲信号

DelayMs(200);

if(P1_0==1) P2_0=1;

if(P1_1==1) P2_1=1;

if(P1_0==0) P2_0=0;

if(P1_1==0) P2_1=0;

if(Ceshi4==0&&Ceshi3==0&&Ceshi2==0&&Ceshi1==0) {P2_5=0;P2_4=0;P2_3=0;P2_2=0;}

if(Ceshi4==0&&Ceshi3==0&&Ceshi2==0&&Ceshi1==1) {P2_5=0;P2_4=0;P2_3=0;P2_2=1;}

if(Ceshi4==0&&Ceshi3==0&&Ceshi2==1&&Ceshi1==0) {P2_5=0;P2_4=0;P2_3=1;P2_2=0;}

if(Ceshi4==0&&Ceshi3==0&&Ceshi2==1&&Ceshi1==1) {P2_5=0;P2_4=0;P2_3=1;P2_2=1;}

if(Ceshi4==0&&Ceshi3==1&&Ceshi2==0&&Ceshi1==0) {P2_5=0;P2_4=1;P2_3=0;P2_2=0;}

}

}

//length就是测量的长度。。。。之前写的程序,你看一下,有什么问题再问我。

外部中断是指外部有中断源时执行相应的中断程序,主要是指INT0,INT1,通讯中断;内部中断主要是指定时器/计数器中断,装栈溢出后置位相关特殊寄存器来执行中断;以上是个人见识,不代表权威观点,欢迎同行高人指出不足和错误之处!

举一个例子,外部中断:你在吃饭,这时候电话响了,你暂时放下餐具去接听电话在这里吃饭是你目前正在执行的程序,电话响了,是一个中断源,他是随机的,不定时发生,接完电话(处理完中断事件)你回来继续吃,(继续执行中断点没有做处理完的程序)

内部中断:你正在吃饭,这时碗里的饭没有了,你要去盛饭,盛了饭回来继续吃,在这里吃饭依然是你目前正在处理的一个程序,碗里的饭没有了相当于是一个中断,这个中断是由你吃饭引起了,相当于系统中的标志位溢出;

以上为个人观点,不代表权威解答,欢迎同行指出不足和错误之处

数码管用8位一体的,共阴的。仿真图如下

程序如下

#include<reg51h>

#define uchar unsigned char

#define uint  unsigned int

sbit k1=P3^1;  //第一个按键,选择设置

uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阴数码管段码表

uchar disbuf[8]; //声明显示缓冲区8个单元

uchar hour=12;   //声明小时变量,初值为12

uchar minute=59; //声明分变量,初值为59

uchar second;    //声明秒变量

uchar t0n;       //定时器T0中断计数,定时50ms,中断20次为1秒

uchar dis;       //调时状态下,显示小数点

void delay()     //延时子程序,用于显示子程序

{

uint j;

for(j=300;j>0;j--);

}

//显示子程序,参数dis为显示小数点位

void display(uchar dis)

{

uchar j,disbit=0x01; //位码

for(j=0;j<8;j++)

{

P2=~disbit;       //P2口输出位码

if(dis>0&&dis==j) //调时状态下,显示小数点

P0=distab[disbuf[j]]+0x80; //在小时,分,秒位上显示小数点

else

P0=distab[disbuf[j]]; //其它位正常显示

disbit<<=1;           //取下一个位码

delay();              //延时

}

}

void main()

{

disbuf[2]=disbuf[5]=10;//数码管第3,6位显示-

TMOD=0x01;

TH0 =0x3C;    //单片机晶振频率=12M,定时50ms,时间常数=3CB0

TL0 =0xB0;

IE  =0x82;    //开定时器T0中断

TR0 =1;       //启动定时器T0

IT0 =1;       //设置外部中断为下降沿有效

IT1 =1;

while(1)

{

display(dis); //调显示子程序

if(k1==0)     //选择设置

{

dis++;    //停止计时,进入调时状态

EX0=1;    //调时状态下,允许外部INT0,INT1中断

EX1=1;    //用来调小时,分,秒

if(dis>7) //调小时,在小时位显示小数点

{

dis=0; //灭小数点

t0n=0; //调时结束,开始计时

TR0=1;

EX0=0; //关外部中断

EX1=0;

}

else if(dis==2)dis=4; //调分,在分位显示小数点

else if(dis==5)dis=7; //调秒,在秒位显示小数点

while(k1==0)display(dis); //等待按键释放

}

if(t0n>=20&&dis==0) //中断20次,1秒到,计时状态下时钟计时

{

t0n=0;

second++;      //秒加1

if(second>=60) //到60秒

{

second=0;

minute++;      //分加1

if(minute>=60) //到60分

{

minute=0;

hour++;    //小时加1

if(hour>=24)

hour=0;

}

}

}

disbuf[0]=hour/10;    //显示小时十位

disbuf[1]=hour%10;    //显示小时个位

disbuf[3]=minute/10;  //显示分十位

disbuf[4]=minute%10;  //显示分个位

disbuf[6]=second/10;  //显示秒十位

disbuf[7]=second%10;  //显示秒个位

}

}

//定时器T0中断服务子程序

void T0_isr() interrupt 1

{

TH0=0x3C;  //重写时间常数

TL0=0xb0;

t0n++;     //中断次加1

}

//外部中断INT0服务程序,调时状态下,加1

void INT0_ISR() interrupt 0

{

if(dis==1)     //调小时

{

hour++;    //小时加1

if(hour>=24)

hour=0;

}

if(dis==4)     //调分

{

minute++;  //分加1

if(minute>=60)

minute=0;

}

if(dis==7)     //调秒

{

second++;  //秒加1

if(second>=60)

second=0;

}

}

//外部中断INT1服务程序,调时状态下,减1

void INT1_ISR() interrupt 2

{

if(dis==1)   //调小时

{

hour--;  //小时减1

if(hour==0xff)

hour=23;

}

if(dis==4)    //调分

{

minute--; //分减1

if(minute==0xff)

minute=59;

}

if(dis==7)   //调秒

{

second--;//秒减1

if(second==0xff)

second=59;

}

}

以上就是关于单片机 keil,下边程序里的.h文件怎么编写啊全部的内容,包括:单片机 keil,下边程序里的.h文件怎么编写啊、谁能给我一段用单片机C语言超声波测距的程序,是让单片机输出一个40KHZ的方波脉冲 AT89S52,接发P1.0(1)、请问32位单片机中,那个内部中断和外部中断有什么区别,还有那个向量表如何使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10164037.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存