学生做的动漫网站,搜索引擎排名优化亚当,网站采集注意,营销型网站重要性#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit PwmOut P1^0;//位定义脉宽调制输出为单片机P1.0脚
uchar PwmTimeCount;//声明脉宽调制时间计数变量
uchar PwmDutyCycle;//声明脉宽调制占空比变量
void Ti…
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit PwmOut P1^0;//位定义脉宽调制输出为单片机P1.0脚
uchar PwmTimeCount;//声明脉宽调制时间计数变量
uchar PwmDutyCycle;//声明脉宽调制占空比变量
void Timer0Init(void);//定时器0初始化函数
void Ext0Init();//外部中断0初始化函数void main(void)//主函数
{Ext0Init();//外部中断0初始化函数Timer0Init();//定时器0初始化函数 while(1)//主循环{}}void Ext0Init()//外部中断0初始化函数{ IT0 1;//设置Int0中断方式下降沿中断EX0 1;//设置Int0中断使能}/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为12T模式需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****//****时钟周期又称振荡周期单片机晶振频率的倒数 例单片机晶振频率12MHz 则时钟周期[1/(12*10^6)Hz]s0.000000083s0.000083ms0.083us机器周期单片机执行一条指令过程中需要完成一个基本操作如取指、译码、执行等基本操作所需的时间 8051系列单片机的一个机器周期由6个S周期状态周期组成 一个时钟周期定义为一个节拍用P表示 二个节拍定义为一个状态周期用S表示 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期6个状态周期12个时钟周期[12x[1/(12*10^6)Hz]s]s0.000001s0.001ms1us指令周期单片机取出一条指令且执行完这条指令所需的时间以上三者间的关系指令周期机器周期时钟周期通过特殊功能寄存器AUXR设定定时器/计数器模式为12T模式需12分频8051系列单片机定时器初值(定时计数初值)计算步骤如下(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算)1、一个机器周期12个时钟周期12乘以单片机晶振频率的倒数12*[1/(12*10^6)Hz]s0.000001s0.001ms1us2、定时时间定时计数*一个机器周期 1ms定时计数*1us 定时计数1ms/1us1000us/1us1000次3、定时器初值(定时计数初值)2^n-定时计数 n为几位定时器 此处n16 则定时器初值(定时计数初值)2^16-100065536-100064536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH00xfc或(65536-64536)/256 低八位放TL00x18或(65536-64536)%2564、综合公式定时器初值(定时计数初值)2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知定时时间1/定时频率1/1000Hz0.001s1ms1000us 进而可得定时器初值(定时计数初值)2^n-(晶振频率/几分频/定时频率)2^16-(12MHz/12/1KHz)2^16-(12*10^6)Hz/12/1000Hz)65536-100064536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH00xfc或(65536-64536)/256或Value 8 低八位放TL00x18或(65536-64536)%256或Value 5、TH0 Value 8;TL0 Value;该两句代码解释如下(1)、TH0 Value 8相当于TH0 (65536-10000)/25655536/256216.9375 分析65536-1000055536转化成二进制为11011000 11110000 55536/256216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)55536的二进制数11011000 11110000右移8位就可以得到55536/256216.9375的二进制数11011000(2)、TL0 Value相当于TL0 (65536-10000)%25655536%256240 分析65536-1000055536转化成二进制为11011000 11110000 55536%256240转化成二进制为11110000 由此可看出Value为(65536-10000)55536的二进制数11011000 11110000取低8位就可以得到55536%256240的二进制数11110000****/void Timer0Init(void)//定时器0定时100us初始化函数 晶振为12MHz{TMOD 0xf0;//设定定时器/计数器工作模式清0TMOD | 0x01;//设定定时器/计数器为定时器 工作模式为16位定时器0模式1TH0 0xff;//设定定时器0高8位初值 TL0 0x9c;//设定定时器0低8位初值TF0 0;//定时器0溢出中断标志位清0ET0 1;//打开定时器中断开关EA 1;//打开定时器中断总开关TR0 1//打开定时器0开关} void ExtInt0(void) interrupt 0//外部中断0中断函数 用一个按键连接单片机外部中断0引脚P3.0来按下弹起改变脉宽调制占空比{ PwmDutyCyle 10;//脉宽调制占空比自加10ifPwmDutyCyle 100)//如果脉宽调制占空比等于100PwmDutyCyle 0;//脉宽调制占空比清0}void Timer0(void) interrupt 1//定时器0定时100us中断函数 晶振为12MHz{TR0 0;//关定时器0开关PwmTimeCount;//脉宽调制时间计数自加 每加一次 脉宽调制周期为100usif(PwmTimeCount 100)//按100份来算 每份100us 总共100*100us10000us10ms0.01s 由此可得定时频率1/0.01s100Hz {PwmTimeCount 0;//脉宽调制时间计数清0}if(PwmTimeCount PwmDutyCycle)//如果脉宽调制时间计数小于等于脉宽调制占空比{PwmOut 1;//脉宽调制输出为高电平}else//否则{PwmOut 0;//脉宽调制输出为低电平}TH0 0xff;//设定定时器0高8位初值TL0 0x9c;//设定定时器0低8位初值TR0 1;//开定时器0开关}