#include p18f452.inc
COUNT1 EQU 20H ;定义外部循环变量 COUNT1
COUNT2 EQU 21H ;定义内部循环变量 COUNT2
COUNT3 EQU 22H ;定义循环变量 COUNT3
AD_RESULTH EQU 23H ;存 A/D 转换结果高位
AD_RESULTL EQU 24H ;存 A/D 转换结果低位
RST code 0x0
goto Start
PGM code
Start
CALL INITIAL ;调初始化子程序
LOOP
CALL ADC ;调 A/D 转换子程序
CALL DELAY_100ms ;调 100ms 延时子程序
GOTO LOOP
INITIAL
MOVLW 0X8E ;设定 A/D 转换的输入端为 RA0,右对齐
MOVWF ADCON1 ;参考电压为电源电压
BSF TRISA,0 ;设 RA0 为输入
MOVLW 0xC1 ;
MOVWF ADCON0 ;选择模拟通道 AN0,系统时钟,开启 ADC 模块
RETURN
ADC
CALL DELAY_11us ;调 11us 延时子程序
BSF ADCON0, 0 ;打开 ADC
BSF ADCON0,2 ; 启动 A/D 转换
NEXT
BTFSC ADCON0,2 ;检查转换是否结束
GOTO NEXT
MOVF ADRESH,0 ;将转换结果高位存
MOVWF AD_RESULTH ;到 AD_STATUSH
MOVF ADRESL,0 ;将转换结果低位存
MOVWF AD_RESULTL ;
RETURN
DELAY_11us
MOVLW D'2' ;设置循环次数
MOVWF COUNT3
LOOP1
DECFSZ COUNT3 ,1 ;循环变量自减 1,为 0 则跳转
GOTO LOOP1
RETURN ;返回主程序
DELAY_100ms
MOVLW D'133' ;设置外部循环次数
MOVWF COUNT1 ;
LOOP2
MOVLW D'249' ;设置内部循环次数
MOVWF COUNT2 ;
LOOP3
DECFSZ COUNT2 ,1 ;内部循环变量自减 1,为 0 则跳转
GOTO LOOP3 ;
DECFSZ COUNT1,1 ;外部循环变量自减 1,为 0 则跳转
GOTO LOOP2
RETURN
END
#include p18f452.inc
COUNT EQU 0X30;节拍数 1-8,暂时不用
#define M_1 .116; 1879 个 1us,1879/16-1=116
#define M_2 .105; 1703
#define M_3 .94; 1517
#define M_4 .88; 1517
#define M_5 .79; 1432
#define M_6 .70; 1276
#define M_7 .62; 1012
RST code 0x0
goto Start
code 0x08
goto TMR1_INT
ORG 0x3000
DB M_1,M_2,M_3,M_4,M_5,M_6,M_7
PGM code
Start
MOVLW 0X30 ;分频器为 1:8,关闭 TMR1
MOVWF T1CON ;
BCF PIR1,TMR1IF ;溢出标志位清零
;31250*8us=250000us=0.25s
MOVLW 0xEE ;设定 TMR1 低位初值
MOVWF TMR1L ;
MOVLW 0x85 ;设定 TMR1 高位初值
MOVWF TMR1H
MOVLW 0x07 ;预分频 1:16,后预分频 1:1
MOVWF T2CON ;开定时器 2
MOVLW 0x0C ;PWM 方式,占空比分辨率无所谓
CLRF TRISD
BCF TRISC,2 ;CCP1 为输出状态
MOVLW 0x30
MOVWF TBLPTRH
MOVLW 0x00
MOVWF TBLPTRL
READ_WORD
TBLRD*+ ; read into TABLAT and increment
MOVF TABLAT, W ; get data
MOVWF PR2
RRCF W
MOVWF CCPR1L
BSF T1CON,0 ;启动 TMR1
BSF PIE1,TMR1IE ;启动 TMR1 中断
BSF INTCON,PEIE ;开启外设中断
BSF INTCON,GIE ;开启全局中断
Loop
goto Loop
TMR1_INT
BTFSS PIR1,TMR1IF ;判断是否是 TMR1 中断
GOTO JMP ;否,跳出中断
BCF PIR1,TMR1IF ;是,清中断标志位
MOVLW 0xEE ;设定 TMR1 低位初值
MOVWF TMR1L ;
MOVLW 0x85 ;设定 TMR1 高位初值
MOVWF TMR1H ;
TBLRD*+
MOVF TABLAT, W ; get data
MOVWF PR2
RRCF W
MOVWF CCPR1L
COMF PORTD
JMP
RETFIE
END
#include<p18f452.h>
#define SYS_FREQ (16000000ul)//系统时钟
#define OBJ_FREQ (250000ul)//设置输出频率为 0.25M
#define PR2_DATA ((SYS_FREQ/(OBJ_FREQ*4))-1)
//PWM 周期 = [(PR2)+1]*4*Tosc*(TMR2 预分频值)
#define CCPR1L_DUTY(duty) (((SYS_FREQ/OBJ_FREQ*duty)/100)>>2)
void PWM_Init(void);
void PWM_Set(void);
char g_Duty = 70;
void PWM_Init(void)
{ T2CON = 0X04; //--设置 CCP1 引脚为输出状态
TRISCbits.TRISC2 = 0;
INTCON = 0X00;
CCP1CON = 0X0F; }
void PWM_Set(void)
{ PR2 = PR2_DATA;
CCPR1L = CCPR1L_DUTY(g_Duty);}
void main()
{ TRISBbits.TRISB0 = 1;
PWM_Init();
PWM_Set();
while(1)
{} }
#include<p18f452.h>
#include <delays.h>
#include <stddef.h>
#include <stdlib.h>
void UART_Isr(void)
void UART_Init(void)
{ TRISC=0x80
TXSTA=0x24; //发送状态控制寄存器的设置 00100100 外部发送
同步脉冲在异步模式无意义、8 位、使能发送、异步模式、、16 分频、TSR
满、第九位无意义
RCSTA=0x80; //接受状态控制寄存器设置 10010000
SPBRG=103; //波特率设置
INTCONbits.GIE=1; //全局中断允许
INTCONbits.PEIE=1; //外设中断允许
PIE1bits.RCIE=1;//第一外设中断,串行通信接口发送中断使能}
int flag
void main(void)
{ UART_Init();
while(1)
{ TXREG=0x35;//将接收到的数据放入发送寄存器,并启动发送
while(!TXSTAbits.TRMT);
Delay1KTCYx(200);
TXREG=0x36; //将接收到的数据放入发送寄存器,并启动发送
while(!TXSTAbits.TRMT); //发送未完成
Delay1KTCYx(200);
TXREG=0x37; //将接收到的数据放入发送寄存器,并启动发送
while(!TXSTAbits.TRMT);
Delay1KTCYx(200);
TXREG=0x38; //将接收到的数据放入发送寄存器,并启动发送
while(!TXSTAbits.TRMT);
Delay1KTCYx(200);
TXREG=0x39; //将接收到的数据放入发送寄存器,并启动发送
while(!TXSTAbits.TRMT);
Delay1KTCYx(200); } }
#include p18F452.inc
D1 EQU 0x20
D2 EQU 0x21
RESULT EQU 0x22
RESULT_H EQU 0x30
RESULT_L EQU 0X40
ORG 0x0000
GOTO MAIN
ORG 0x0008
NOP
MAIN:
MOVLW 0xA0 ; 将操作数 1 设置为 0x10
MOVWF D1
MOVLW 0x05; 将操作数 2 设置为 0x20
MOVWF D2
; 执行乘法指令
MOVF D1, W ; 将操作数 1 读入 WREG
MULWF D2
; 将操作数 1 与操作数 2 相乘,
结果存放在 WREG 和 WREG+1 中
MOVWF RESULT
; 将乘法结果的低 8 位写入结果寄存器
MOVFF PRODL,RESULT_L;
MOVFF PRODH,RESULT_H;
; 停留在循环中
LOOP:
GOTO LOOP
END