给每个问题一个最好的答案

最方便的ChatGpt使用方法

c语言怎么编写单片机的中断

请先 登录 后评论

1 个回答

好好 - 船长
舒绮烟说

给你上个较完整的程序,可以直接在KEIL中运行并观察输出/******************************************************************************功能:本程序在12M晶振模式下,通过定时器中断精确实现数字时钟计时操作,并在KEIL 中实现输出。时、分、秒的变化在定时中断里处理。说明:因采用工作方式2,自动装入初值,所以此程序计时很精确,只是在KEIL中模拟输 出显示的变化速度很快,这点可不理会******************************************************************************/#include#include#define TEST//此行用于KEIL输出显示,如果不需要显示可将其删除typedef unsigned char uchar;typedef unsigned int uint;#define TH0TL0_INIT (256-250) //定时器8位自动装入模式下寄存器初值,0.25ms中断一次char cHour;//时char cMin;//分char cSec;//秒uint iCount;//秒计数,计数达到4000时1s,4000*0.25ms =1000ms = 1s bitbSecChanged;//秒发生变化标志,每秒送一次输出显示,送显完成后清0,提高主程序效率//==============================================================================//T0定时器中断服务程序,12M晶振下每0.25ms产生中断,本程序执行一次//==============================================================================void Timer0() interrupt 1{iCount++;//秒计数值+1if(iCount==4000){//时间计数达到1SiCount = 0;//重新开始下一秒计数cSec++;//时钟:秒+1bSecChanged = 1;//置秒发生变化标志if(cSec==60){//计够60scSec = 0;//重新开始下一分计数cMin++;//时钟:分+1}if(cMin==60){//计够60分钟cMin = 0;//重新开始下一小时计数cHour++;//时钟:小时+1}if(cHour==24){//计够24小时cHour = 0;//重新开始第二天计数}}}//==============================================================================//主程序//==============================================================================void main(){ uchar outstr[10];//输出字符串,我的编译器可能有问题,直接输出有错 TMOD = 0X02;//工作方式2,8位自动重装计时模式TH0 = TH0TL0_INIT; //0.25ms中断一次TL0 = TH0TL0_INIT; //0.25ms中断一次#ifdef TEST SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD = 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */ TR1 = 1; /* TR1: timer 1 run */ TI = 1; /* TI: set TI to send first char of UART */#endifcHour = 0;//时cMin = 0;//分cSec = 0;//秒iCount = 0; //秒计数bSecChanged = 0;outstr[2] = ':';//时分分隔符outstr[5] = ':';//分秒分隔符outstr[8] = 0;//字符串结束符EA=1; //开总中断ET0=1; //允许T0中断TR0=1; //启动T0while(1){if(bSecChanged==1){//秒发生变化,将时间值转换为可显示字符串准备送显示bSecChanged = 0;//清除标志,节省CPU资源 outstr[0] = cHour/10 + 0x30;//将秒转换为ASCII码 outstr[1] = cHour%10 + 0x30; outstr[3] = cMin/10 + 0x30;//将分转换为ASCII码 outstr[4] = cMin%10 + 0x30; outstr[6] = cSec/10 + 0x30;//将小时转换为ASCII码 outstr[7] = cSec%10 + 0x30; #ifdef TEST printf(' %s ',outstr);//在KEIL中显示时钟#endif }}}

请先 登录 后评论
  • 26 关注
  • 0 收藏,352 浏览
  • 转转 提出于 2022-08-18 15:32