任务1:IO中断程序,实现LED灯的亮灭
1.编译图片:
2.IO口主要代码如下:
#include "io.h"
void P3_IO_Init(void)
{ P3IM0=0X00;
P3IM1=0X00;
P3INTE=0X08;
}
voidP3_IO_ISR(void) interrupt 40
{ u8 intf;
intf=P3INTF;
if(intf)
{
P3INTF=0;
if(intf&0x08)
{
P01=!P01;
}
}
P01=!P01;
}
3.学习视频:
任务2:实现按下P33口显示数字1,按下P47口显示数字2 :
1.编译图片:
2.主程序的代码:
#include "config.h"
#include "task.h"
#include "io.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay3000ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 17999998UL;
while (i) i--;
}
void main(void)
{
Sys_init(); //系统初始化
usb_init(); //USB CDC 接口配置
IE2 |= 0x80;
Timer0_Init();
Init_595();
//INT1_Init();
P3_IO_Init();
P4_IO_Init();
EA = 1;
P40 = 0;
while (DeviceState!=DEVSTATE_CONFIGURED);
while(1)
{
if (bUsbOutReady)
{
//USB_SendData(UsbOutBuffer,OutNumber);
usb_OUT_done();
}
Task_Pro_Handler_Callback(); //执行功能函数
passward=0;
}
}
void Timer0_Isr(void) interrupt 1 //1毫秒执行一次
{
Task_Marks_Handler_Callback (); //系统计时
}
3.学习视频:
任务3:实现P33,P47口的I0中断 ,P47口中断优先P33口中断:
1.编译图片:
2.IO的主要程序:
#include "io.h"
void P3_IO_Init(void)
{ P3IM0=0X00;
P3IM1=0Xff;
P3INTE=0X08;
}
voidP3_IO_ISR(void) interrupt 40
{ u8 intf;
intf=P3INTF;
if(intf)
{
P3INTF=0;
if(intf&0x08)
{
passward=1;
}
}
}
void P4_IO_Init(void)
{ P4IM0=0X00;
P4IM1=0Xff;
P4INTE=0X80;
PINIPH |=(1<<4);
PINIPL |=(1<<4);
}
voidP4_IO_ISR(void) interrupt 41
{ u8 intf;
intf=P4INTF;
if(intf)
{
P4INTF=0;
if(intf&0x80)
{
passward=2;
}
}
}
3.学习视频:
第十五集 定时器做计数器,已手敲代码,测试通过。
任务1:定时器1计数的程序:
10个脉冲中断一次,按下P35实现计数
1、编译图片:
2.主要代码:
#include "tim.h"
u32 Count_T1=0;
void TIM1_Count_Init(void)
{
T1_CT=1;
T1_M1=0;
T1_M0=0;
T1_GATE=0;
TH1=(65536-Count_num)>>8;
TL1=(65536-Count_num);
P3PU |= 0x20;
TR1=1;
ET1=1;
}
void Timer1_Isr(void) interrupt 3 //1毫秒执行一次
{
Count_T1 ++;
}
void T1_RunTask(void)
{
u32 count_th_t1=0;
count_th_t1=((u16)TH1<<8)+(u16)TL1;
count_th_t1-=65526;
SEG7_ShowLong(Count_T1 *Count_num+count_th_t1,10);
}
3.学习视频
任务2:编写INT1测量低电平时间
1.编译图片:
2.主要代码:
#include "tim.h"
u32 Count_T1=0;
void Timer1_Isr(void) interrupt 3
{ static u32 count_p33 =0;
if(P33==0)
{count_p33++;
}
else
{
if(count_p33>0)
{
Count_T1=count_p33;
}
count_p33=0;
}
}
void Timer1_Init(void) //100微秒@24.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x38; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //使能定时器1中断
}
void T1_RunTask(void)
{
SEG7_ShowString("%07.01f",((float)Count_T1)/10);
}
3.学习视频
第十六集 DS18B20测温,已手敲代码,测试通过
任务1:数码管显示室温,捏住测温传感器,温度逐渐上升
1.编译截图:(晶振需要选24MHZ)
2.主要代码:
#include "18B20.h"
u8 MinusFlag=0;
u32Temp_18b20;
void Delay480us(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 2878UL;
while (i) i--;
}
void Delay60us(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 358UL;
while (i) i--;
}
void Delay1us(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 4UL;
while (i) i--;
}
void DS18B20_Reset(void)
{
u8 flag=1;
while(flag)
{
DQ =0;
Delay480us();
DQ =1;
Delay60us();
flag=DQ;
Delay480us();
}
}
void DS18B20_Write_0(void)
{
DQ =0;
Delay60us();
DQ =1;
Delay1us();
Delay1us();
}
void DS18B20_Write_1(void)
{
DQ =0;
Delay1us();
Delay1us();
DQ =1;
Delay60us();
}
bit DS18B20_Read(void)
{
bit state=0;
DQ =0;
Delay1us();
Delay1us();
DQ =1;
Delay1us();
Delay1us();
state=DQ;
Delay60us();
return state;
}
void DS18B20_WriteByte( u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
if( dat& 0x01)
{
DS18B20_Write_1();
}
else
{
DS18B20_Write_0();
}
dat>>=1;
}
}
u8 DS18B20_ReadByte( void)
{
u8 i;
u8 dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
if( DS18B20_Read())
{
dat|=0x80;
}
else
{
}
}
return dat;
}
void DS18B20_ReadTemp(void)
{
u8 TempH=0;
u8 TempL=0;
u16 Temp=0;
DS18B20_Reset();
DS18B20_WriteByte(0xcc);
DS18B20_WriteByte(0x44);
while(!DQ);
DS18B20_Reset();
DS18B20_WriteByte(0xcc);
DS18B20_WriteByte(0xBE);
TempL = DS18B20_ReadByte();
TempH = DS18B20_ReadByte();
if(TempH&0x80)
{
MinusFlag=1;
Temp=(((u16)TempH<<8)|((u16)TempL<<0));
Temp=(~Temp)+1;
Temp_18b20=(u32)Temp*625;
}
else
{
MinusFlag=0;
Temp=(((u16)TempH<<8)|((u16)TempL<<0));
Temp_18b20=(u32)Temp*625;
}
}
3.学习视频:
第十六集 :串口的简单应用,已手敲代码,测试通过
1.发送OPEN\r\n打开数码管,数码管显示“----”
2.发送CLOSE\r\n打开数码管,数码管全部熄灭
1.编译图片:
2.主要程序代码:
#include "usart.h"
#include "io.h"
u8 Rec_Dat;//接收缓冲区
u8 Rec_Num=0; //接收计数
bit B_TX2_Busy=0;
void Uart2_Isr(void) interrupt 8
{
if (S2CON & 0x02) //检测串口2发送中断
{
S2CON &= ~0x02; //清除串口2发送中断请求位
B_TX2_Busy=0;
}
if (S2CON & 0x01) //检测串口2接收中断
{
S2CON &= ~0x01; //清除串口2接收中断请求位
//S2BUF
Rec_Dat=S2BUF;
}
}
void Uart2_Init(void) //9600bps@24.000MHz
{
P_SW2 |= 0x01; //UART2/USART2: RxD2(P4.6), TxD2(P4.7)
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x8F; //设置定时初始值
T2H = 0xFD; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x01; //使能串口2中断
Rec_Num=0;
B_TX2_Busy=0;
}
void Uart2_SendStr(u8 *puts) //串口数据发送函数
{
for(; *puts !=0;puts++) //遇到停止符0结束
{
S2BUF = *puts;
B_TX2_Busy=1;
while(B_TX2_Busy);
}
}
void Usart2_RunTask(void)
{
if(Rec_Num>=6) // 是否接收到了六位数据
{
if ((Rec_Dat=='\n') && (Rec_Dat=='\r'))//末尾判断
{
if((Rec_Dat=='O') && (Rec_Dat=='P') && (Rec_Dat=='E') && (Rec_Dat=='N'))
{
passward=16;
passward=16;
passward=16;
passward=16;
Uart2_SendStr("打开成功!\r\n");
}
else if((Rec_Dat=='C') && (Rec_Dat=='L') && (Rec_Dat=='O') && (Rec_Dat=='S')&& (Rec_Dat=='E'))
{
passward=17;
passward=17;
passward=17;
passward=17;
Uart2_SendStr("关闭成功!\r\n");
}
Rec_Num=0;
}
}
}
3.学习效果图:
页:
1
[2]