
库函数的源码你是看不到的。要找实现的话得去百度。自带的都是编译好的东西(用到时直接调用)不是原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位单片机中,那个内部中断和外部中断有什么区别,还有那个向量表如何使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)