设系统时钟fosc=12MHZ,试编写一段程序,其功能设为定时器T0为工作方式2,并产生400us定时,用中断方法,控制p1.1输出周期为4ms的方波
1条回答 默认 最新
- Wali_yiwa59418 2023-04-18 01:16关注
以下是该功能的程序代码:
#include <reg52.h> sbit P1_1 = P1^1; void timer0_init() { TMOD &= 0xF0; // 清空 Timer0 工作模式 TMOD |= 0x02; // 设置 Timer0 工作方式2(8位自动重装载定时器) TH0 = 0xFE; // 初始值设为 FE16(计数器为 256-254=2) TL0 = 0x62; TR0 = 1; // 启动定时器 ET0 = 1; // 使能 Timer0 中断 EA = 1; // 全局中断使能 } void timer0_isr() interrupt 1 { static unsigned int count = 0; TH0 = 0xFE; // 重新设置计数器初始值 TL0 = 0x62; count++; if (count == 10) { // 控制 P1.1 状态变化周期为 4ms P1_1 = ~P1_1; // 取反 P1.1 状态 count = 0; // 计数器清零 } } void main() { timer0_init(); // 初始化 Timer0 while(1) { // 程序运行到此,定时器中断将控制 P1.1 的状态变化 } }
程序的原理是利用 Timer0 的工作方式2,设定计时器初值为 FE16,每次计数到 0 就会自动重装载初始值,从而实现定时 400us 的功能。同时,在 Timer0 的中断服务程序中对 P1.1 状态进行周期性的取反操作,控制输出周期为 4ms 的方波。
解决 无用评论 打赏 举报
悬赏问题
- ¥15 在若依框架下实现人脸识别
- ¥15 网络科学导论,网络控制
- ¥100 安卓tv程序连接SQLSERVER2008问题
- ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
- ¥15 metadata提取的PDF元数据,如何转换为一个Excel
- ¥15 关于arduino编程toCharArray()函数的使用
- ¥100 vc++混合CEF采用CLR方式编译报错
- ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
- ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
- ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同