本帖最后由 发烧友LV 于 2015-5-4 20:11 编辑
程序代码如下:
- #include <reg52.h>
- #include<stdlib.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar flag, a;
- uint Count = 0 ; //中断计数
- uint Direction = 0 ; //控制脉冲方向
- //uint ENA = 1 ;
- sbit PWM = P1^0;
- sbit ENA = P1^1;
- //sbit Direction = P1^2;
- /**********************初始化********************/
- void init(void) //串口中断初始化
- {
- /*(1)串口中断,在串行口工作于方式1和方式3时,由单片机的定时器T1作为波特率发生器。
- (2)定时器T0工作于方式1,即16位定时工作方式,用于产生PWM*/
- TMOD=0x21;
-
- /*******************************************************/
- SM0=0; //串行口工作方式1,功能:10位异步收发,波特率可变
- SM1=1;
- /*低8位计数器TL1与高8位计数器TH1装入同一个技术初值,这就是TH1和TL1相同的原因,改变该计数初值就可以在一定范围内改变波特率*/
- TH1=0xfd; //设置波特率为9600,12MHz实际上波特率为10416.67 bit/s
- TL1=0xfd;
-
- /******************定时器T0的定时初值******************/
- TH0=(65536-1000)/256; //1ms定时时间
- TL0=(65536-1000)%256;
-
- /**************定时/计数器控制寄存器TCON****************/
- TR0 = 1 ; //定时器T0开始定时
- TR1 = 1 ; //定时器T1开始定时
-
- /****************串行口控制寄存器SCON*****************/
- REN = 1; //允许串口接收数据
- /****************中断允许控制寄存器IE*****************/
- ET0 = 1 ; //允许定时器T0中断
- ES = 1; //允许串口中断
- EA = 1; //中断总控制位
- }
- /********************主函数***********************/
- void main(void)
- {
- init();
- while(1)
- {
- if(flag == 1) //串口有数据
- {
- ES = 0; //关闭串行中断
- flag = 0;
- ET0 = 1; //允许定时器T0中断
- ES=1; //允许串口中断
- }
- }
- }
- /*******************T0定时器*********************/
- void Timer0(void) interrupt 1
- {
- TH0 = (65536-1000)/256;
- TL0 = (65536-1000)%256;
- PWM = ~PWM;
- Count++;
- if(Count < a) ;
- else {
- Count = 0;
- ET0 = 0;
- }
- }
- /*******************串口中断*********************/
- void ser(void) interrupt 4
- {
- a = SBUF; //接受数据
- flag = 1; //标志位
- RI = 0; //软件清0
- }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>